module Language.Haskell.TH.Natural.Syntax.Datatype.Con.Record (
RecordConBuilder,
newRecordCon,
addField,
addField',
) where
import Control.Lens
import qualified Language.Haskell.TH as TH
import Language.Haskell.TH.Natural.Syntax.Builder
import Language.Haskell.TH.Natural.Syntax.Datatype.Internal
import Language.Haskell.TH.Syntax.ExtractedCons
type RecordConBuilder = ConstBuilder RecC
newRecordCon :: String -> RecordConBuilder () -> TH.Q RecC
newRecordCon :: String -> RecordConBuilder () -> Q RecC
newRecordCon String
conN RecordConBuilder ()
b = RecordConBuilder () -> RecC -> Q RecC
forall {k} (m :: * -> *) s (step :: k) (end :: k).
Monad m =>
BaseBuilder m s step end () -> s -> m s
runBaseBuilder RecordConBuilder ()
b (Name -> [VarBangType] -> RecC
MkRecC (String -> Name
TH.mkName String
conN) [])
addField :: String -> TH.Type -> RecordConBuilder ()
addField :: String -> Type -> RecordConBuilder ()
addField String
n Type
t = (String, Bang, Type) -> RecordConBuilder ()
addField' (String
n, Bang
defaultBang, Type
t)
addField' :: (String, TH.Bang, TH.Type) -> RecordConBuilder ()
addField' :: (String, Bang, Type) -> RecordConBuilder ()
addField' (String
n, Bang
b, Type
t) = ([VarBangType] -> Identity [VarBangType]) -> RecC -> Identity RecC
forall a b. HasVbts a b => Lens' a b
Lens' RecC [VarBangType]
vbts (([VarBangType] -> Identity [VarBangType])
-> RecC -> Identity RecC)
-> VarBangType -> RecordConBuilder ()
forall s (m :: * -> *) b a.
(MonadState s m, Snoc b b a a) =>
ASetter s s b b -> a -> m ()
|>= (String -> Name
TH.mkName String
n, Bang
b, Type
t)