polyglot-0.1.1.0: src/SyntaxTrees/Purescript/DataDef.hs
module SyntaxTrees.Purescript.DataDef where
import SyntaxTrees.Purescript.Common (Ctor, Var)
import SyntaxTrees.Purescript.Type (AnyKindedType, Type, TypeCtor, TypeParam,
showTypeNested)
import Utils.String (joinWords, str, wrapCurlyCsv, wrapSpaces)
data TypeDef
= TypeDef
{ alias :: TypeCtor
, typeParams :: [TypeParam]
, type' :: AnyKindedType
}
data NewTypeDef
= NewTypeDef
{ type' :: TypeCtor
, typeParams :: [TypeParam]
, ctor :: Ctor
, field :: FieldDef
}
data DataDef
= DataDef
{ type' :: TypeCtor
, typeParams :: [TypeParam]
, ctorDefs :: [DataCtorDef]
}
data DataCtorDef
= UnNamedFieldsCtor
{ ctor :: Ctor
, unnamedFields :: [UnNamedFieldDef]
}
| NamedFieldsCtor
{ ctor :: Ctor
, namedFields :: [NamedFieldDef]
}
data FieldDef
= UnNamedField UnNamedFieldDef
| NamedField NamedFieldDef
data UnNamedFieldDef
= UnNamedFieldDef
{ type' :: Type
}
data NamedFieldDef
= NamedFieldDef
{ name :: Var
, type' :: Type
}
instance Show TypeDef where
show (TypeDef x y z) =
joinWords ["type",
show x,
str " " y,
"=",
show z]
instance Show NewTypeDef where
show (NewTypeDef x y z t) =
joinWords ["newtype",
show x,
str " " y,
"=",
show z,
show t]
instance Show DataDef where
show (DataDef x y z) =
joinWords ["data",
show x,
str " " y,
"=",
str (wrapSpaces "|") z]
instance Show DataCtorDef where
show (UnNamedFieldsCtor x y) =
joinWords [show x,
str " " y]
show (NamedFieldsCtor x y) =
joinWords [show x,
wrapCurlyCsv y]
instance Show FieldDef where
show (UnNamedField x) = show x
show (NamedField x) = show x
instance Show UnNamedFieldDef where
show (UnNamedFieldDef x) = showTypeNested x
instance Show NamedFieldDef where
show (NamedFieldDef x y) =
joinWords [show x,
"::",
show y]