module DDC.Source.Tetra.Prim.TyConTetra
( kindTyConTetra
, readTyConTetra
, tRef)
where
import DDC.Source.Tetra.Prim.Base
import DDC.Type.Compounds
import DDC.Type.Exp
import DDC.Base.Pretty
import Data.Char
import Data.List
import Control.DeepSeq
instance NFData TyConTetra
instance Pretty TyConTetra where
ppr tc
= case tc of
TyConTetraRef -> text "Ref#"
TyConTetraTuple n -> text "Tuple" <> int n <> text "#"
readTyConTetra :: String -> Maybe TyConTetra
readTyConTetra str
| Just rest <- stripPrefix "Tuple" str
, (ds, "#") <- span isDigit rest
, not $ null ds
, arity <- read ds
= Just $ TyConTetraTuple arity
| otherwise
= case str of
"Ref#" -> Just TyConTetraRef
_ -> Nothing
kindTyConTetra :: TyConTetra -> Type Name
kindTyConTetra tc
= case tc of
TyConTetraRef -> kRegion `kFun` kData `kFun` kData
TyConTetraTuple n -> foldr kFun kData (replicate n kData)
tRef :: Region Name -> Type Name -> Type Name
tRef tR tA
= tApps (TCon (TyConBound (UPrim (NameTyConTetra TyConTetraRef) k) k))
[tR, tA]
where k = kRegion `kFun` kData `kFun` kData