template-haskell-natural-1.0.0.0
Safe HaskellNone
LanguageHaskell2010

Language.Haskell.TH.Natural.Syntax.Builder

Description

Builders allow building Template Haskell ASTs

Synopsis

Main Builders

type Builder = BaseBuilder Q :: Type -> k -> k -> Type -> Type Source #

Common type for anything that builds a TH AST.

type ConstBuilder s = BaseBuilder Q s 'Ready 'Ready Source #

Similar to Builder, but the state is always Ready

data BuilderStep Source #

Typically used a kinds to represent the progress of a Builder computation

Constructors

Empty

When the builder is not _ready_ to produce a valid AST (i.e. one of the fields is "empty")

Ready

The builder is ready to produce the AST

data BaseBuilder (m :: Type -> Type) s (prev :: k) (next :: k) a Source #

A computation that builds an object, the state

A graded state monad

Instances

Instances details
ConPatternBuilder PatternBuilder Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Case

Monad m => MonadReader s (BaseBuilder m s step step) Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Builder.Internal

Methods

ask :: BaseBuilder m s step step s #

local :: (s -> s) -> BaseBuilder m s step step a -> BaseBuilder m s step step a #

reader :: (s -> a) -> BaseBuilder m s step step a #

Monad m => MonadState s (BaseBuilder m s step step) Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Builder.Internal

Methods

get :: BaseBuilder m s step step s #

put :: s -> BaseBuilder m s step step () #

state :: (s -> (a, s)) -> BaseBuilder m s step step a #

ConPatternBuilder (ConMatchBuilder step step) Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Case

Methods

setFieldPattern :: Int -> Pat -> ConMatchBuilder step step () Source #

GenType (SignatureBuilder step 'Ready ()) Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Signature

Methods

genTy :: SignatureBuilder step 'Ready () -> Q Type Source #

Monad m => Applicative (BaseBuilder m s step step) Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Builder.Internal

Methods

pure :: a -> BaseBuilder m s step step a #

(<*>) :: BaseBuilder m s step step (a -> b) -> BaseBuilder m s step step a -> BaseBuilder m s step step b #

liftA2 :: (a -> b -> c) -> BaseBuilder m s step step a -> BaseBuilder m s step step b -> BaseBuilder m s step step c #

(*>) :: BaseBuilder m s step step a -> BaseBuilder m s step step b -> BaseBuilder m s step step b #

(<*) :: BaseBuilder m s step step a -> BaseBuilder m s step step b -> BaseBuilder m s step step a #

Functor m => Functor (BaseBuilder m s prev next) Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Builder.Internal

Methods

fmap :: (a -> b) -> BaseBuilder m s prev next a -> BaseBuilder m s prev next b #

(<$) :: a -> BaseBuilder m s prev next b -> BaseBuilder m s prev next a #

Monad m => Monad (BaseBuilder m s step step) Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Builder.Internal

Methods

(>>=) :: BaseBuilder m s step step a -> (a -> BaseBuilder m s step step b) -> BaseBuilder m s step step b #

(>>) :: BaseBuilder m s step step a -> BaseBuilder m s step step b -> BaseBuilder m s step step b #

return :: a -> BaseBuilder m s step step a #

MonadFail m => MonadFail (BaseBuilder m s step step) Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Builder.Internal

Methods

fail :: String -> BaseBuilder m s step step a #

(IsExprBuilder st, GenExpr (Definition st)) => GenExpr (Builder st step 'Ready ()) Source # 
Instance details

Defined in Language.Haskell.TH.Natural.Syntax.Expr.Untyped.Class

Methods

genExpr :: Builder st step 'Ready () -> Q Exp Source #

liftB :: forall {k} m a s (step :: k). Monad m => m a -> BaseBuilder m s step step a Source #

Lift a monadic computation in a builder

Base Builder

runBaseBuilder :: forall {k} m s (step :: k) (end :: k). Monad m => BaseBuilder m s step end () -> s -> m s Source #

Runs the BaseBuilder and returns the state

runBaseBuilder' :: forall {k} m s (step :: k) (end :: k) a. BaseBuilder m s step end a -> s -> m (a, s) Source #

Similar to runBaseBuilder, but also returns the value output by the computation

Utils

impure :: forall {k} (m :: Type -> Type) s (step :: k) a (next :: k). BaseBuilder m s step step a -> BaseBuilder m s step next a Source #

A safe way to cast the current step of the BaseBuilder when a computation is pure and does not explicitly changes the state of the BaseBuilder

Unsafe

unsafeWithState :: forall {k} s (m :: Type -> Type) a (prev :: k) (curr :: k). StateT s m a -> BaseBuilder m s prev curr a Source #

Allows accessing and modifying the state.

Using this to modify the state breaks the security provided by the type-level tracking of state.

unsafeCastStep :: forall {k1} {k2} (prev' :: k1) (curr' :: k1) (prev :: k2) (curr :: k2) (m :: Type -> Type) s a. BaseBuilder m s prev curr a -> BaseBuilder m s prev' curr' a Source #

Unsafely changes the state of the computation. Breaks the security provided by the type-level tracking of state.

Monad