module DDC.Core.Tetra.Prim.DaConTetra
( typeDaConTetra
, readDaConTetra)
where
import DDC.Core.Tetra.Prim.Base
import DDC.Core.Tetra.Prim.TyConTetra
import DDC.Core.Compounds.Annot
import DDC.Core.Exp.Simple
import DDC.Base.Pretty
import Control.DeepSeq
import Data.Char
import Data.List
instance NFData DaConTetra
instance Pretty DaConTetra where
ppr dc
= case dc of
DaConTetraTuple n -> text "T" <> int n <> text "#"
readDaConTetra :: String -> Maybe DaConTetra
readDaConTetra str
| Just rest <- stripPrefix "T" str
, (ds, "#") <- span isDigit rest
, not $ null ds
, arity <- read ds
= Just $ DaConTetraTuple arity
| otherwise
= Nothing
typeDaConTetra :: DaConTetra -> Type Name
typeDaConTetra (DaConTetraTuple n)
= tForalls (replicate n kData)
$ \args -> foldr tFun (tTupleN args) args