Generate generics-sop boilerplate for the given datatype.
This function takes the name of a datatype and generates:
a Code instance
a Generic instance
a HasDatatypeInfo instance
Note that the generated code will require the TypeFamilies and
DataKinds extensions to be enabled for the module.
Example: If you have the datatype
data Tree = Leaf Int | Node Tree Treeand say
deriveGeneric ''Treethen you get code that is equivalent to:
instance Generic Tree where
type Code Tree = '[ '[Int], '[Tree, Tree] ]
from (Leaf x) = SOP ( Z (I x :* Nil))
from (Node l r) = SOP (S (Z (I l :* I r :* Nil)))
to (SOP (Z (I x :* Nil))) = Leaf x
to (SOP (S (Z (I l :* I r :* Nil)))) = Node l r
to (SOP (S (S x))) = x `seq` error "inaccessible"
instance HasDatatypeInfo Tree where
type DatatypeInfoOf Tree =
T.ADT "Main" "Tree"
'[ T.Constructor "Leaf", T.Constructor "Node" ]
datatypeInfo _ =
T.demoteDatatypeInfo (Proxy :: Proxy (DatatypeInfoOf Tree))Limitations: Generation does not work for GADTs, for datatypes that involve existential quantification, for datatypes with unboxed fields.