module CAS.Dumb.Symbols.PatternGenerator where
import CAS.Dumb.Tree
import CAS.Dumb.Symbols
import Language.Haskell.TH
import Data.Char
makeSymbols :: Name
-> [Char]
-> DecsQ
makeSymbols t = makeQualifiedSymbols t ""
makeQualifiedSymbols
:: Name
-> String
-> [Char]
-> DecsQ
makeQualifiedSymbols casType namePrefix = fmap concat . mapM mkSymbol
where mkSymbol c
| isLower (head idfyer) = return
[ SigD symbName $ ForallT [PlainTV γ, PlainTV s¹, PlainTV s², PlainTV ζ] [] typeName
, ValD (VarP symbName)
(NormalB . AppE (ConE 'Symbol)
. AppE (ConE 'PrimitiveSymbol)
$ LitE (CharL c) )
[]
]
#if __GLASGOW_HASKELL__ > 801
| isUpper (head idfyer) = return
[ PatSynSigD symbName (ForallT [] [] $ ForallT [] [] typeName)
, PatSynD symbName
(PrefixPatSyn [])
ImplBidir
('Symbol `ConP` ['PrimitiveSymbol `ConP` [LitP $ CharL c]])
]
#endif
| otherwise = error
$ "Can only make symbols out of lower- or uppercase letters, which '"
++ [c] ++ "' is not."
where idfyer = namePrefix ++ [c]
symbName = mkName idfyer
typeName = ConT casType`AppT`VarT γ`AppT`VarT s²`AppT`VarT s¹`AppT`VarT ζ
[γ,s²,s¹,ζ] = mkName <$> ["γ","s²","s¹","ζ"]