module SyntaxTrees.Haskell.ClassDef where

import SyntaxTrees.Haskell.Common  (Class)
import SyntaxTrees.Haskell.DataDef (DerivingStrategy)
import SyntaxTrees.Haskell.FnDef   (FnDefOrSig)
import SyntaxTrees.Haskell.Type    (AnyKindedType, ClassConstraint, TypeParam)


data ClassDef
  = ClassDef
      { ClassDef -> [ClassConstraint]
constraints :: [ClassConstraint]
      , ClassDef -> Class
name        :: Class
      , ClassDef -> [TypeParam]
typeParams  :: [TypeParam]
      , ClassDef -> [FnDefOrSig]
defs        :: [FnDefOrSig]
      }
  deriving (Int -> ClassDef -> ShowS
[ClassDef] -> ShowS
ClassDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ClassDef] -> ShowS
$cshowList :: [ClassDef] -> ShowS
show :: ClassDef -> String
$cshow :: ClassDef -> String
showsPrec :: Int -> ClassDef -> ShowS
$cshowsPrec :: Int -> ClassDef -> ShowS
Show)

data InstanceDef
  = InstanceDef
      { InstanceDef -> [ClassConstraint]
constraints :: [ClassConstraint]
      , InstanceDef -> Class
class'      :: Class
      , InstanceDef -> [AnyKindedType]
types       :: [AnyKindedType]
      , InstanceDef -> [FnDefOrSig]
defs        :: [FnDefOrSig]
      }
  deriving (Int -> InstanceDef -> ShowS
[InstanceDef] -> ShowS
InstanceDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [InstanceDef] -> ShowS
$cshowList :: [InstanceDef] -> ShowS
show :: InstanceDef -> String
$cshow :: InstanceDef -> String
showsPrec :: Int -> InstanceDef -> ShowS
$cshowsPrec :: Int -> InstanceDef -> ShowS
Show)

data DerivingDef
  = DerivingDef
      { DerivingDef -> DerivingStrategy
strategy    :: DerivingStrategy
      , DerivingDef -> [ClassConstraint]
constraints :: [ClassConstraint]
      , DerivingDef -> Class
class'      :: Class
      , DerivingDef -> [AnyKindedType]
types       :: [AnyKindedType]
      , DerivingDef -> Maybe Class
derivingVia :: Maybe Class
      }
  deriving (Int -> DerivingDef -> ShowS
[DerivingDef] -> ShowS
DerivingDef -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [DerivingDef] -> ShowS
$cshowList :: [DerivingDef] -> ShowS
show :: DerivingDef -> String
$cshow :: DerivingDef -> String
showsPrec :: Int -> DerivingDef -> ShowS
$cshowsPrec :: Int -> DerivingDef -> ShowS
Show)