{-| High-level model of schema. -} module DomainCore.Model where import DomainCore.Prelude {-| Declaration of a type. -} data TypeDec = {-| Name of the type and its definition. -} TypeDec Text TypeDef deriving (Generic, Show, Eq, Ord, Lift) {-| Definition of a type. -} data TypeDef = {-| Sum. A list of pairs of names of its members (which will be mapped to constructors) and types which will populate the according constructors. -} SumTypeDef [(Text, [Type])] | {-| Product. Think of it as a record. Carries a list of associations of field names with types. -} ProductTypeDef [(Text, Type)] deriving (Generic, Show, Eq, Ord, Lift) {-| Type. -} data Type = {-| Fully applied tuple of the listed types. -} TupleType [Type] | {-| List of type applications. -} AppType (NonEmpty Type) | {-| List type with the type of its element. -} ListType Type | {-| Possibly qualified reference to another type. -} RefType Text deriving (Generic, Show, Eq, Ord, Lift)