polyglot-0.1.1.0: src/SyntaxTrees/Haskell/DataDef.hs
module SyntaxTrees.Haskell.DataDef where
import SyntaxTrees.Haskell.Common (Class, Ctor, Var)
import SyntaxTrees.Haskell.Type (AnyKindedType, Type, TypeCtor, TypeParam)
data TypeDef
= TypeDef
{ alias :: TypeCtor
, typeParams :: [TypeParam]
, type' :: AnyKindedType
}
deriving (Show)
data NewTypeDef
= NewTypeDef
{ type' :: TypeCtor
, typeParams :: [TypeParam]
, ctor :: Ctor
, field :: FieldDef
, deriving' :: [DerivingClause]
}
deriving (Show)
data DataDef
= DataDef
{ type' :: TypeCtor
, typeParams :: [TypeParam]
, ctorDefs :: [DataCtorDef]
, deriving' :: [DerivingClause]
}
deriving (Show)
data DataCtorDef
= UnNamedFieldsCtor
{ ctor :: Ctor
, unnamedFields :: [UnNamedFieldDef]
}
| NamedFieldsCtor
{ ctor :: Ctor
, namedFields :: [NamedFieldDef]
}
deriving (Show)
data FieldDef
= UnNamedField UnNamedFieldDef
| NamedField NamedFieldDef
deriving (Show)
data UnNamedFieldDef
= UnNamedFieldDef
{ type' :: Type
}
deriving (Show)
data NamedFieldDef
= NamedFieldDef
{ name :: Var
, type' :: Type
}
deriving (Show)
data DerivingClause
= Deriving DerivingStrategy [Class]
| DerivingVia [Class] AnyKindedType
deriving (Show)
data DerivingStrategy
= StandardDeriving
| NewTypeDeriving
| AnyClassDeriving
deriving (Eq, Show)
derivingClasses :: DerivingClause -> [(DerivingStrategy, Class)]
derivingClasses (Deriving x y) = (x,) <$> y
derivingClasses (DerivingVia x _) = (StandardDeriving,) <$> x