module Data.Packed.TH.Unpackable (genUnpackableInstance) where
import Data.Packed.TH.Flag (PackingFlag)
import Data.Packed.TH.Read
import Data.Packed.TH.Utils (resolveAppliedType)
import Data.Packed.Unpackable
import Language.Haskell.TH
genUnpackableInstance :: [PackingFlag] -> Name -> Q [Dec]
genUnpackableInstance :: [PackingFlag] -> Name -> Q [Dec]
genUnpackableInstance [PackingFlag]
flags Name
tyName = do
(resolvedType, typeParameterNames) <- Name -> Q (Type, [Name])
resolveAppliedType Name
tyName
constraints <- mapM (\Name
t -> [t|Unpackable $(Name -> Q Type
forall (m :: * -> *). Quote m => Name -> m Type
varT Name
t)|]) typeParameterNames
instanceType <- [t|Unpackable $(return resolvedType)|]
readerD <- genRead flags tyName
readerMethod <- funD 'reader [clause [] (normalB [|$(varE $ readFName tyName)|]) []]
return $
readerD
++ [ InstanceD
(Just Overlapping)
constraints
instanceType
[readerMethod]
]