module ProjectM36.DataConstructorDef where
import ProjectM36.Base as B
import qualified Data.Set as S

emptyDataConstructor :: DataConstructorName -> DataConstructorDef
emptyDataConstructor :: DataConstructorName -> DataConstructorDef
emptyDataConstructor DataConstructorName
name' = DataConstructorName
-> [DataConstructorDefArg] -> DataConstructorDef
DataConstructorDef DataConstructorName
name' []

name :: DataConstructorDef -> DataConstructorName
name :: DataConstructorDef -> DataConstructorName
name (DataConstructorDef DataConstructorName
name' [DataConstructorDefArg]
_) = DataConstructorName
name'

fields :: DataConstructorDef -> [DataConstructorDefArg]
fields :: DataConstructorDef -> [DataConstructorDefArg]
fields (DataConstructorDef DataConstructorName
_ [DataConstructorDefArg]
args) = [DataConstructorDefArg]
args

typeVars :: DataConstructorDef -> S.Set TypeVarName
typeVars :: DataConstructorDef -> Set DataConstructorName
typeVars (DataConstructorDef DataConstructorName
_ [DataConstructorDefArg]
tConsArgs) = [Set DataConstructorName] -> Set DataConstructorName
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
S.unions ([Set DataConstructorName] -> Set DataConstructorName)
-> [Set DataConstructorName] -> Set DataConstructorName
forall a b. (a -> b) -> a -> b
$ (DataConstructorDefArg -> Set DataConstructorName)
-> [DataConstructorDefArg] -> [Set DataConstructorName]
forall a b. (a -> b) -> [a] -> [b]
map DataConstructorDefArg -> Set DataConstructorName
typeVarsInDefArg [DataConstructorDefArg]
tConsArgs

typeVarsInDefArg :: DataConstructorDefArg -> S.Set TypeVarName
typeVarsInDefArg :: DataConstructorDefArg -> Set DataConstructorName
typeVarsInDefArg (DataConstructorDefTypeConstructorArg TypeConstructor
tCons) = TypeConstructor -> Set DataConstructorName
B.typeVars TypeConstructor
tCons
typeVarsInDefArg (DataConstructorDefTypeVarNameArg DataConstructorName
pVarName) = DataConstructorName -> Set DataConstructorName
forall a. a -> Set a
S.singleton DataConstructorName
pVarName