module DDC.Core.Flow.Prim.DaConFlow
        ( readDaConFlow
        , typeDaConFlow)
where
import DDC.Core.Flow.Prim.TyConFlow
import DDC.Core.Flow.Prim.Base
import DDC.Core.Exp.Simple
import DDC.Core.Compounds.Simple
import DDC.Base.Pretty
import Data.List
import Data.Char
import Control.DeepSeq


instance NFData DaConFlow

instance Pretty DaConFlow where
 ppr dc
  = case dc of
        DaConFlowTuple n
         -> text "T" <> int n <> text "#"


-- | Read a data constructor name.
readDaConFlow :: String -> Maybe DaConFlow
readDaConFlow str
        | Just rest     <- stripPrefix "T" str
        , (ds, "#")     <- span isDigit rest
        , not $ null ds
        , arity         <- read ds
        = Just $ DaConFlowTuple arity

        | otherwise
        = Nothing


-- | Yield the type of a data constructor.
typeDaConFlow :: DaConFlow -> Type Name
typeDaConFlow (DaConFlowTuple n)
        = tForalls (replicate n kData)
        $ \args -> foldr tFun (tTupleN args) args