packages feed

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