{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE FlexibleInstances #-}
module Data.Fmt.Functor (
Doc (..),
Tree,
) where
import Data.Fmt.Fixed (Mu, wrap)
import Data.String (IsString (..))
data Doc m ann r
=
Fail
|
Empty
|
Leaf !Int !m
|
Cat r r
|
Line
|
FlatAlt r r
|
Nest !Int r
|
Union r r
|
Ann ann r
|
Column (Int -> r)
|
Nesting (Int -> r)
deriving ((forall a b. (a -> b) -> Doc m ann a -> Doc m ann b)
-> (forall a b. a -> Doc m ann b -> Doc m ann a)
-> Functor (Doc m ann)
forall a b. a -> Doc m ann b -> Doc m ann a
forall a b. (a -> b) -> Doc m ann a -> Doc m ann b
forall m ann a b. a -> Doc m ann b -> Doc m ann a
forall m ann a b. (a -> b) -> Doc m ann a -> Doc m ann b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall m ann a b. (a -> b) -> Doc m ann a -> Doc m ann b
fmap :: forall a b. (a -> b) -> Doc m ann a -> Doc m ann b
$c<$ :: forall m ann a b. a -> Doc m ann b -> Doc m ann a
<$ :: forall a b. a -> Doc m ann b -> Doc m ann a
Functor)
type Tree m ann = Mu (Doc m ann)
instance Semigroup (Tree m ann) where
{-# INLINE (<>) #-}
Tree m ann
x <> :: Tree m ann -> Tree m ann -> Tree m ann
<> Tree m ann
y = Doc m ann (Tree m ann) -> Tree m ann
forall (f :: * -> *). Functor f => f (Mu f) -> Mu f
wrap (Tree m ann -> Tree m ann -> Doc m ann (Tree m ann)
forall m ann r. r -> r -> Doc m ann r
Cat Tree m ann
x Tree m ann
y)
instance Monoid (Tree m ann) where
{-# INLINE mempty #-}
mempty :: Tree m ann
mempty = Doc m ann (Tree m ann) -> Tree m ann
forall (f :: * -> *). Functor f => f (Mu f) -> Mu f
wrap Doc m ann (Tree m ann)
forall m ann r. Doc m ann r
Empty
instance IsString m => IsString (Tree m ann) where
{-# INLINE fromString #-}
fromString :: String -> Tree m ann
fromString String
s = Doc m ann (Tree m ann) -> Tree m ann
forall (f :: * -> *). Functor f => f (Mu f) -> Mu f
wrap (Int -> m -> Doc m ann (Tree m ann)
forall m ann r. Int -> m -> Doc m ann r
Leaf (String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s) (String -> m
forall a. IsString a => String -> a
fromString String
s))