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 "#" -- | Read the name of a baked-in data constructor. 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 -- | Yield the type of a baked-in data constructor. typeDaConTetra :: DaConTetra -> Type Name typeDaConTetra (DaConTetraTuple n) = tForalls (replicate n kData) $ \args -> foldr tFun (tTupleN args) args