module SyntaxTrees.Haskell.DataDef where

import SyntaxTrees.Haskell.Common (Class, Ctor, Var)
import SyntaxTrees.Haskell.Type   (AnyKindedType, Type, TypeCtor, TypeParam)


data TypeDef
  = TypeDef
      { TypeDef -> TypeCtor
alias      :: TypeCtor
      , TypeDef -> [TypeParam]
typeParams :: [TypeParam]
      , TypeDef -> AnyKindedType
type'      :: AnyKindedType
      }
  deriving (Int -> TypeDef -> ShowS
[TypeDef] -> ShowS
TypeDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [TypeDef] -> ShowS
$cshowList :: [TypeDef] -> ShowS
show :: TypeDef -> String
$cshow :: TypeDef -> String
showsPrec :: Int -> TypeDef -> ShowS
$cshowsPrec :: Int -> TypeDef -> ShowS
Show)

data NewTypeDef
  = NewTypeDef
      { NewTypeDef -> TypeCtor
type'      :: TypeCtor
      , NewTypeDef -> [TypeParam]
typeParams :: [TypeParam]
      , NewTypeDef -> Ctor
ctor       :: Ctor
      , NewTypeDef -> FieldDef
field      :: FieldDef
      , NewTypeDef -> [DerivingClause]
deriving'  :: [DerivingClause]
      }
  deriving (Int -> NewTypeDef -> ShowS
[NewTypeDef] -> ShowS
NewTypeDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NewTypeDef] -> ShowS
$cshowList :: [NewTypeDef] -> ShowS
show :: NewTypeDef -> String
$cshow :: NewTypeDef -> String
showsPrec :: Int -> NewTypeDef -> ShowS
$cshowsPrec :: Int -> NewTypeDef -> ShowS
Show)

data DataDef
  = DataDef
      { DataDef -> TypeCtor
type'      :: TypeCtor
      , DataDef -> [TypeParam]
typeParams :: [TypeParam]
      , DataDef -> [DataCtorDef]
ctorDefs   :: [DataCtorDef]
      , DataDef -> [DerivingClause]
deriving'  :: [DerivingClause]
      }
  deriving (Int -> DataDef -> ShowS
[DataDef] -> ShowS
DataDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DataDef] -> ShowS
$cshowList :: [DataDef] -> ShowS
show :: DataDef -> String
$cshow :: DataDef -> String
showsPrec :: Int -> DataDef -> ShowS
$cshowsPrec :: Int -> DataDef -> ShowS
Show)

data DataCtorDef
  = UnNamedFieldsCtor
      { DataCtorDef -> Ctor
ctor          :: Ctor
      , DataCtorDef -> [UnNamedFieldDef]
unnamedFields :: [UnNamedFieldDef]
      }
  | NamedFieldsCtor
      { ctor        :: Ctor
      , DataCtorDef -> [NamedFieldDef]
namedFields :: [NamedFieldDef]
      }
  deriving (Int -> DataCtorDef -> ShowS
[DataCtorDef] -> ShowS
DataCtorDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DataCtorDef] -> ShowS
$cshowList :: [DataCtorDef] -> ShowS
show :: DataCtorDef -> String
$cshow :: DataCtorDef -> String
showsPrec :: Int -> DataCtorDef -> ShowS
$cshowsPrec :: Int -> DataCtorDef -> ShowS
Show)

data FieldDef
  = UnNamedField UnNamedFieldDef
  | NamedField NamedFieldDef
  deriving (Int -> FieldDef -> ShowS
[FieldDef] -> ShowS
FieldDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FieldDef] -> ShowS
$cshowList :: [FieldDef] -> ShowS
show :: FieldDef -> String
$cshow :: FieldDef -> String
showsPrec :: Int -> FieldDef -> ShowS
$cshowsPrec :: Int -> FieldDef -> ShowS
Show)

data UnNamedFieldDef
  = UnNamedFieldDef
      { UnNamedFieldDef -> Type
type' :: Type
      }
  deriving (Int -> UnNamedFieldDef -> ShowS
[UnNamedFieldDef] -> ShowS
UnNamedFieldDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UnNamedFieldDef] -> ShowS
$cshowList :: [UnNamedFieldDef] -> ShowS
show :: UnNamedFieldDef -> String
$cshow :: UnNamedFieldDef -> String
showsPrec :: Int -> UnNamedFieldDef -> ShowS
$cshowsPrec :: Int -> UnNamedFieldDef -> ShowS
Show)

data NamedFieldDef
  = NamedFieldDef
      { NamedFieldDef -> Var
name  :: Var
      , NamedFieldDef -> Type
type' :: Type
      }
  deriving (Int -> NamedFieldDef -> ShowS
[NamedFieldDef] -> ShowS
NamedFieldDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [NamedFieldDef] -> ShowS
$cshowList :: [NamedFieldDef] -> ShowS
show :: NamedFieldDef -> String
$cshow :: NamedFieldDef -> String
showsPrec :: Int -> NamedFieldDef -> ShowS
$cshowsPrec :: Int -> NamedFieldDef -> ShowS
Show)

data DerivingClause
  = Deriving DerivingStrategy [Class]
  | DerivingVia [Class] AnyKindedType
  deriving (Int -> DerivingClause -> ShowS
[DerivingClause] -> ShowS
DerivingClause -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DerivingClause] -> ShowS
$cshowList :: [DerivingClause] -> ShowS
show :: DerivingClause -> String
$cshow :: DerivingClause -> String
showsPrec :: Int -> DerivingClause -> ShowS
$cshowsPrec :: Int -> DerivingClause -> ShowS
Show)

data DerivingStrategy
  = StandardDeriving
  | NewTypeDeriving
  | AnyClassDeriving
  deriving (DerivingStrategy -> DerivingStrategy -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: DerivingStrategy -> DerivingStrategy -> Bool
$c/= :: DerivingStrategy -> DerivingStrategy -> Bool
== :: DerivingStrategy -> DerivingStrategy -> Bool
$c== :: DerivingStrategy -> DerivingStrategy -> Bool
Eq, Int -> DerivingStrategy -> ShowS
[DerivingStrategy] -> ShowS
DerivingStrategy -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DerivingStrategy] -> ShowS
$cshowList :: [DerivingStrategy] -> ShowS
show :: DerivingStrategy -> String
$cshow :: DerivingStrategy -> String
showsPrec :: Int -> DerivingStrategy -> ShowS
$cshowsPrec :: Int -> DerivingStrategy -> ShowS
Show)


derivingClasses :: DerivingClause -> [(DerivingStrategy, Class)]
derivingClasses :: DerivingClause -> [(DerivingStrategy, Class)]
derivingClasses (Deriving DerivingStrategy
x [Class]
y)    = (DerivingStrategy
x,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Class]
y
derivingClasses (DerivingVia [Class]
x AnyKindedType
_) = (DerivingStrategy
StandardDeriving,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Class]
x