{-# Language DataKinds, DeriveDataTypeable, FlexibleContexts, FlexibleInstances,
             MultiParamTypeClasses, OverloadedStrings, StandaloneDeriving,
             TemplateHaskell, TypeFamilies, TypeOperators, UndecidableInstances #-}

-- | The types of nodes forming the Abstract Syntax Tree of the Haskell language with GHC extensions
module Language.Haskell.Extensions.AST (Language(Language),
                                        Export(..), Import(..), ImportItem(..), Members(..), ModuleMember(..),
                                        Declaration(..), DataConstructor(..), GADTConstructor(..),
                                        FunctionalDependency(..), PatternEquationClause(..),
                                        DerivingClause(..), DerivingStrategy(..),
                                        Expression(..), Pattern(..), PatternLHS(..), PatternEquationLHS(..),
                                        FieldBinding(..), FieldPattern(..),
                                        Statement(..), LambdaCasesAlternative(..),
                                        ClassInstanceLHS(..), Context(..),
                                        Type(..), TypeLHS(..), TypeVarBinding(..), TypeRole(..),
                                        Constructor(..), Value(..),
                                        CallSafety(..), CallingConvention(..),
                                        module Report) where

import Control.Monad (forM)
import qualified Data.List as List
import Data.List.NonEmpty (NonEmpty, toList)
import Data.Data (Data, Typeable)
import qualified Data.Kind as Kind
import Data.Text (Text)

import qualified Language.Haskell.Extensions as Extensions
import qualified Language.Haskell.Extensions.Abstract as Abstract
import qualified Language.Haskell.AST as Report
import Language.Haskell.AST (Module(..), EquationLHS(..), EquationRHS(..), GuardedExpression(..),
                             FieldDeclaration(..), CaseAlternative(..),
                             Associativity(..),
                             Name(..), ModuleName(..), QualifiedName(..),
                             ImportSpecification(..))
import qualified Rank2.TH
import qualified Transformation.Deep as Deep
import qualified Transformation.Deep.TH
import qualified Transformation.Shallow.TH

-- | The extended Haskell language node parameter type
data Language = Language deriving (Typeable Language
Typeable Language =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> Language -> c Language)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c Language)
-> (Language -> Constr)
-> (Language -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c Language))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language))
-> ((forall b. Data b => b -> b) -> Language -> Language)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> Language -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> Language -> r)
-> (forall u. (forall d. Data d => d -> u) -> Language -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> Language -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> Language -> m Language)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Language -> m Language)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> Language -> m Language)
-> Data Language
Language -> Constr
Language -> DataType
(forall b. Data b => b -> b) -> Language -> Language
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
forall u. (forall d. Data d => d -> u) -> Language -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Language -> c Language
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c Language
$ctoConstr :: Language -> Constr
toConstr :: Language -> Constr
$cdataTypeOf :: Language -> DataType
dataTypeOf :: Language -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c Language)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Language)
$cgmapT :: (forall b. Data b => b -> b) -> Language -> Language
gmapT :: (forall b. Data b => b -> b) -> Language -> Language
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Language -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> Language -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> Language -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Language -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Language -> m Language
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Language -> m Language
Data, Language -> Language -> Bool
(Language -> Language -> Bool)
-> (Language -> Language -> Bool) -> Eq Language
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Language -> Language -> Bool
== :: Language -> Language -> Bool
$c/= :: Language -> Language -> Bool
/= :: Language -> Language -> Bool
Eq, Int -> Language -> ShowS
[Language] -> ShowS
Language -> String
(Int -> Language -> ShowS)
-> (Language -> String) -> ([Language] -> ShowS) -> Show Language
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Language -> ShowS
showsPrec :: Int -> Language -> ShowS
$cshow :: Language -> String
show :: Language -> String
$cshowList :: [Language] -> ShowS
showList :: [Language] -> ShowS
Show)

type instance Abstract.ExtensionsSupportedBy Language = '[
   'Extensions.ExplicitNamespaces,
   'Extensions.ExtendedLiterals,
   'Extensions.MagicHash,
   'Extensions.NamedFieldPuns,
   'Extensions.ParallelListComprehensions,
   'Extensions.RecordWildCards,
   'Extensions.RecursiveDo,
   'Extensions.QualifiedDo,
   'Extensions.LambdaCase,
   'Extensions.ImplicitParameters,
   'Extensions.TupleSections,
   'Extensions.UnboxedSums,
   'Extensions.UnboxedTuples,
   'Extensions.InterruptibleFFI,
   'Extensions.CApiFFI,
   'Extensions.StrictData,
   'Extensions.Strict,
   'Extensions.BangPatterns,
   'Extensions.ViewPatterns,
   'Extensions.NPlusKPatterns,
   'Extensions.PatternSynonyms,
   'Extensions.NamedDefaults,
   'Extensions.StandaloneDeriving,
   'Extensions.DerivingStrategies,
   'Extensions.DerivingVia,
   'Extensions.DefaultSignatures,
   'Extensions.GADTs,
   'Extensions.TypeAbstractions,
   'Extensions.TypeData,
   'Extensions.FunctionalDependencies]

instance Abstract.ExtendedWith '[ 'Extensions.ExplicitNamespaces ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'ExplicitNamespaces] Language l d s
build = Abstract.ExplicitNamespacesConstruction {
      explicitlyNamespacedMemberList :: [ModuleMember Language] -> Members Language
Abstract.explicitlyNamespacedMemberList = SupportFor 'ExplicitNamespaces Language
-> [ModuleMember Language] -> Members Language
forall λ.
SupportFor 'ExplicitNamespaces λ -> [ModuleMember λ] -> Members λ
ExplicitlyNamespacedMemberList (),
      defaultMember :: Name Language -> ModuleMember Language
Abstract.defaultMember = Name Language -> ModuleMember Language
Name Language -> ModuleMember Language
forall λ. Name λ -> ModuleMember λ
DefaultMember,
      patternMember :: Name Language -> ModuleMember Language
Abstract.patternMember = Name Language -> ModuleMember Language
Name Language -> ModuleMember Language
forall λ. Name λ -> ModuleMember λ
PatternMember,
      typeMember :: Name Language -> ModuleMember Language
Abstract.typeMember = Name Language -> ModuleMember Language
Name Language -> ModuleMember Language
forall λ. Name λ -> ModuleMember λ
TypeMember,
      explicitTypeFixityDeclaration :: Associativity Language
-> Maybe Int
-> NonEmpty (Name Language)
-> Declaration Language l d s
Abstract.explicitTypeFixityDeclaration = SupportFor 'ExplicitNamespaces Language
-> Associativity Language
-> Maybe Int
-> NonEmpty (Name Language)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'ExplicitNamespaces λ
-> Associativity λ
-> Maybe Int
-> NonEmpty (Name λ)
-> Declaration λ l d s
ExplicitTypeFixityDeclaration (),
      explicitDataFixityDeclaration :: Associativity Language
-> Maybe Int
-> NonEmpty (Name Language)
-> Declaration Language l d s
Abstract.explicitDataFixityDeclaration = SupportFor 'ExplicitNamespaces Language
-> Associativity Language
-> Maybe Int
-> NonEmpty (Name Language)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'ExplicitNamespaces λ
-> Associativity λ
-> Maybe Int
-> NonEmpty (Name λ)
-> Declaration λ l d s
ExplicitDataFixityDeclaration (),
      explicitTypeExpression :: s (Type l l d d) -> Expression Language l d s
Abstract.explicitTypeExpression = SupportFor 'ExplicitNamespaces Language
-> s (Type l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'ExplicitNamespaces λ
-> s (Type l l d d) -> Expression λ l d s
ExplicitTypeExpression (),
      explicitTypePattern :: s (Type l l d d) -> Pattern Language l d s
Abstract.explicitTypePattern = SupportFor 'ExplicitNamespaces Language
-> s (Type l l d d) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'ExplicitNamespaces λ
-> s (Type l l d d) -> Pattern λ l d s
ExplicitTypePattern ()}

instance Abstract.ExtendedWith '[ 'Extensions.MagicHash ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'MagicHash] Language l d s
build = Abstract.MagicHashConstruction {
      hashLiteral' :: Value Language l d s -> Value Language l d s
Abstract.hashLiteral' = SupportFor 'MagicHash Language
-> Value Language l d s -> Value Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'MagicHash λ -> Value λ l d s -> Value λ l d s
HashLiteral ()}

instance Abstract.ExtendedWith '[ 'Extensions.NamedFieldPuns ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'NamedFieldPuns] Language l d s
build = Abstract.NamedFieldPunsConstruction {
      punnedFieldBinding' :: QualifiedName Language -> FieldBinding Language l d s
Abstract.punnedFieldBinding' = QualifiedName Language -> FieldBinding Language l d s
QualifiedName Language -> FieldBinding Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> FieldBinding λ l d s
PunnedFieldBinding,
      punnedFieldPattern' :: QualifiedName Language -> FieldPattern Language l d s
Abstract.punnedFieldPattern' = QualifiedName Language -> FieldPattern Language l d s
QualifiedName Language -> FieldPattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> FieldPattern λ l d s
PunnedFieldPattern}

instance Abstract.ExtendedWith '[ 'Extensions.ParallelListComprehensions ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'ParallelListComprehensions] Language l d s
build = Abstract.ParallelListComprehensionConstruction {
      parallelListComprehension' :: s (Expression l l d d)
-> NonEmpty (s (Statement l l d d))
-> NonEmpty (s (Statement l l d d))
-> [NonEmpty (s (Statement l l d d))]
-> Expression Language l d s
Abstract.parallelListComprehension' = s (Expression l l d d)
-> NonEmpty (s (Statement l l d d))
-> NonEmpty (s (Statement l l d d))
-> [NonEmpty (s (Statement l l d d))]
-> Expression Language l d s
s (Expression l l d d)
-> NonEmpty (s (Statement l l d d))
-> NonEmpty (s (Statement l l d d))
-> [NonEmpty (s (Statement l l d d))]
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d)
-> NonEmpty (s (Statement l l d d))
-> NonEmpty (s (Statement l l d d))
-> [NonEmpty (s (Statement l l d d))]
-> Expression λ l d s
ParallelListComprehension}

instance Abstract.ExtendedWith '[ 'Extensions.RecordWildCards ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'RecordWildCards] Language l d s
build = Abstract.RecordWildCardConstruction {
      wildcardRecordExpression' :: QualifiedName Language
-> [s (FieldBinding l l d d)] -> Expression Language l d s
Abstract.wildcardRecordExpression' = SupportFor 'RecordWildCards Language
-> QualifiedName Language
-> [s (FieldBinding l l d d)]
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'RecordWildCards λ
-> QualifiedName λ
-> [s (FieldBinding l l d d)]
-> Expression λ l d s
WildcardRecordExpression (),
      wildcardRecordPattern' :: QualifiedName Language
-> [s (FieldPattern l l d d)] -> Pattern Language l d s
Abstract.wildcardRecordPattern' = SupportFor 'RecordWildCards Language
-> QualifiedName Language
-> [s (FieldPattern l l d d)]
-> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'RecordWildCards λ
-> QualifiedName λ -> [s (FieldPattern l l d d)] -> Pattern λ l d s
WildcardRecordPattern ()}

instance Abstract.ExtendedWith '[ 'Extensions.RecursiveDo ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'RecursiveDo] Language l d s
build = Abstract.RecursiveDoConstruction {
      mdoExpression' :: s (GuardedExpression l l d d) -> Expression Language l d s
Abstract.mdoExpression' = s (GuardedExpression l l d d) -> Expression Language l d s
s (GuardedExpression l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (GuardedExpression l l d d) -> Expression λ l d s
MDoExpression,
      recursiveStatement' :: [s (Statement l l d d)] -> Statement Language l d s
Abstract.recursiveStatement' = [s (Statement l l d d)] -> Statement Language l d s
[s (Statement l l d d)] -> Statement Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Statement l l d d)] -> Statement λ l d s
RecursiveStatement}

instance Abstract.ExtendedWith '[ 'Extensions.QualifiedDo ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'QualifiedDo] Language l d s
build = Abstract.QualifiedDoConstruction {
      qualifiedDoExpression :: ModuleName Language
-> s (GuardedExpression l l d d) -> Expression Language l d s
Abstract.qualifiedDoExpression = SupportFor 'QualifiedDo Language
-> ModuleName Language
-> s (GuardedExpression l l d d)
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'QualifiedDo λ
-> ModuleName λ
-> s (GuardedExpression l l d d)
-> Expression λ l d s
QualifiedDoExpression ()}

instance Abstract.ExtendedWith '[ 'Extensions.QualifiedDo, 'Extensions.RecursiveDo ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'QualifiedDo, 'RecursiveDo] Language l d s
build = Abstract.QualifiedRecursiveDoConstruction {
      mdoQualifiedExpression :: ModuleName Language
-> s (GuardedExpression l l d d) -> Expression Language l d s
Abstract.mdoQualifiedExpression = SupportFor 'QualifiedDo Language
-> SupportFor 'RecursiveDo Language
-> ModuleName Language
-> s (GuardedExpression l l d d)
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'QualifiedDo λ
-> SupportFor 'RecursiveDo λ
-> ModuleName λ
-> s (GuardedExpression l l d d)
-> Expression λ l d s
MDoQualifiedExpression () ()}

instance Abstract.ExtendedWith '[ 'Extensions.LambdaCase ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'LambdaCase] Language l d s
build = Abstract.LambdaCaseConstruction {
      lambdaCaseExpression :: [s (CaseAlternative l l d d)] -> Expression Language l d s
Abstract.lambdaCaseExpression = SupportFor 'LambdaCase Language
-> [s (CaseAlternative l l d d)] -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'LambdaCase λ
-> [s (CaseAlternative l l d d)] -> Expression λ l d s
LambdaCaseExpression (),
      lambdaCasesExpression :: [s (LambdaCasesAlternative l l d d)] -> Expression Language l d s
Abstract.lambdaCasesExpression = SupportFor 'LambdaCase Language
-> [s (LambdaCasesAlternative l l d d)]
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'LambdaCase λ
-> [s (LambdaCasesAlternative l l d d)] -> Expression λ l d s
LambdaCasesExpression (),
      lambdaCasesAlternative :: [s (Pattern l l d d)]
-> s (EquationRHS l l d d) -> LambdaCasesAlternative Language l d s
Abstract.lambdaCasesAlternative = SupportFor 'LambdaCase Language
-> [s (Pattern l l d d)]
-> s (EquationRHS l l d d)
-> LambdaCasesAlternative Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'LambdaCase λ
-> [s (Pattern l l d d)]
-> s (EquationRHS l l d d)
-> LambdaCasesAlternative λ l d s
LambdaCasesAlternative ()}

instance Abstract.ExtendedWith '[ 'Extensions.TupleSections ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'TupleSections] Language l d s
build = Abstract.TupleSectionConstruction {
      tupleSectionExpression' :: NonEmpty (Maybe (s (Expression l l d d)))
-> Expression Language l d s
Abstract.tupleSectionExpression' = NonEmpty (Maybe (s (Expression l l d d)))
-> Expression Language l d s
NonEmpty (Maybe (s (Expression l l d d)))
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
NonEmpty (Maybe (s (Expression l l d d))) -> Expression λ l d s
TupleSectionExpression}

instance Abstract.ExtendedWith '[ 'Extensions.UnboxedTuples ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'UnboxedTuples] Language l d s
build = Abstract.UnboxedTuplesConstruction {
      unboxedTupleType :: NonEmpty (s (Type l l d d)) -> Type Language l d s
Abstract.unboxedTupleType = SupportFor 'UnboxedTuples Language
-> NonEmpty (s (Type l l d d)) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'UnboxedTuples λ
-> NonEmpty (s (Type l l d d)) -> Type λ l d s
UnboxedTupleType (),
      unboxedTupleConstructor :: Int -> Constructor Language l d s
Abstract.unboxedTupleConstructor = SupportFor 'UnboxedTuples Language
-> Int -> Constructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'UnboxedTuples λ -> Int -> Constructor λ l d s
UnboxedTupleConstructor (),
      unboxedTupleExpression :: NonEmpty (s (Expression l l d d)) -> Expression Language l d s
Abstract.unboxedTupleExpression = SupportFor 'UnboxedTuples Language
-> NonEmpty (s (Expression l l d d)) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'UnboxedTuples λ
-> NonEmpty (s (Expression l l d d)) -> Expression λ l d s
UnboxedTupleExpression (),
      unboxedTupleSectionExpression :: NonEmpty (Maybe (s (Expression l l d d)))
-> Expression Language l d s
Abstract.unboxedTupleSectionExpression = SupportFor 'UnboxedTuples Language
-> NonEmpty (Maybe (s (Expression l l d d)))
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'UnboxedTuples λ
-> NonEmpty (Maybe (s (Expression l l d d))) -> Expression λ l d s
UnboxedTupleSectionExpression (),
      unboxedTuplePattern :: NonEmpty (s (Pattern l l d d)) -> Pattern Language l d s
Abstract.unboxedTuplePattern = SupportFor 'UnboxedTuples Language
-> NonEmpty (s (Pattern l l d d)) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'UnboxedTuples λ
-> NonEmpty (s (Pattern l l d d)) -> Pattern λ l d s
UnboxedTuplePattern ()}

instance Abstract.ExtendedWith '[ 'Extensions.UnboxedSums ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'UnboxedSums] Language l d s
build = Abstract.UnboxedSumsConstruction {
      unboxedSumType :: NonEmpty (s (Type l l d d)) -> Type Language l d s
Abstract.unboxedSumType = SupportFor 'UnboxedSums Language
-> NonEmpty (s (Type l l d d)) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'UnboxedSums λ
-> NonEmpty (s (Type l l d d)) -> Type λ l d s
UnboxedSumType (),
      unboxedSumConstructor :: Int -> Constructor Language l d s
Abstract.unboxedSumConstructor = SupportFor 'UnboxedSums Language
-> Int -> Constructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'UnboxedSums λ -> Int -> Constructor λ l d s
UnboxedSumConstructor (),
      unboxedSumExpression :: Int -> s (Expression l l d d) -> Int -> Expression Language l d s
Abstract.unboxedSumExpression = SupportFor 'UnboxedSums Language
-> Int
-> s (Expression l l d d)
-> Int
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'UnboxedSums λ
-> Int -> s (Expression l l d d) -> Int -> Expression λ l d s
UnboxedSumExpression (),
      unboxedSumPattern :: Int -> s (Pattern l l d d) -> Int -> Pattern Language l d s
Abstract.unboxedSumPattern = SupportFor 'UnboxedSums Language
-> Int -> s (Pattern l l d d) -> Int -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'UnboxedSums λ
-> Int -> s (Pattern l l d d) -> Int -> Pattern λ l d s
UnboxedSumPattern ()}

instance Abstract.ExtendedWith '[ 'Extensions.ExtendedLiterals ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'ExtendedLiterals] Language l d s
build = Abstract.ExtendedLiteralsConstruction {
      extendedLiteral :: Integer -> Name Language -> Value Language l d s
Abstract.extendedLiteral = SupportFor 'ExtendedLiterals Language
-> Integer -> Name Language -> Value Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'ExtendedLiterals λ
-> Integer -> Name λ -> Value λ l d s
ExtendedLiteral ()}

instance Abstract.ExtendedWith '[ 'Extensions.InterruptibleFFI ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'InterruptibleFFI] Language l d s
build = Abstract.InterruptibleFFIConstruction {
      interruptibleCall :: CallSafety Language
Abstract.interruptibleCall = SupportFor 'InterruptibleFFI Language -> CallSafety Language
forall λ. SupportFor 'InterruptibleFFI λ -> CallSafety λ
InterruptibleCall ()}

instance Abstract.ExtendedWith '[ 'Extensions.CApiFFI ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'CApiFFI] Language l d s
build = Abstract.CApiFFIConstruction {
      cApiCall :: CallingConvention Language
Abstract.cApiCall = SupportFor 'CApiFFI Language -> CallingConvention Language
forall λ. SupportFor 'CApiFFI λ -> CallingConvention λ
CApiCall ()}

instance Abstract.ExtendedWith '[ 'Extensions.ImplicitParameters ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'ImplicitParameters] Language l d s
build = Abstract.ImplicitParametersConstruction {
      implicitParameterConstraint :: Name Language -> s (Type l l d d) -> Context Language l d s
Abstract.implicitParameterConstraint = SupportFor 'ImplicitParameters Language
-> Name Language -> s (Type l l d d) -> Context Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'ImplicitParameters λ
-> Name λ -> s (Type l l d d) -> Context λ l d s
ImplicitParameterConstraint (),
      implicitParameterDeclaration :: Name Language
-> s (Expression l l d d) -> Declaration Language l d s
Abstract.implicitParameterDeclaration = SupportFor 'ImplicitParameters Language
-> Name Language
-> s (Expression l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'ImplicitParameters λ
-> Name λ -> s (Expression l l d d) -> Declaration λ l d s
ImplicitParameterDeclaration (),
      implicitParameterExpression :: Name Language -> Expression Language l d s
Abstract.implicitParameterExpression = SupportFor 'ImplicitParameters Language
-> Name Language -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'ImplicitParameters λ -> Name λ -> Expression λ l d s
ImplicitParameterExpression ()}

instance Abstract.ExtendedWith '[ 'Extensions.StrictData ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'StrictData] Language l d s
build = Abstract.StrictDataConstruction {
      lazyType :: s (Type l l d d) -> Type Language l d s
Abstract.lazyType = SupportFor 'StrictData Language
-> s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'StrictData λ -> s (Type l l d d) -> Type λ l d s
LazyType ()}

instance Abstract.ExtendedWith '[ 'Extensions.Strict ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'Strict] Language l d s
build = Abstract.StrictConstruction {
      lazyPattern :: s (Pattern l l d d) -> Pattern Language l d s
Abstract.lazyPattern = SupportFor 'Strict Language
-> s (Pattern l l d d) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'Strict λ -> s (Pattern l l d d) -> Pattern λ l d s
LazyPattern ()}

instance Abstract.ExtendedWith '[ 'Extensions.BangPatterns ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'BangPatterns] Language l d s
build = Abstract.BangPatternConstruction {
      bangPattern :: s (Pattern l l d d) -> Pattern Language l d s
Abstract.bangPattern = SupportFor 'BangPatterns Language
-> s (Pattern l l d d) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'BangPatterns λ
-> s (Pattern l l d d) -> Pattern λ l d s
BangPattern ()}

instance Abstract.ExtendedWith '[ 'Extensions.ViewPatterns ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'ViewPatterns] Language l d s
build = Abstract.ViewPatternConstruction {
      viewPattern :: s (Expression l l d d)
-> s (Pattern l l d d) -> Pattern Language l d s
Abstract.viewPattern = SupportFor 'ViewPatterns Language
-> s (Expression l l d d)
-> s (Pattern l l d d)
-> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'ViewPatterns λ
-> s (Expression l l d d) -> s (Pattern l l d d) -> Pattern λ l d s
ViewPattern ()}

instance Abstract.ExtendedWith '[ 'Extensions.NPlusKPatterns ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'NPlusKPatterns] Language l d s
build = Abstract.NPlusKPatternConstruction {
      nPlusKPattern :: Name Language -> Integer -> Pattern Language l d s
Abstract.nPlusKPattern = SupportFor 'NPlusKPatterns Language
-> Name Language -> Integer -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'NPlusKPatterns λ
-> Name λ -> Integer -> Pattern λ l d s
NPlusKPattern ()}

instance Abstract.ExtendedWith '[ 'Extensions.PatternSynonyms ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'PatternSynonyms] Language l d s
build = Abstract.PatternSynonymConstruction {
      exportPattern :: QualifiedName Language -> Export Language l d s
Abstract.exportPattern = QualifiedName Language -> Export Language l d s
QualifiedName Language -> Export Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> Export λ l d s
ExportPattern,
      importPattern :: Name Language -> ImportItem Language l d s
Abstract.importPattern = Name Language -> ImportItem Language l d s
Name Language -> ImportItem Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> ImportItem λ l d s
ImportPattern,
      allMembersPlus :: [Name Language] -> Members Language
Abstract.allMembersPlus = [Name Language] -> Members Language
[Name Language] -> Members Language
forall λ. [Name λ] -> Members λ
AllMembersPlus,
      prefixPatternLHS :: Name Language -> [Name Language] -> PatternLHS Language l d s
Abstract.prefixPatternLHS = Name Language -> [Name Language] -> PatternLHS Language l d s
Name Language -> [Name Language] -> PatternLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> [Name λ] -> PatternLHS λ l d s
PrefixPatternLHS,
      infixPatternLHS :: Name Language
-> Name Language -> Name Language -> PatternLHS Language l d s
Abstract.infixPatternLHS = Name Language
-> Name Language -> Name Language -> PatternLHS Language l d s
Name Language
-> Name Language -> Name Language -> PatternLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> Name λ -> Name λ -> PatternLHS λ l d s
InfixPatternLHS,
      recordPatternLHS :: Name Language -> [Name Language] -> PatternLHS Language l d s
Abstract.recordPatternLHS = Name Language -> [Name Language] -> PatternLHS Language l d s
Name Language -> [Name Language] -> PatternLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> [Name λ] -> PatternLHS λ l d s
RecordPatternLHS,
      prefixPatternEquationLHS :: Name Language
-> [s (Pattern l l d d)] -> PatternEquationLHS Language l d s
Abstract.prefixPatternEquationLHS = Name Language
-> [s (Pattern l l d d)] -> PatternEquationLHS Language l d s
Name Language
-> [s (Pattern l l d d)] -> PatternEquationLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> [s (Pattern l l d d)] -> PatternEquationLHS λ l d s
PrefixPatternEquationLHS,
      infixPatternEquationLHS :: s (Pattern l l d d)
-> Name Language
-> s (Pattern l l d d)
-> PatternEquationLHS Language l d s
Abstract.infixPatternEquationLHS = s (Pattern l l d d)
-> Name Language
-> s (Pattern l l d d)
-> PatternEquationLHS Language l d s
s (Pattern l l d d)
-> Name Language
-> s (Pattern l l d d)
-> PatternEquationLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Pattern l l d d)
-> Name λ -> s (Pattern l l d d) -> PatternEquationLHS λ l d s
InfixPatternEquationLHS,
      patternEquationClause :: Supports 'PatternSynonyms Language =>
s (PatternEquationLHS l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> PatternEquationClause Language l d s
Abstract.patternEquationClause = SupportFor 'PatternSynonyms Language
-> s (PatternEquationLHS l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> PatternEquationClause Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'PatternSynonyms λ
-> s (PatternEquationLHS l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> PatternEquationClause λ l d s
PatternEquationClause (),
      implicitPatternSynonym :: Supports 'PatternSynonyms Language =>
s (PatternLHS l l d d)
-> s (Pattern l l d d) -> Declaration Language l d s
Abstract.implicitPatternSynonym = SupportFor 'PatternSynonyms Language
-> s (PatternLHS l l d d)
-> s (Pattern l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'PatternSynonyms λ
-> s (PatternLHS l l d d)
-> s (Pattern l l d d)
-> Declaration λ l d s
ImplicitPatternSynonym (),
      unidirectionalPatternSynonym :: Supports 'PatternSynonyms Language =>
s (PatternLHS l l d d)
-> s (Pattern l l d d) -> Declaration Language l d s
Abstract.unidirectionalPatternSynonym = SupportFor 'PatternSynonyms Language
-> s (PatternLHS l l d d)
-> s (Pattern l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'PatternSynonyms λ
-> s (PatternLHS l l d d)
-> s (Pattern l l d d)
-> Declaration λ l d s
UnidirectionalPatternSynonym (),
      explicitPatternSynonym :: Supports 'PatternSynonyms Language =>
s (PatternLHS l l d d)
-> s (Pattern l l d d)
-> [s (PatternEquationClause l l d d)]
-> Declaration Language l d s
Abstract.explicitPatternSynonym = SupportFor 'PatternSynonyms Language
-> s (PatternLHS l l d d)
-> s (Pattern l l d d)
-> [s (PatternEquationClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'PatternSynonyms λ
-> s (PatternLHS l l d d)
-> s (Pattern l l d d)
-> [s (PatternEquationClause l l d d)]
-> Declaration λ l d s
ExplicitPatternSynonym (),
      patternSynonymSignature :: Supports 'PatternSynonyms Language =>
NonEmpty (Name Language)
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> [s (Type l l d d)]
-> s (Type l l d d)
-> Declaration Language l d s
Abstract.patternSynonymSignature = SupportFor 'PatternSynonyms Language
-> NonEmpty (Name Language)
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> [s (Type l l d d)]
-> s (Type l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'PatternSynonyms λ
-> NonEmpty (Name λ)
-> [TypeVarBinding λ l d s]
-> s (Context l l d d)
-> [TypeVarBinding λ l d s]
-> s (Context l l d d)
-> [s (Type l l d d)]
-> s (Type l l d d)
-> Declaration λ l d s
PatternSynonymSignature ()}

instance Abstract.ExtendedWith '[ 'Extensions.NamedDefaults ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'NamedDefaults] Language l d s
build = Abstract.NamedDefaultsConstruction {
      namedDefaultDeclaration :: QualifiedName Language
-> [s (Type l l d d)] -> Declaration Language l d s
Abstract.namedDefaultDeclaration = SupportFor 'NamedDefaults Language
-> QualifiedName Language
-> [s (Type l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'NamedDefaults λ
-> QualifiedName λ -> [s (Type l l d d)] -> Declaration λ l d s
NamedDefaultDeclaration ()}

instance Abstract.ExtendedWith '[ 'Extensions.StandaloneDeriving ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'StandaloneDeriving] Language l d s
build = Abstract.StandaloneDerivingConstruction {
      standaloneDerivingDeclaration :: [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Declaration Language l d s
Abstract.standaloneDerivingDeclaration = SupportFor 'StandaloneDeriving Language
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'StandaloneDeriving λ
-> [TypeVarBinding λ l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Declaration λ l d s
StandaloneDerivingDeclaration ()}

instance Abstract.ExtendedWith '[ 'Extensions.DerivingStrategies ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'DerivingStrategies] Language l d s
build = Abstract.DerivingStrategiesConstruction {
      defaultStrategy :: DerivingStrategy Language l d s
Abstract.defaultStrategy = DerivingStrategy Language l d s
DerivingStrategy Language l d s
forall λ l (d :: * -> *) (s :: * -> *). DerivingStrategy λ l d s
Default,
      stockStrategy :: DerivingStrategy Language l d s
Abstract.stockStrategy = DerivingStrategy Language l d s
DerivingStrategy Language l d s
forall λ l (d :: * -> *) (s :: * -> *). DerivingStrategy λ l d s
Stock,
      newtypeStrategy :: DerivingStrategy Language l d s
Abstract.newtypeStrategy = DerivingStrategy Language l d s
DerivingStrategy Language l d s
forall λ l (d :: * -> *) (s :: * -> *). DerivingStrategy λ l d s
Newtype,
      anyClassStrategy :: DerivingStrategy Language l d s
Abstract.anyClassStrategy = DerivingStrategy Language l d s
DerivingStrategy Language l d s
forall λ l (d :: * -> *) (s :: * -> *). DerivingStrategy λ l d s
AnyClass,
      strategicDerive :: s (DerivingStrategy l l d d)
-> [s (Type l l d d)] -> DerivingClause Language l d s
Abstract.strategicDerive = SupportFor 'DerivingStrategies Language
-> s (DerivingStrategy l l d d)
-> [s (Type l l d d)]
-> DerivingClause Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'DerivingStrategies λ
-> s (DerivingStrategy l l d d)
-> [s (Type l l d d)]
-> DerivingClause λ l d s
StrategicDerive (),
      standaloneStrategicDerivingDeclaration :: Supports 'StandaloneDeriving Language =>
s (DerivingStrategy l l d d)
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Declaration Language l d s
Abstract.standaloneStrategicDerivingDeclaration = SupportFor 'StandaloneDeriving Language
-> SupportFor 'DerivingStrategies Language
-> s (DerivingStrategy l l d d)
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'StandaloneDeriving λ
-> SupportFor 'DerivingStrategies λ
-> s (DerivingStrategy l l d d)
-> [TypeVarBinding λ l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Declaration λ l d s
StandaloneStrategicDerivingDeclaration () ()}

instance Abstract.ExtendedWith '[ 'Extensions.DerivingVia ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'DerivingVia] Language l d s
build = Abstract.DerivingViaConstruction {
      derivingViaStrategy :: s (Type l l d d) -> DerivingStrategy Language l d s
Abstract.derivingViaStrategy = SupportFor 'DerivingVia Language
-> s (Type l l d d) -> DerivingStrategy Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'DerivingVia λ
-> s (Type l l d d) -> DerivingStrategy λ l d s
Via (),
      deriveVia :: [s (Type l l d d)]
-> s (Type l l d d) -> DerivingClause Language l d s
Abstract.deriveVia = SupportFor 'DerivingVia Language
-> [s (Type l l d d)]
-> s (Type l l d d)
-> DerivingClause Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'DerivingVia λ
-> [s (Type l l d d)] -> s (Type l l d d) -> DerivingClause λ l d s
DeriveVia ()}

instance Abstract.ExtendedWith '[ 'Extensions.DefaultSignatures ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'DefaultSignatures] Language l d s
build = Abstract.DefaultSignatureConstruction {
      defaultMethodSignature :: Name Language
-> s (Context l l d d)
-> s (Type l l d d)
-> Declaration Language l d s
Abstract.defaultMethodSignature = SupportFor 'DefaultSignatures Language
-> Name Language
-> s (Context l l d d)
-> s (Type l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'DefaultSignatures λ
-> Name λ
-> s (Context l l d d)
-> s (Type l l d d)
-> Declaration λ l d s
DefaultMethodSignature ()}

instance Abstract.ExtendedWith '[ 'Extensions.TypeData ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'TypeData] Language l d s
build = Abstract.TypeDataConstruction {
      typeDataDeclaration :: s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> Declaration Language l d s
Abstract.typeDataDeclaration = SupportFor 'TypeData Language
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'TypeData λ
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> Declaration λ l d s
TypeDataDeclaration ()}

instance Abstract.ExtendedWith '[ 'Extensions.GADTs, 'Extensions.TypeData ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'GADTs, 'TypeData] Language l d s
build = Abstract.TypeGADTConstruction {
      typeGADTDeclaration :: s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> Declaration Language l d s
Abstract.typeGADTDeclaration = SupportFor 'GADTs Language
-> SupportFor 'TypeData Language
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'GADTs λ
-> SupportFor 'TypeData λ
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> Declaration λ l d s
TypeGADTDeclaration () ()}

instance Abstract.ExtendedWith '[ 'Extensions.TypeAbstractions ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'TypeAbstractions] Language l d s
build = Abstract.TypeAbstractionConstruction {
      typeLHSTypeApplication :: s (TypeLHS l l d d)
-> TypeVarBinding Language l d s -> TypeLHS Language l d s
Abstract.typeLHSTypeApplication = SupportFor 'TypeAbstractions Language
-> s (TypeLHS l l d d)
-> TypeVarBinding Language l d s
-> TypeLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'TypeAbstractions λ
-> s (TypeLHS l l d d) -> TypeVarBinding λ l d s -> TypeLHS λ l d s
TypeLHSTypeApplication (),
      invisibleTypePattern :: s (Type l l d d) -> Pattern Language l d s
Abstract.invisibleTypePattern = SupportFor 'TypeAbstractions Language
-> s (Type l l d d) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'TypeAbstractions λ
-> s (Type l l d d) -> Pattern λ l d s
InvisibleTypePattern ()}

instance Abstract.ExtendedWith '[ 'Extensions.FunctionalDependencies ] Language where
   build :: forall l (d :: * -> *) (s :: * -> *).
Construct '[ 'FunctionalDependencies] Language l d s
build = Abstract.FunctionalDependenciesConstruction {
      functionalDependency :: [Name Language]
-> [Name Language] -> FunctionalDependency Language l d s
Abstract.functionalDependency = [Name Language]
-> [Name Language] -> FunctionalDependency Language l d s
[Name Language]
-> [Name Language] -> FunctionalDependency Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[Name λ] -> [Name λ] -> FunctionalDependency λ l d s
FunctionalDependency,
      fundepClassDeclaration :: s (Context l l d d)
-> s (TypeLHS l l d d)
-> [s (FunctionalDependency l l d d)]
-> [s (Declaration l l d d)]
-> Declaration Language l d s
Abstract.fundepClassDeclaration = SupportFor 'FunctionalDependencies Language
-> s (Context l l d d)
-> s (TypeLHS l l d d)
-> [s (FunctionalDependency l l d d)]
-> [s (Declaration l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
SupportFor 'FunctionalDependencies λ
-> s (Context l l d d)
-> s (TypeLHS l l d d)
-> [s (FunctionalDependency l l d d)]
-> [s (Declaration l l d d)]
-> Declaration λ l d s
FunDepClassDeclaration ()}

type instance Abstract.FunctionalDependency Language = FunctionalDependency Language
type instance Abstract.LambdaCasesAlternative Language = LambdaCasesAlternative Language
type instance Abstract.DerivingStrategy Language = DerivingStrategy Language
type instance Abstract.PatternLHS Language = PatternLHS Language
type instance Abstract.PatternEquationLHS Language = PatternEquationLHS Language
type instance Abstract.PatternEquationClause Language = PatternEquationClause Language

instance Abstract.ExtendedHaskell Language where
   type GADTConstructor Language = GADTConstructor Language
   type Kind Language = Type Language
   type TypeVarBinding Language = TypeVarBinding Language
   type ModuleMember Language = ModuleMember Language
   type TypeRole Language = TypeRole Language
   multiWayIfExpression :: forall (s :: * -> *) l (d :: * -> *).
[s (GuardedExpression l l d d)] -> Expression Language l d s
multiWayIfExpression = [s (GuardedExpression l l d d)] -> Expression Language l d s
[s (GuardedExpression l l d d)] -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (GuardedExpression l l d d)] -> Expression λ l d s
MultiWayIfExpression
   safeImportDeclaration :: forall (s :: * -> *) l (d :: * -> *).
Bool
-> ModuleName Language
-> Maybe (ModuleName Language)
-> Maybe (s (ImportSpecification l l d d))
-> Import Language l d s
safeImportDeclaration Bool
q = Bool
-> Bool
-> Maybe Text
-> ModuleName Language
-> Maybe (ModuleName Language)
-> Maybe (s (ImportSpecification l l d d))
-> Import Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool
-> Bool
-> Maybe Text
-> ModuleName λ
-> Maybe (ModuleName λ)
-> Maybe (s (ImportSpecification l l d d))
-> Import λ l d s
Import Bool
True Bool
q Maybe Text
forall a. Maybe a
Nothing 
   packageQualifiedImportDeclaration :: forall (s :: * -> *) l (d :: * -> *).
Bool
-> Text
-> ModuleName Language
-> Maybe (ModuleName Language)
-> Maybe (s (ImportSpecification l l d d))
-> Import Language l d s
packageQualifiedImportDeclaration Bool
q Text
p = Bool
-> Bool
-> Maybe Text
-> ModuleName Language
-> Maybe (ModuleName Language)
-> Maybe (s (ImportSpecification l l d d))
-> Import Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool
-> Bool
-> Maybe Text
-> ModuleName λ
-> Maybe (ModuleName λ)
-> Maybe (s (ImportSpecification l l d d))
-> Import λ l d s
Import Bool
False Bool
q (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
p)
   safePackageQualifiedImportDeclaration :: forall (s :: * -> *) l (d :: * -> *).
Bool
-> Text
-> ModuleName Language
-> Maybe (ModuleName Language)
-> Maybe (s (ImportSpecification l l d d))
-> Import Language l d s
safePackageQualifiedImportDeclaration Bool
q Text
p = Bool
-> Bool
-> Maybe Text
-> ModuleName Language
-> Maybe (ModuleName Language)
-> Maybe (s (ImportSpecification l l d d))
-> Import Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool
-> Bool
-> Maybe Text
-> ModuleName λ
-> Maybe (ModuleName λ)
-> Maybe (s (ImportSpecification l l d d))
-> Import λ l d s
Import Bool
True Bool
q (Text -> Maybe Text
forall a. a -> Maybe a
Just Text
p)
   infixTypeApplication :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d)
-> QualifiedName Language
-> s (Type l l d d)
-> Type Language l d s
infixTypeApplication = s (Type l l d d)
-> QualifiedName Language
-> s (Type l l d d)
-> Type Language l d s
s (Type l l d d)
-> QualifiedName Language
-> s (Type l l d d)
-> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d)
-> QualifiedName λ -> s (Type l l d d) -> Type λ l d s
InfixTypeApplication
   simpleKindedTypeLHS :: forall l (d :: * -> *) (s :: * -> *).
Name Language
-> [TypeVarBinding Language l d s] -> TypeLHS Language l d s
simpleKindedTypeLHS = Name Language
-> [TypeVarBinding Language l d s] -> TypeLHS Language l d s
Name Language
-> [TypeVarBinding Language l d s] -> TypeLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> [TypeVarBinding λ l d s] -> TypeLHS λ l d s
SimpleTypeLHS
   infixTypeLHSApplication :: forall l (d :: * -> *) (s :: * -> *).
TypeVarBinding Language l d s
-> Name Language
-> TypeVarBinding Language l d s
-> TypeLHS Language l d s
infixTypeLHSApplication TypeVarBinding Language l d s
left Name Language
op TypeVarBinding Language l d s
right = Name Language
-> [TypeVarBinding Language l d s] -> TypeLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> [TypeVarBinding λ l d s] -> TypeLHS λ l d s
SimpleTypeLHS Name Language
op [TypeVarBinding Language l d s
TypeVarBinding Language l d s
left, TypeVarBinding Language l d s
TypeVarBinding Language l d s
right]
   typeLHSApplication :: forall (s :: * -> *) l (d :: * -> *).
s (TypeLHS l l d d)
-> TypeVarBinding Language l d s -> TypeLHS Language l d s
typeLHSApplication = s (TypeLHS l l d d)
-> TypeVarBinding Language l d s -> TypeLHS Language l d s
s (TypeLHS l l d d)
-> TypeVarBinding Language l d s -> TypeLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (TypeLHS l l d d) -> TypeVarBinding λ l d s -> TypeLHS λ l d s
TypeLHSApplication
   visibleDependentType :: forall l (d :: * -> *) (s :: * -> *).
[TypeVarBinding Language l d s]
-> s (Type l l d d) -> Type Language l d s
visibleDependentType = [TypeVarBinding Language l d s]
-> s (Type l l d d) -> Type Language l d s
[TypeVarBinding Language l d s]
-> s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s] -> s (Type l l d d) -> Type λ l d s
VisibleDependentType
   existentialConstructor :: forall l (d :: * -> *) (s :: * -> *).
[TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (DataConstructor l l d d)
-> DataConstructor Language l d s
existentialConstructor = [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (DataConstructor l l d d)
-> DataConstructor Language l d s
[TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (DataConstructor l l d d)
-> DataConstructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s]
-> s (Context l l d d)
-> s (DataConstructor l l d d)
-> DataConstructor λ l d s
ExistentialConstructor
   explicitlyScopedInstanceDeclaration :: forall l (d :: * -> *) (s :: * -> *).
[TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
explicitlyScopedInstanceDeclaration = [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
[TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration λ l d s
InstanceDeclaration
   forallType :: forall l (d :: * -> *) (s :: * -> *).
[TypeVarBinding Language l d s]
-> s (Type l l d d) -> Type Language l d s
forallType = [TypeVarBinding Language l d s]
-> s (Type l l d d) -> Type Language l d s
[TypeVarBinding Language l d s]
-> s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s] -> s (Type l l d d) -> Type λ l d s
ForallType
   kindedType :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> s (Kind l l d d) -> Type Language l d s
kindedType = s (Type l l d d) -> s (Kind l l d d) -> Type Language l d s
s (Type l l d d) -> s (Kind l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> s (Kind l l d d) -> Type λ l d s
KindedType
   constrainedType :: forall (s :: * -> *) l (d :: * -> *).
s (Context l l d d) -> s (Type l l d d) -> Type Language l d s
constrainedType = s (Context l l d d) -> s (Type l l d d) -> Type Language l d s
s (Context l l d d) -> s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Context l l d d) -> s (Type l l d d) -> Type λ l d s
ConstrainedType
   constraintType :: forall (s :: * -> *) l (d :: * -> *).
s (Context l l d d) -> Type Language l d s
constraintType = s (Context l l d d) -> Type Language l d s
s (Context l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Context l l d d) -> Type λ l d s
ConstraintType
   typeKind :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> Kind Language l d s
typeKind = s (Type l l d d) -> Kind Language l d s
s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> Type λ l d s
TypeKind
   typeWildcard :: forall l (d :: * -> *) (s :: * -> *). Type Language l d s
typeWildcard = Type Language l d s
Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Type λ l d s
TypeWildcard
   groundType :: forall l (d :: * -> *) (s :: * -> *). Type Language l d s
groundType = Type Language l d s
Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Type λ l d s
GroundTypeKind
   typeEquality :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> s (Type l l d d) -> Context Language l d s
typeEquality = s (Type l l d d) -> s (Type l l d d) -> Context Language l d s
s (Type l l d d) -> s (Type l l d d) -> Context Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> s (Type l l d d) -> Context λ l d s
TypeEquality

   kindedDataDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> s (Kind l l d d)
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
kindedDataDeclaration s (Context l l d d)
context s (TypeLHS l l d d)
lhs = s (Context l l d d)
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
DataDeclaration s (Context l l d d)
context s (TypeLHS l l d d)
lhs (Maybe (s (Kind l l d d))
 -> [s (DataConstructor l l d d)]
 -> [s (DerivingClause l l d d)]
 -> Declaration Language l d s)
-> (s (Kind l l d d) -> Maybe (s (Kind l l d d)))
-> s (Kind l l d d)
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s (Kind l l d d) -> Maybe (s (Kind l l d d))
forall a. a -> Maybe a
Just
   kindedNewtypeDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> s (Kind l l d d)
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
kindedNewtypeDeclaration s (Context l l d d)
context s (TypeLHS l l d d)
lhs = s (Context l l d d)
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
NewtypeDeclaration s (Context l l d d)
context s (TypeLHS l l d d)
lhs (Maybe (s (Kind l l d d))
 -> s (DataConstructor l l d d)
 -> [s (DerivingClause l l d d)]
 -> Declaration Language l d s)
-> (s (Kind l l d d) -> Maybe (s (Kind l l d d)))
-> s (Kind l l d d)
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s (Kind l l d d) -> Maybe (s (Kind l l d d))
forall a. a -> Maybe a
Just
   gadtDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
gadtDeclaration = s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
GADTDeclaration
   gadtNewtypeDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (GADTConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
gadtNewtypeDeclaration = s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (GADTConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (GADTConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (GADTConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
GADTNewtypeDeclaration
   gadtConstructors :: forall l (d :: * -> *) (s :: * -> *).
NonEmpty (Name Language)
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (Type l l d d)
-> GADTConstructor Language l d s
gadtConstructors = NonEmpty (Name Language)
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (Type l l d d)
-> GADTConstructor Language l d s
NonEmpty (Name Language)
-> [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (Type l l d d)
-> GADTConstructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
NonEmpty (Name λ)
-> [TypeVarBinding λ l d s]
-> s (Context l l d d)
-> s (Type l l d d)
-> GADTConstructor λ l d s
GADTConstructors
   recordFunctionType :: forall (s :: * -> *) l (d :: * -> *).
[s (FieldDeclaration l l d d)]
-> s (Type l l d d) -> Type Language l d s
recordFunctionType = [s (FieldDeclaration l l d d)]
-> s (Type l l d d) -> Type Language l d s
[s (FieldDeclaration l l d d)]
-> s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (FieldDeclaration l l d d)] -> s (Type l l d d) -> Type λ l d s
RecordFunctionType
   linearFunctionType :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
linearFunctionType = s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> s (Type l l d d) -> Type λ l d s
LinearFunctionType
   multiplicityFunctionType :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d)
-> s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
multiplicityFunctionType = s (Type l l d d)
-> s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
s (Type l l d d)
-> s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d)
-> s (Type l l d d) -> s (Type l l d d) -> Type λ l d s
MultiplicityFunctionType
   promotedConstructorType :: forall (s :: * -> *) l (d :: * -> *).
s (Constructor l l d d) -> Type Language l d s
promotedConstructorType = s (Constructor l l d d) -> Type Language l d s
s (Constructor l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Constructor l l d d) -> Type λ l d s
PromotedConstructorType
   promotedTupleType :: forall (s :: * -> *) l (d :: * -> *).
[s (Type l l d d)] -> Type Language l d s
promotedTupleType = [s (Type l l d d)] -> Type Language l d s
[s (Type l l d d)] -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Type l l d d)] -> Type λ l d s
PromotedTupleType
   promotedListType :: forall (s :: * -> *) l (d :: * -> *).
[s (Type l l d d)] -> Type Language l d s
promotedListType = [s (Type l l d d)] -> Type Language l d s
[s (Type l l d d)] -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Type l l d d)] -> Type λ l d s
PromotedListType
   promotedIntegerLiteral :: forall l (d :: * -> *) (s :: * -> *).
Integer -> Type Language l d s
promotedIntegerLiteral = Integer -> Type Language l d s
Integer -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Integer -> Type λ l d s
PromotedIntegerLiteral
   promotedCharLiteral :: forall l (d :: * -> *) (s :: * -> *). Char -> Type Language l d s
promotedCharLiteral = Char -> Type Language l d s
Char -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Char -> Type λ l d s
PromotedCharLiteral
   promotedStringLiteral :: forall l (d :: * -> *) (s :: * -> *). Text -> Type Language l d s
promotedStringLiteral = Text -> Type Language l d s
Text -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Text -> Type λ l d s
PromotedStringLiteral
   promotedInfixTypeApplication :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d)
-> QualifiedName Language
-> s (Type l l d d)
-> Type Language l d s
promotedInfixTypeApplication = s (Type l l d d)
-> QualifiedName Language
-> s (Type l l d d)
-> Type Language l d s
s (Type l l d d)
-> QualifiedName Language
-> s (Type l l d d)
-> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d)
-> QualifiedName λ -> s (Type l l d d) -> Type λ l d s
PromotedInfixTypeApplication

   typeRoleDeclaration :: forall l (d :: * -> *) (s :: * -> *).
QualifiedName Language
-> [TypeRole Language] -> Declaration Language l d s
typeRoleDeclaration = QualifiedName Language
-> [TypeRole Language] -> Declaration Language l d s
QualifiedName Language
-> [TypeRole Language] -> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> [TypeRole λ] -> Declaration λ l d s
TypeRoleDeclaration
   inferredRole :: TypeRole Language
inferredRole = TypeRole Language
TypeRole Language
forall λ. TypeRole λ
InferredRole
   nominalRole :: TypeRole Language
nominalRole = TypeRole Language
TypeRole Language
forall λ. TypeRole λ
NominalRole
   representationalRole :: TypeRole Language
representationalRole = TypeRole Language
TypeRole Language
forall λ. TypeRole λ
RepresentationalRole
   phantomRole :: TypeRole Language
phantomRole = TypeRole Language
TypeRole Language
forall λ. TypeRole λ
PhantomRole

   explicitlyKindedTypeVariable :: forall (s :: * -> *) l (d :: * -> *).
Name Language -> s (Kind l l d d) -> TypeVarBinding Language l d s
explicitlyKindedTypeVariable = Bool
-> Name Language
-> s (Kind l l d d)
-> TypeVarBinding Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool -> Name λ -> s (Kind l l d d) -> TypeVarBinding λ l d s
ExplicitlyKindedTypeVariable Bool
False
   implicitlyKindedTypeVariable :: forall l (d :: * -> *) (s :: * -> *).
Name Language -> TypeVarBinding Language l d s
implicitlyKindedTypeVariable = Bool -> Name Language -> TypeVarBinding Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool -> Name λ -> TypeVarBinding λ l d s
ImplicitlyKindedTypeVariable Bool
False
   inferredTypeVariable :: forall l (d :: * -> *) (s :: * -> *).
Name Language -> TypeVarBinding Language l d s
inferredTypeVariable = Bool -> Name Language -> TypeVarBinding Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool -> Name λ -> TypeVarBinding λ l d s
ImplicitlyKindedTypeVariable Bool
True
   inferredExplicitlyKindedTypeVariable :: forall (s :: * -> *) l (d :: * -> *).
Name Language -> s (Kind l l d d) -> TypeVarBinding Language l d s
inferredExplicitlyKindedTypeVariable = Bool
-> Name Language
-> s (Kind l l d d)
-> TypeVarBinding Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool -> Name λ -> s (Kind l l d d) -> TypeVarBinding λ l d s
ExplicitlyKindedTypeVariable Bool
True
   
   groundTypeKind :: forall l (d :: * -> *) (s :: * -> *). Type Language l d s
groundTypeKind = Type Language l d s
Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Type λ l d s
GroundTypeKind
   typeConstraint :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> Context Language l d s
typeConstraint = s (Type l l d d) -> Context Language l d s
s (Type l l d d) -> Context Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> Context λ l d s
TypeConstraint

   dataFamilyDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d)) -> Declaration Language l d s
dataFamilyDeclaration = s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d)) -> Declaration Language l d s
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d)) -> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d)) -> Declaration λ l d s
DataFamilyDeclaration
   openTypeFamilyDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d)) -> Declaration Language l d s
openTypeFamilyDeclaration = s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d)) -> Declaration Language l d s
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d)) -> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d)) -> Declaration λ l d s
OpenTypeFamilyDeclaration
   closedTypeFamilyDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (Declaration l l d d)]
-> Declaration Language l d s
closedTypeFamilyDeclaration = s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (Declaration l l d d)]
-> Declaration Language l d s
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (Declaration l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (Declaration l l d d)]
-> Declaration λ l d s
ClosedTypeFamilyDeclaration
   injectiveOpenTypeFamilyDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (TypeLHS l l d d)
-> TypeVarBinding Language l d s
-> Maybe (Name Language, NonEmpty (Name Language))
-> Declaration Language l d s
injectiveOpenTypeFamilyDeclaration = s (TypeLHS l l d d)
-> TypeVarBinding Language l d s
-> Maybe (Name Language, NonEmpty (Name Language))
-> Declaration Language l d s
s (TypeLHS l l d d)
-> TypeVarBinding Language l d s
-> Maybe (Name Language, NonEmpty (Name Language))
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (TypeLHS l l d d)
-> TypeVarBinding λ l d s
-> Maybe (Name λ, NonEmpty (Name λ))
-> Declaration λ l d s
InjectiveOpenTypeFamilyDeclaration
   injectiveClosedTypeFamilyDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (TypeLHS l l d d)
-> TypeVarBinding Language l d s
-> Maybe (Name Language, NonEmpty (Name Language))
-> [s (Declaration l l d d)]
-> Declaration Language l d s
injectiveClosedTypeFamilyDeclaration = s (TypeLHS l l d d)
-> TypeVarBinding Language l d s
-> Maybe (Name Language, NonEmpty (Name Language))
-> [s (Declaration l l d d)]
-> Declaration Language l d s
s (TypeLHS l l d d)
-> TypeVarBinding Language l d s
-> Maybe (Name Language, NonEmpty (Name Language))
-> [s (Declaration l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (TypeLHS l l d d)
-> TypeVarBinding λ l d s
-> Maybe (Name λ, NonEmpty (Name λ))
-> [s (Declaration l l d d)]
-> Declaration λ l d s
InjectiveClosedTypeFamilyDeclaration
   dataFamilyInstance :: forall l (d :: * -> *) (s :: * -> *).
[TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
dataFamilyInstance = [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
[TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
DataFamilyInstance
   newtypeFamilyInstance :: forall l (d :: * -> *) (s :: * -> *).
[TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
newtypeFamilyInstance = [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
[TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
NewtypeFamilyInstance
   gadtDataFamilyInstance :: forall l (d :: * -> *) (s :: * -> *).
[TypeVarBinding Language l d s]
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
gadtDataFamilyInstance = [TypeVarBinding Language l d s]
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
[TypeVarBinding Language l d s]
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s]
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (GADTConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
GADTDataFamilyInstance
   gadtNewtypeFamilyInstance :: forall l (d :: * -> *) (s :: * -> *).
[TypeVarBinding Language l d s]
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (GADTConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
gadtNewtypeFamilyInstance = [TypeVarBinding Language l d s]
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (GADTConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
[TypeVarBinding Language l d s]
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (GADTConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s]
-> s (ClassInstanceLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (GADTConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
GADTNewtypeFamilyInstance
   typeFamilyInstance :: forall l (d :: * -> *) (s :: * -> *).
[TypeVarBinding Language l d s]
-> s (ClassInstanceLHS l l d d)
-> s (Type l l d d)
-> Declaration Language l d s
typeFamilyInstance = [TypeVarBinding Language l d s]
-> s (ClassInstanceLHS l l d d)
-> s (Type l l d d)
-> Declaration Language l d s
[TypeVarBinding Language l d s]
-> s (ClassInstanceLHS l l d d)
-> s (Type l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s]
-> s (ClassInstanceLHS l l d d)
-> s (Type l l d d)
-> Declaration λ l d s
TypeFamilyInstance
   classReferenceInstanceLHS :: forall l (d :: * -> *) (s :: * -> *).
QualifiedName Language -> ClassInstanceLHS Language l d s
classReferenceInstanceLHS = QualifiedName Language -> ClassInstanceLHS Language l d s
QualifiedName Language -> ClassInstanceLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> ClassInstanceLHS λ l d s
ClassReferenceInstanceLHS
   infixTypeClassInstanceLHS :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d)
-> QualifiedName Language
-> s (Type l l d d)
-> ClassInstanceLHS Language l d s
infixTypeClassInstanceLHS = s (Type l l d d)
-> QualifiedName Language
-> s (Type l l d d)
-> ClassInstanceLHS Language l d s
s (Type l l d d)
-> QualifiedName Language
-> s (Type l l d d)
-> ClassInstanceLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d)
-> QualifiedName λ -> s (Type l l d d) -> ClassInstanceLHS λ l d s
InfixTypeClassInstanceLHS
   classInstanceLHSApplication :: forall (s :: * -> *) l (d :: * -> *).
s (ClassInstanceLHS l l d d)
-> s (Type l l d d) -> ClassInstanceLHS Language l d s
classInstanceLHSApplication = s (ClassInstanceLHS l l d d)
-> s (Type l l d d) -> ClassInstanceLHS Language l d s
s (ClassInstanceLHS l l d d)
-> s (Type l l d d) -> ClassInstanceLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (ClassInstanceLHS l l d d)
-> s (Type l l d d) -> ClassInstanceLHS λ l d s
ClassInstanceLHSApplication
   classInstanceLHSKindApplication :: forall (s :: * -> *) l (d :: * -> *).
s (ClassInstanceLHS l l d d)
-> s (Kind l l d d) -> ClassInstanceLHS Language l d s
classInstanceLHSKindApplication = s (ClassInstanceLHS l l d d)
-> s (Kind l l d d) -> ClassInstanceLHS Language l d s
s (ClassInstanceLHS l l d d)
-> s (Kind l l d d) -> ClassInstanceLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (ClassInstanceLHS l l d d)
-> s (Kind l l d d) -> ClassInstanceLHS λ l d s
ClassInstanceLHSKindApplication
   kindSignature :: forall (s :: * -> *) l (d :: * -> *).
Name Language -> s (Kind l l d d) -> Declaration Language l d s
kindSignature = Name Language -> s (Kind l l d d) -> Declaration Language l d s
Name Language -> s (Kind l l d d) -> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> s (Kind l l d d) -> Declaration λ l d s
KindSignature

   visibleTypeApplication :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> s (Type l l d d) -> Expression Language l d s
visibleTypeApplication = s (Expression l l d d)
-> s (Type l l d d) -> Expression Language l d s
s (Expression l l d d)
-> s (Type l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d) -> s (Type l l d d) -> Expression λ l d s
VisibleTypeApplication
   visibleKindApplication :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> s (Kind l l d d) -> Type Language l d s
visibleKindApplication = s (Type l l d d) -> s (Kind l l d d) -> Type Language l d s
s (Type l l d d) -> s (Kind l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> s (Kind l l d d) -> Type λ l d s
VisibleKindApplication
   typedPattern :: forall (s :: * -> *) l (d :: * -> *).
s (Pattern l l d d) -> s (Type l l d d) -> Pattern Language l d s
typedPattern = s (Pattern l l d d) -> s (Type l l d d) -> Pattern Language l d s
s (Pattern l l d d) -> s (Type l l d d) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Pattern l l d d) -> s (Type l l d d) -> Pattern λ l d s
TypedPattern
   constructorPatternWithTypeApplications :: forall (s :: * -> *) l (d :: * -> *).
s (Constructor l l d d)
-> [s (Type l l d d)]
-> [s (Pattern l l d d)]
-> Pattern Language l d s
constructorPatternWithTypeApplications = s (Constructor l l d d)
-> [s (Type l l d d)]
-> [s (Pattern l l d d)]
-> Pattern Language l d s
s (Constructor l l d d)
-> [s (Type l l d d)]
-> [s (Pattern l l d d)]
-> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Constructor l l d d)
-> [s (Type l l d d)] -> [s (Pattern l l d d)] -> Pattern λ l d s
ConstructorPattern

   overloadedLabel :: forall l (d :: * -> *) (s :: * -> *).
Text -> Expression Language l d s
overloadedLabel = Text -> Expression Language l d s
Text -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Text -> Expression λ l d s
OverloadedLabel
   getField :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> Name Language -> Expression Language l d s
getField = s (Expression l l d d)
-> Name Language -> Expression Language l d s
s (Expression l l d d)
-> Name Language -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d) -> Name λ -> Expression λ l d s
GetField
   fieldProjection :: forall l (d :: * -> *) (s :: * -> *).
NonEmpty (Name Language) -> Expression Language l d s
fieldProjection = NonEmpty (Name Language) -> Expression Language l d s
NonEmpty (Name Language) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
NonEmpty (Name λ) -> Expression λ l d s
FieldProjection

instance Abstract.Haskell Language where
   type Module Language = Module Language
   type Declaration Language = Declaration Language
   type Expression Language = Expression Language
   type Type Language = Type Language

   type EquationLHS Language = EquationLHS Language
   type EquationRHS Language = EquationRHS Language
   type GuardedExpression Language = GuardedExpression Language
   type Pattern Language = Pattern Language
   type Statement Language = Statement Language
   type ClassInstanceLHS Language = ClassInstanceLHS Language
   type TypeLHS Language = TypeLHS Language

   type Import Language = Import Language
   type ImportSpecification Language = ImportSpecification Language
   type ImportItem Language = ImportItem Language
   type Export Language = Export Language

   type Context Language = Context Language
   type DataConstructor Language = DataConstructor Language
   type DerivingClause Language = DerivingClause Language
   type FieldDeclaration Language = FieldDeclaration Language
   type FieldBinding Language = FieldBinding Language
   type FieldPattern Language = FieldPattern Language
   type CaseAlternative Language = CaseAlternative Language

   type Constructor Language = Constructor Language
   type Value Language = Value Language

   type CallingConvention Language = CallingConvention Language
   type CallSafety Language = CallSafety Language
   type Associativity Language = Associativity Language
   type Members Language = Members Language
   type Name Language = Name Language
   type ModuleName Language = ModuleName Language
   type QualifiedName Language = QualifiedName Language

   anonymousModule :: forall (s :: * -> *) l (d :: * -> *).
[s (Import l l d d)]
-> [s (Declaration l l d d)] -> Module Language l d s
anonymousModule = [s (Import l l d d)]
-> [s (Declaration l l d d)] -> Module Language l d s
[s (Import l l d d)]
-> [s (Declaration l l d d)] -> Module Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Import l l d d)] -> [s (Declaration l l d d)] -> Module λ l d s
AnonymousModule
   namedModule :: forall (s :: * -> *) l (d :: * -> *).
ModuleName Language
-> Maybe [s (Export l l d d)]
-> [s (Import l l d d)]
-> [s (Declaration l l d d)]
-> Module Language l d s
namedModule = ModuleName Language
-> Maybe [s (Export l l d d)]
-> [s (Import l l d d)]
-> [s (Declaration l l d d)]
-> Module Language l d s
ModuleName Language
-> Maybe [s (Export l l d d)]
-> [s (Import l l d d)]
-> [s (Declaration l l d d)]
-> Module Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
ModuleName λ
-> Maybe [s (Export l l d d)]
-> [s (Import l l d d)]
-> [s (Declaration l l d d)]
-> Module λ l d s
NamedModule
   withLanguagePragma :: forall (s :: * -> *) l (d :: * -> *).
[ExtensionSwitch] -> s (Module l l d d) -> Module Language l d s
withLanguagePragma = [ExtensionSwitch] -> s (Module l l d d) -> Module Language l d s
[ExtensionSwitch] -> s (Module l l d d) -> Module Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[ExtensionSwitch] -> s (Module l l d d) -> Module λ l d s
ExtendedModule

   exportClassOrType :: forall l (d :: * -> *) (s :: * -> *).
QualifiedName Language
-> Maybe (Members Language) -> Export Language l d s
exportClassOrType = QualifiedName Language
-> Maybe (Members Language) -> Export Language l d s
QualifiedName Language
-> Maybe (Members Language) -> Export Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> Maybe (Members λ) -> Export λ l d s
ExportClassOrType
   exportVar :: forall l (d :: * -> *) (s :: * -> *).
QualifiedName Language -> Export Language l d s
exportVar = QualifiedName Language -> Export Language l d s
QualifiedName Language -> Export Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> Export λ l d s
ExportVar
   reExportModule :: forall l (d :: * -> *) (s :: * -> *).
ModuleName Language -> Export Language l d s
reExportModule = ModuleName Language -> Export Language l d s
ModuleName Language -> Export Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
ModuleName λ -> Export λ l d s
ReExportModule

   importDeclaration :: forall (s :: * -> *) l (d :: * -> *).
Bool
-> ModuleName Language
-> Maybe (ModuleName Language)
-> Maybe (s (ImportSpecification l l d d))
-> Import Language l d s
importDeclaration Bool
q = Bool
-> Bool
-> Maybe Text
-> ModuleName Language
-> Maybe (ModuleName Language)
-> Maybe (s (ImportSpecification l l d d))
-> Import Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool
-> Bool
-> Maybe Text
-> ModuleName λ
-> Maybe (ModuleName λ)
-> Maybe (s (ImportSpecification l l d d))
-> Import λ l d s
Import Bool
False Bool
q Maybe Text
forall a. Maybe a
Nothing
   excludedImports :: forall (s :: * -> *) l (d :: * -> *).
[s (ImportItem l l d d)] -> ImportSpecification Language l d s
excludedImports = Bool
-> [s (ImportItem l l d d)] -> ImportSpecification Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool -> [s (ImportItem l l d d)] -> ImportSpecification λ l d s
ImportSpecification Bool
False
   includedImports :: forall (s :: * -> *) l (d :: * -> *).
[s (ImportItem l l d d)] -> ImportSpecification Language l d s
includedImports = Bool
-> [s (ImportItem l l d d)] -> ImportSpecification Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Bool -> [s (ImportItem l l d d)] -> ImportSpecification λ l d s
ImportSpecification Bool
True
   importClassOrType :: forall l (d :: * -> *) (s :: * -> *).
Name Language
-> Maybe (Members Language) -> ImportItem Language l d s
importClassOrType = Name Language
-> Maybe (Members Language) -> ImportItem Language l d s
Name Language
-> Maybe (Members Language) -> ImportItem Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> Maybe (Members λ) -> ImportItem λ l d s
ImportClassOrType
   importVar :: forall l (d :: * -> *) (s :: * -> *).
Name Language -> ImportItem Language l d s
importVar = Name Language -> ImportItem Language l d s
Name Language -> ImportItem Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> ImportItem λ l d s
ImportVar

   allMembers :: Members Language
allMembers = Members Language
Members Language
forall λ. Members λ
AllMembers
   memberList :: [Name Language] -> Members Language
memberList = [Name Language] -> Members Language
[Name Language] -> Members Language
forall λ. [Name λ] -> Members λ
MemberList

   classDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
classDeclaration = s (Context l l d d)
-> s (TypeLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
s (Context l l d d)
-> s (TypeLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration λ l d s
ClassDeclaration
   dataDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
dataDeclaration s (Context l l d d)
context s (TypeLHS l l d d)
lhs = s (Context l l d d)
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> [s (DataConstructor l l d d)]
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
DataDeclaration s (Context l l d d)
context s (TypeLHS l l d d)
lhs Maybe (s (Kind l l d d))
forall a. Maybe a
Nothing
   defaultDeclaration :: forall (s :: * -> *) l (d :: * -> *).
[s (Type l l d d)] -> Declaration Language l d s
defaultDeclaration = [s (Type l l d d)] -> Declaration Language l d s
[s (Type l l d d)] -> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Type l l d d)] -> Declaration λ l d s
DefaultDeclaration
   equationDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (EquationLHS l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
equationDeclaration = s (EquationLHS l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
s (EquationLHS l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (EquationLHS l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration λ l d s
EquationDeclaration
   fixityDeclaration :: forall l (d :: * -> *) (s :: * -> *).
Associativity Language
-> Maybe Int
-> NonEmpty (Name Language)
-> Declaration Language l d s
fixityDeclaration = Associativity Language
-> Maybe Int
-> NonEmpty (Name Language)
-> Declaration Language l d s
Associativity Language
-> Maybe Int
-> NonEmpty (Name Language)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Associativity λ
-> Maybe Int -> NonEmpty (Name λ) -> Declaration λ l d s
FixityDeclaration
   foreignExport :: forall (s :: * -> *) l (d :: * -> *).
CallingConvention Language
-> Maybe Text
-> Name Language
-> s (Type l l d d)
-> Declaration Language l d s
foreignExport = CallingConvention Language
-> Maybe Text
-> Name Language
-> s (Type l l d d)
-> Declaration Language l d s
CallingConvention Language
-> Maybe Text
-> Name Language
-> s (Type l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
CallingConvention λ
-> Maybe Text -> Name λ -> s (Type l l d d) -> Declaration λ l d s
ForeignExport
   foreignImport :: forall (s :: * -> *) l (d :: * -> *).
CallingConvention Language
-> Maybe (CallSafety Language)
-> Maybe Text
-> Name Language
-> s (Type l l d d)
-> Declaration Language l d s
foreignImport = CallingConvention Language
-> Maybe (CallSafety Language)
-> Maybe Text
-> Name Language
-> s (Type l l d d)
-> Declaration Language l d s
CallingConvention Language
-> Maybe (CallSafety Language)
-> Maybe Text
-> Name Language
-> s (Type l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
CallingConvention λ
-> Maybe (CallSafety λ)
-> Maybe Text
-> Name λ
-> s (Type l l d d)
-> Declaration λ l d s
ForeignImport
   instanceDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
instanceDeclaration = [TypeVarBinding Language l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[TypeVarBinding λ l d s]
-> s (Context l l d d)
-> s (ClassInstanceLHS l l d d)
-> [s (Declaration l l d d)]
-> Declaration λ l d s
InstanceDeclaration []
   newtypeDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
newtypeDeclaration s (Context l l d d)
context s (TypeLHS l l d d)
lhs = s (Context l l d d)
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Context l l d d)
-> s (TypeLHS l l d d)
-> Maybe (s (Kind l l d d))
-> s (DataConstructor l l d d)
-> [s (DerivingClause l l d d)]
-> Declaration λ l d s
NewtypeDeclaration s (Context l l d d)
context s (TypeLHS l l d d)
lhs Maybe (s (Kind l l d d))
forall a. Maybe a
Nothing
   typeSynonymDeclaration :: forall (s :: * -> *) l (d :: * -> *).
s (TypeLHS l l d d)
-> s (Type l l d d) -> Declaration Language l d s
typeSynonymDeclaration = s (TypeLHS l l d d)
-> s (Type l l d d) -> Declaration Language l d s
s (TypeLHS l l d d)
-> s (Type l l d d) -> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (TypeLHS l l d d) -> s (Type l l d d) -> Declaration λ l d s
TypeSynonymDeclaration
   typeSignature :: forall (s :: * -> *) l (d :: * -> *).
NonEmpty (Name Language)
-> s (Context l l d d)
-> s (Type l l d d)
-> Declaration Language l d s
typeSignature = NonEmpty (Name Language)
-> s (Context l l d d)
-> s (Type l l d d)
-> Declaration Language l d s
NonEmpty (Name Language)
-> s (Context l l d d)
-> s (Type l l d d)
-> Declaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
NonEmpty (Name λ)
-> s (Context l l d d) -> s (Type l l d d) -> Declaration λ l d s
TypeSignature

   applyExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> s (Expression l l d d) -> Expression Language l d s
applyExpression = s (Expression l l d d)
-> s (Expression l l d d) -> Expression Language l d s
s (Expression l l d d)
-> s (Expression l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d)
-> s (Expression l l d d) -> Expression λ l d s
ApplyExpression
   conditionalExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> s (Expression l l d d)
-> s (Expression l l d d)
-> Expression Language l d s
conditionalExpression = s (Expression l l d d)
-> s (Expression l l d d)
-> s (Expression l l d d)
-> Expression Language l d s
s (Expression l l d d)
-> s (Expression l l d d)
-> s (Expression l l d d)
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d)
-> s (Expression l l d d)
-> s (Expression l l d d)
-> Expression λ l d s
ConditionalExpression
   constructorExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Constructor l l d d) -> Expression Language l d s
constructorExpression = s (Constructor l l d d) -> Expression Language l d s
s (Constructor l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Constructor l l d d) -> Expression λ l d s
ConstructorExpression
   caseExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> [s (CaseAlternative l l d d)] -> Expression Language l d s
caseExpression = s (Expression l l d d)
-> [s (CaseAlternative l l d d)] -> Expression Language l d s
s (Expression l l d d)
-> [s (CaseAlternative l l d d)] -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d)
-> [s (CaseAlternative l l d d)] -> Expression λ l d s
CaseExpression
   doExpression :: forall (s :: * -> *) l (d :: * -> *).
s (GuardedExpression l l d d) -> Expression Language l d s
doExpression = s (GuardedExpression l l d d) -> Expression Language l d s
s (GuardedExpression l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (GuardedExpression l l d d) -> Expression λ l d s
DoExpression
   infixExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> s (Expression l l d d)
-> s (Expression l l d d)
-> Expression Language l d s
infixExpression = s (Expression l l d d)
-> s (Expression l l d d)
-> s (Expression l l d d)
-> Expression Language l d s
s (Expression l l d d)
-> s (Expression l l d d)
-> s (Expression l l d d)
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d)
-> s (Expression l l d d)
-> s (Expression l l d d)
-> Expression λ l d s
InfixExpression
   leftSectionExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> QualifiedName Language -> Expression Language l d s
leftSectionExpression = s (Expression l l d d)
-> QualifiedName Language -> Expression Language l d s
s (Expression l l d d)
-> QualifiedName Language -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d) -> QualifiedName λ -> Expression λ l d s
LeftSectionExpression
   lambdaExpression :: forall (s :: * -> *) l (d :: * -> *).
[s (Pattern l l d d)]
-> s (Expression l l d d) -> Expression Language l d s
lambdaExpression = [s (Pattern l l d d)]
-> s (Expression l l d d) -> Expression Language l d s
[s (Pattern l l d d)]
-> s (Expression l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Pattern l l d d)]
-> s (Expression l l d d) -> Expression λ l d s
LambdaExpression
   letExpression :: forall (s :: * -> *) l (d :: * -> *).
[s (Declaration l l d d)]
-> s (Expression l l d d) -> Expression Language l d s
letExpression = [s (Declaration l l d d)]
-> s (Expression l l d d) -> Expression Language l d s
[s (Declaration l l d d)]
-> s (Expression l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Declaration l l d d)]
-> s (Expression l l d d) -> Expression λ l d s
LetExpression
   listComprehension :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> NonEmpty (s (Statement l l d d)) -> Expression Language l d s
listComprehension = s (Expression l l d d)
-> NonEmpty (s (Statement l l d d)) -> Expression Language l d s
s (Expression l l d d)
-> NonEmpty (s (Statement l l d d)) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d)
-> NonEmpty (s (Statement l l d d)) -> Expression λ l d s
ListComprehension
   listExpression :: forall (s :: * -> *) l (d :: * -> *).
[s (Expression l l d d)] -> Expression Language l d s
listExpression = [s (Expression l l d d)] -> Expression Language l d s
[s (Expression l l d d)] -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Expression l l d d)] -> Expression λ l d s
ListExpression
   literalExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Value l l d d) -> Expression Language l d s
literalExpression = s (Value l l d d) -> Expression Language l d s
s (Value l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Value l l d d) -> Expression λ l d s
LiteralExpression
   negate :: forall l (d :: * -> *) (s :: * -> *). Expression Language l d s
negate = Expression Language l d s
Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Expression λ l d s
Negate
   recordExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> [s (FieldBinding l l d d)] -> Expression Language l d s
recordExpression = s (Expression l l d d)
-> [s (FieldBinding l l d d)] -> Expression Language l d s
s (Expression l l d d)
-> [s (FieldBinding l l d d)] -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d)
-> [s (FieldBinding l l d d)] -> Expression λ l d s
RecordExpression
   referenceExpression :: forall l (d :: * -> *).
QualifiedName Language -> Expression Language l d d
referenceExpression = QualifiedName Language -> Expression Language l d d
QualifiedName Language -> Expression Language l d d
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> Expression λ l d s
ReferenceExpression
   rightSectionExpression :: forall (s :: * -> *) l (d :: * -> *).
QualifiedName Language
-> s (Expression l l d d) -> Expression Language l d s
rightSectionExpression = QualifiedName Language
-> s (Expression l l d d) -> Expression Language l d s
QualifiedName Language
-> s (Expression l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> s (Expression l l d d) -> Expression λ l d s
RightSectionExpression
   sequenceExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> Maybe (s (Expression l l d d))
-> Maybe (s (Expression l l d d))
-> Expression Language l d s
sequenceExpression = s (Expression l l d d)
-> Maybe (s (Expression l l d d))
-> Maybe (s (Expression l l d d))
-> Expression Language l d s
s (Expression l l d d)
-> Maybe (s (Expression l l d d))
-> Maybe (s (Expression l l d d))
-> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d)
-> Maybe (s (Expression l l d d))
-> Maybe (s (Expression l l d d))
-> Expression λ l d s
SequenceExpression
   tupleExpression :: forall (s :: * -> *) l (d :: * -> *).
NonEmpty (s (Expression l l d d)) -> Expression Language l d s
tupleExpression = NonEmpty (s (Expression l l d d)) -> Expression Language l d s
NonEmpty (s (Expression l l d d)) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
NonEmpty (s (Expression l l d d)) -> Expression λ l d s
TupleExpression
   typedExpression :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d)
-> s (Type l l d d) -> Expression Language l d s
typedExpression = s (Expression l l d d)
-> s (Type l l d d) -> Expression Language l d s
s (Expression l l d d)
-> s (Type l l d d) -> Expression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d) -> s (Type l l d d) -> Expression λ l d s
TypedExpression

   asPattern :: forall (s :: * -> *) l (d :: * -> *).
Name Language -> s (Pattern l l d d) -> Pattern Language l d s
asPattern = Name Language -> s (Pattern l l d d) -> Pattern Language l d s
Name Language -> s (Pattern l l d d) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> s (Pattern l l d d) -> Pattern λ l d s
AsPattern
   constructorPattern :: forall (s :: * -> *) l (d :: * -> *).
s (Constructor l l d d)
-> [s (Pattern l l d d)] -> Pattern Language l d s
constructorPattern = (s (Constructor l l d d)
 -> [s (Type l l d d)]
 -> [s (Pattern l l d d)]
 -> Pattern Language l d s)
-> [s (Type l l d d)]
-> s (Constructor l l d d)
-> [s (Pattern l l d d)]
-> Pattern Language l d s
forall a b c. (a -> b -> c) -> b -> a -> c
flip s (Constructor l l d d)
-> [s (Type l l d d)]
-> [s (Pattern l l d d)]
-> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Constructor l l d d)
-> [s (Type l l d d)] -> [s (Pattern l l d d)] -> Pattern λ l d s
ConstructorPattern []
   infixPattern :: forall (s :: * -> *) l (d :: * -> *).
s (Pattern l l d d)
-> QualifiedName Language
-> s (Pattern l l d d)
-> Pattern Language l d s
infixPattern = s (Pattern l l d d)
-> QualifiedName Language
-> s (Pattern l l d d)
-> Pattern Language l d s
s (Pattern l l d d)
-> QualifiedName Language
-> s (Pattern l l d d)
-> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Pattern l l d d)
-> QualifiedName λ -> s (Pattern l l d d) -> Pattern λ l d s
InfixPattern
   irrefutablePattern :: forall (s :: * -> *) l (d :: * -> *).
s (Pattern l l d d) -> Pattern Language l d s
irrefutablePattern = s (Pattern l l d d) -> Pattern Language l d s
s (Pattern l l d d) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Pattern l l d d) -> Pattern λ l d s
IrrefutablePattern
   listPattern :: forall (s :: * -> *) l (d :: * -> *).
[s (Pattern l l d d)] -> Pattern Language l d s
listPattern = [s (Pattern l l d d)] -> Pattern Language l d s
[s (Pattern l l d d)] -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Pattern l l d d)] -> Pattern λ l d s
ListPattern
   literalPattern :: forall (s :: * -> *) l (d :: * -> *).
s (Value l l d d) -> Pattern Language l d s
literalPattern = s (Value l l d d) -> Pattern Language l d s
s (Value l l d d) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Value l l d d) -> Pattern λ l d s
LiteralPattern
   recordPattern :: forall (s :: * -> *) l (d :: * -> *).
QualifiedName Language
-> [s (FieldPattern l l d d)] -> Pattern Language l d s
recordPattern = QualifiedName Language
-> [s (FieldPattern l l d d)] -> Pattern Language l d s
QualifiedName Language
-> [s (FieldPattern l l d d)] -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> [s (FieldPattern l l d d)] -> Pattern λ l d s
RecordPattern
   tuplePattern :: forall (s :: * -> *) l (d :: * -> *).
NonEmpty (s (Pattern l l d d)) -> Pattern Language l d s
tuplePattern = NonEmpty (s (Pattern l l d d)) -> Pattern Language l d s
NonEmpty (s (Pattern l l d d)) -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
NonEmpty (s (Pattern l l d d)) -> Pattern λ l d s
TuplePattern
   variablePattern :: forall l (d :: * -> *) (s :: * -> *).
Name Language -> Pattern Language l d s
variablePattern = Name Language -> Pattern Language l d s
Name Language -> Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Name λ -> Pattern λ l d s
VariablePattern
   wildcardPattern :: forall l (d :: * -> *) (s :: * -> *). Pattern Language l d s
wildcardPattern = Pattern Language l d s
Pattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Pattern λ l d s
WildcardPattern

   constructorType :: forall (s :: * -> *) l (d :: * -> *).
s (Constructor l l d d) -> Type Language l d s
constructorType = s (Constructor l l d d) -> Type Language l d s
s (Constructor l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Constructor l l d d) -> Type λ l d s
ConstructorType
   functionConstructorType :: forall l (d :: * -> *) (s :: * -> *). Type Language l d s
functionConstructorType = Type Language l d s
Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Type λ l d s
FunctionConstructorType
   functionType :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
functionType = s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> s (Type l l d d) -> Type λ l d s
FunctionType
   listType :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> Type Language l d s
listType = s (Type l l d d) -> Type Language l d s
s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> Type λ l d s
ListType
   strictType :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> Type Language l d s
strictType = s (Type l l d d) -> Type Language l d s
s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> Type λ l d s
StrictType
   tupleType :: forall (s :: * -> *) l (d :: * -> *).
NonEmpty (s (Type l l d d)) -> Type Language l d s
tupleType = NonEmpty (s (Type l l d d)) -> Type Language l d s
NonEmpty (s (Type l l d d)) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
NonEmpty (s (Type l l d d)) -> Type λ l d s
TupleType
   typeApplication :: forall (s :: * -> *) l (d :: * -> *).
s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
typeApplication = s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
s (Type l l d d) -> s (Type l l d d) -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Type l l d d) -> s (Type l l d d) -> Type λ l d s
TypeApplication
   typeVariable :: forall l (d :: * -> *) (s :: * -> *).
Name Language -> Type Language l d s
typeVariable = Name Language -> Type Language l d s
Name Language -> Type Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Name λ -> Type λ l d s
TypeVariable

   constructorReference :: forall l (d :: * -> *) (s :: * -> *).
QualifiedName Language -> Constructor Language l d s
constructorReference = QualifiedName Language -> Constructor Language l d s
QualifiedName Language -> Constructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> Constructor λ l d s
ConstructorReference
   emptyListConstructor :: forall l (d :: * -> *) (s :: * -> *). Constructor Language l d s
emptyListConstructor = Constructor Language l d s
Constructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Constructor λ l d s
EmptyListConstructor
   tupleConstructor :: forall l (d :: * -> *) (s :: * -> *).
Int -> Constructor Language l d s
tupleConstructor = Int -> Constructor Language l d s
Int -> Constructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Int -> Constructor λ l d s
TupleConstructor
   unitConstructor :: forall l (d :: * -> *) (s :: * -> *). Constructor Language l d s
unitConstructor = Constructor Language l d s
Constructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Constructor λ l d s
UnitConstructor

   constructor :: forall (s :: * -> *) l (d :: * -> *).
Name Language
-> [s (Type l l d d)] -> DataConstructor Language l d s
constructor = Name Language
-> [s (Type l l d d)] -> DataConstructor Language l d s
Name Language
-> [s (Type l l d d)] -> DataConstructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> [s (Type l l d d)] -> DataConstructor λ l d s
Constructor
   recordConstructor :: forall (s :: * -> *) l (d :: * -> *).
Name Language
-> [s (FieldDeclaration l l d d)] -> DataConstructor Language l d s
recordConstructor = Name Language
-> [s (FieldDeclaration l l d d)] -> DataConstructor Language l d s
Name Language
-> [s (FieldDeclaration l l d d)] -> DataConstructor Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> [s (FieldDeclaration l l d d)] -> DataConstructor λ l d s
RecordConstructor
   constructorFields :: forall (s :: * -> *) l (d :: * -> *).
NonEmpty (Name Language)
-> s (Type l l d d) -> FieldDeclaration Language l d s
constructorFields = NonEmpty (Name Language)
-> s (Type l l d d) -> FieldDeclaration Language l d s
NonEmpty (Name Language)
-> s (Type l l d d) -> FieldDeclaration Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
NonEmpty (Name λ) -> s (Type l l d d) -> FieldDeclaration λ l d s
ConstructorFields

   fieldBinding :: forall (s :: * -> *) l (d :: * -> *).
QualifiedName Language
-> s (Expression l l d d) -> FieldBinding Language l d s
fieldBinding = QualifiedName Language
-> s (Expression l l d d) -> FieldBinding Language l d s
QualifiedName Language
-> s (Expression l l d d) -> FieldBinding Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> s (Expression l l d d) -> FieldBinding λ l d s
FieldBinding
   fieldPattern :: forall (s :: * -> *) l (d :: * -> *).
QualifiedName Language
-> s (Pattern l l d d) -> FieldPattern Language l d s
fieldPattern = QualifiedName Language
-> s (Pattern l l d d) -> FieldPattern Language l d s
QualifiedName Language
-> s (Pattern l l d d) -> FieldPattern Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> s (Pattern l l d d) -> FieldPattern λ l d s
FieldPattern

   simpleDerive :: forall l (d :: * -> *) (s :: * -> *).
QualifiedName Language -> DerivingClause Language l d s
simpleDerive = QualifiedName Language -> DerivingClause Language l d s
QualifiedName Language -> DerivingClause Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> DerivingClause λ l d s
SimpleDerive

   typeClassInstanceLHS :: forall (s :: * -> *) l (d :: * -> *).
QualifiedName Language
-> s (Type l l d d) -> ClassInstanceLHS Language l d s
typeClassInstanceLHS = QualifiedName Language
-> s (Type l l d d) -> ClassInstanceLHS Language l d s
QualifiedName Language
-> s (Type l l d d) -> ClassInstanceLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> s (Type l l d d) -> ClassInstanceLHS λ l d s
TypeClassInstanceLHS
   simpleTypeLHS :: forall l (d :: * -> *) (s :: * -> *).
Name Language -> [Name Language] -> TypeLHS Language l d s
simpleTypeLHS Name Language
con = Name Language
-> [TypeVarBinding Language l d s] -> TypeLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> [TypeVarBinding λ l d s] -> TypeLHS λ l d s
SimpleTypeLHS Name Language
con ([TypeVarBinding Language l d s] -> TypeLHS Language l d s)
-> ([Name Language] -> [TypeVarBinding Language l d s])
-> [Name Language]
-> TypeLHS Language l d s
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Name Language -> TypeVarBinding Language l d s)
-> [Name Language] -> [TypeVarBinding Language l d s]
forall a b. (a -> b) -> [a] -> [b]
map Name Language -> TypeVarBinding Language l d s
Name Language -> TypeVarBinding Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
ExtendedHaskell λ =>
Name λ -> TypeVarBinding λ l d s
forall l (d :: * -> *) (s :: * -> *).
Name Language -> TypeVarBinding Language l d s
Abstract.implicitlyKindedTypeVariable

   prefixLHS :: forall (s :: * -> *) l (d :: * -> *).
s (EquationLHS l l d d)
-> NonEmpty (s (Pattern l l d d)) -> EquationLHS Language l d s
prefixLHS = s (EquationLHS l l d d)
-> NonEmpty (s (Pattern l l d d)) -> EquationLHS Language l d s
s (EquationLHS l l d d)
-> NonEmpty (s (Pattern l l d d)) -> EquationLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (EquationLHS l l d d)
-> NonEmpty (s (Pattern l l d d)) -> EquationLHS λ l d s
PrefixLHS
   infixLHS :: forall (s :: * -> *) l (d :: * -> *).
s (Pattern l l d d)
-> Name Language
-> s (Pattern l l d d)
-> EquationLHS Language l d s
infixLHS = s (Pattern l l d d)
-> Name Language
-> s (Pattern l l d d)
-> EquationLHS Language l d s
s (Pattern l l d d)
-> Name Language
-> s (Pattern l l d d)
-> EquationLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Pattern l l d d)
-> Name λ -> s (Pattern l l d d) -> EquationLHS λ l d s
InfixLHS
   patternLHS :: forall (s :: * -> *) l (d :: * -> *).
s (Pattern l l d d) -> EquationLHS Language l d s
patternLHS = s (Pattern l l d d) -> EquationLHS Language l d s
s (Pattern l l d d) -> EquationLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Pattern l l d d) -> EquationLHS λ l d s
PatternLHS
   variableLHS :: forall l (d :: * -> *) (s :: * -> *).
Name Language -> EquationLHS Language l d s
variableLHS = Name Language -> EquationLHS Language l d s
Name Language -> EquationLHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
Name λ -> EquationLHS λ l d s
VariableLHS

   caseAlternative :: forall (s :: * -> *) l (d :: * -> *).
s (Pattern l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> CaseAlternative Language l d s
caseAlternative = s (Pattern l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> CaseAlternative Language l d s
s (Pattern l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> CaseAlternative Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Pattern l l d d)
-> s (EquationRHS l l d d)
-> [s (Declaration l l d d)]
-> CaseAlternative λ l d s
CaseAlternative

   guardedRHS :: forall (s :: * -> *) l (d :: * -> *).
NonEmpty (s (GuardedExpression l l d d))
-> EquationRHS Language l d s
guardedRHS = NonEmpty (s (GuardedExpression l l d d))
-> EquationRHS Language l d s
NonEmpty (s (GuardedExpression l l d d))
-> EquationRHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
NonEmpty (s (GuardedExpression l l d d)) -> EquationRHS λ l d s
GuardedRHS
   normalRHS :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d) -> EquationRHS Language l d s
normalRHS = s (Expression l l d d) -> EquationRHS Language l d s
s (Expression l l d d) -> EquationRHS Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d) -> EquationRHS λ l d s
NormalRHS

   guardedExpression :: forall (s :: * -> *) l (d :: * -> *).
[s (Statement l l d d)]
-> s (Expression l l d d) -> GuardedExpression Language l d s
guardedExpression = [s (Statement l l d d)]
-> s (Expression l l d d) -> GuardedExpression Language l d s
[s (Statement l l d d)]
-> s (Expression l l d d) -> GuardedExpression Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Statement l l d d)]
-> s (Expression l l d d) -> GuardedExpression λ l d s
GuardedExpression

   classConstraint :: forall (s :: * -> *) l (d :: * -> *).
QualifiedName Language
-> s (Type l l d d) -> Context Language l d s
classConstraint QualifiedName Language
cls s (Type l l d d)
t = QualifiedName Language
-> s (Type l l d d) -> Context Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
QualifiedName λ -> s (Type l l d d) -> Context λ l d s
ClassConstraint QualifiedName Language
cls s (Type l l d d)
t
   constraints :: forall (s :: * -> *) l (d :: * -> *).
[s (Context l l d d)] -> Context Language l d s
constraints = [s (Context l l d d)] -> Context Language l d s
[s (Context l l d d)] -> Context Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Context l l d d)] -> Context λ l d s
Constraints
   noContext :: forall l (d :: * -> *) (s :: * -> *). Context Language l d s
noContext = Context Language l d s
Context Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Context λ l d s
NoContext

   bindStatement :: forall (s :: * -> *) l (d :: * -> *).
s (Pattern l l d d)
-> s (Expression l l d d) -> Statement Language l d s
bindStatement = s (Pattern l l d d)
-> s (Expression l l d d) -> Statement Language l d s
s (Pattern l l d d)
-> s (Expression l l d d) -> Statement Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Pattern l l d d) -> s (Expression l l d d) -> Statement λ l d s
BindStatement
   expressionStatement :: forall (s :: * -> *) l (d :: * -> *).
s (Expression l l d d) -> Statement Language l d s
expressionStatement = s (Expression l l d d) -> Statement Language l d s
s (Expression l l d d) -> Statement Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
s (Expression l l d d) -> Statement λ l d s
ExpressionStatement
   letStatement :: forall (s :: * -> *) l (d :: * -> *).
[s (Declaration l l d d)] -> Statement Language l d s
letStatement = [s (Declaration l l d d)] -> Statement Language l d s
[s (Declaration l l d d)] -> Statement Language l d s
forall λ l (d :: * -> *) (s :: * -> *).
[s (Declaration l l d d)] -> Statement λ l d s
LetStatement

   charLiteral :: forall l (d :: * -> *) (s :: * -> *). Char -> Value Language l d s
charLiteral = Char -> Value Language l d s
Char -> Value Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Char -> Value λ l d s
CharLiteral
   floatingLiteral :: forall l (d :: * -> *) (s :: * -> *).
Rational -> Value Language l d s
floatingLiteral = Rational -> Value Language l d s
Rational -> Value Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Rational -> Value λ l d s
FloatingLiteral
   integerLiteral :: forall l (d :: * -> *) (s :: * -> *).
Integer -> Value Language l d s
integerLiteral = Integer -> Value Language l d s
Integer -> Value Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Integer -> Value λ l d s
IntegerLiteral
   stringLiteral :: forall l (d :: * -> *) (s :: * -> *). Text -> Value Language l d s
stringLiteral = Text -> Value Language l d s
Text -> Value Language l d s
forall λ l (d :: * -> *) (s :: * -> *). Text -> Value λ l d s
StringLiteral

   name :: Text -> Name Language
name = Text -> Name Language
Text -> Name Language
forall λ. Text -> Name λ
Name
   moduleName :: NonEmpty (Name Language) -> ModuleName Language
moduleName = NonEmpty (Name Language) -> ModuleName Language
NonEmpty (Name Language) -> ModuleName Language
forall λ. NonEmpty (Name λ) -> ModuleName λ
ModuleName
   qualifiedName :: Maybe (ModuleName Language)
-> Name Language -> QualifiedName Language
qualifiedName = Maybe (ModuleName Language)
-> Name Language -> QualifiedName Language
Maybe (ModuleName Language)
-> Name Language -> QualifiedName Language
forall λ. Maybe (ModuleName λ) -> Name λ -> QualifiedName λ
QualifiedName

   nonAssociative :: Associativity Language
nonAssociative = Associativity Language
Associativity Language
forall λ. Associativity λ
NonAssociative
   leftAssociative :: Associativity Language
leftAssociative = Associativity Language
Associativity Language
forall λ. Associativity λ
LeftAssociative
   rightAssociative :: Associativity Language
rightAssociative = Associativity Language
Associativity Language
forall λ. Associativity λ
RightAssociative

   cCall :: CallingConvention Language
cCall = CallingConvention Language
CallingConvention Language
forall λ. CallingConvention λ
CCall
   cppCall :: CallingConvention Language
cppCall = CallingConvention Language
CallingConvention Language
forall λ. CallingConvention λ
CppCall
   dotNetCall :: CallingConvention Language
dotNetCall = CallingConvention Language
CallingConvention Language
forall λ. CallingConvention λ
DotNetCall
   jvmCall :: CallingConvention Language
jvmCall = CallingConvention Language
CallingConvention Language
forall λ. CallingConvention λ
JvmCall
   stdCall :: CallingConvention Language
stdCall = CallingConvention Language
CallingConvention Language
forall λ. CallingConvention λ
StdCall

   safeCall :: CallSafety Language
safeCall = CallSafety Language
CallSafety Language
forall λ. CallSafety λ
SafeCall
   unsafeCall :: CallSafety Language
unsafeCall = CallSafety Language
CallSafety Language
forall λ. CallSafety λ
UnsafeCall

data Export λ l (d :: Kind.Type -> Kind.Type) (s :: Kind.Type -> Kind.Type) =
   ExportClassOrType (Abstract.QualifiedName λ) (Maybe (Abstract.Members λ))
   | ExportVar (Abstract.QualifiedName λ)
   | ExportPattern (Abstract.QualifiedName λ)
   | ReExportModule (Abstract.ModuleName λ)

data Import λ l d s = Import Bool Bool (Maybe Text) (Abstract.ModuleName λ) (Maybe (Abstract.ModuleName λ))
                             (Maybe (s (Abstract.ImportSpecification l l d d)))

data ImportItem λ l (d :: Kind.Type -> Kind.Type) (s :: Kind.Type -> Kind.Type) =
   ImportClassOrType (Abstract.Name λ) (Maybe (Abstract.Members λ))
   | ImportVar (Abstract.Name λ)
   | ImportPattern (Abstract.Name λ)

data Members λ = AllMembers
               | AllMembersPlus [Name λ]
               | MemberList [Name λ]
               | ExplicitlyNamespacedMemberList !(Abstract.SupportFor 'Extensions.ExplicitNamespaces λ)
                                                [ModuleMember λ]

data ModuleMember λ = DefaultMember (Name λ)
                    | PatternMember (Name λ)
                    | TypeMember (Name λ)
                    deriving (Typeable (ModuleMember λ)
Typeable (ModuleMember λ) =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> ModuleMember λ -> c (ModuleMember λ))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (ModuleMember λ))
-> (ModuleMember λ -> Constr)
-> (ModuleMember λ -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (ModuleMember λ)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (ModuleMember λ)))
-> ((forall b. Data b => b -> b)
    -> ModuleMember λ -> ModuleMember λ)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r)
-> (forall u.
    (forall d. Data d => d -> u) -> ModuleMember λ -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> ModuleMember λ -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d)
    -> ModuleMember λ -> m (ModuleMember λ))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> ModuleMember λ -> m (ModuleMember λ))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d)
    -> ModuleMember λ -> m (ModuleMember λ))
-> Data (ModuleMember λ)
ModuleMember λ -> Constr
ModuleMember λ -> DataType
(forall b. Data b => b -> b) -> ModuleMember λ -> ModuleMember λ
forall λ. Data λ => Typeable (ModuleMember λ)
forall λ. Data λ => ModuleMember λ -> Constr
forall λ. Data λ => ModuleMember λ -> DataType
forall λ.
Data λ =>
(forall b. Data b => b -> b) -> ModuleMember λ -> ModuleMember λ
forall λ u.
Data λ =>
Int -> (forall d. Data d => d -> u) -> ModuleMember λ -> u
forall λ u.
Data λ =>
(forall d. Data d => d -> u) -> ModuleMember λ -> [u]
forall λ r r'.
Data λ =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r
forall λ r r'.
Data λ =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r
forall λ (m :: * -> *).
(Data λ, Monad m) =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
forall λ (m :: * -> *).
(Data λ, MonadPlus m) =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
forall λ (c :: * -> *).
Data λ =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (ModuleMember λ)
forall λ (c :: * -> *).
Data λ =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ModuleMember λ -> c (ModuleMember λ)
forall λ (t :: * -> *) (c :: * -> *).
(Data λ, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (ModuleMember λ))
forall λ (t :: * -> * -> *) (c :: * -> *).
(Data λ, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (ModuleMember λ))
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u.
Int -> (forall d. Data d => d -> u) -> ModuleMember λ -> u
forall u. (forall d. Data d => d -> u) -> ModuleMember λ -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (ModuleMember λ)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ModuleMember λ -> c (ModuleMember λ)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (ModuleMember λ))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (ModuleMember λ))
$cgfoldl :: forall λ (c :: * -> *).
Data λ =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ModuleMember λ -> c (ModuleMember λ)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ModuleMember λ -> c (ModuleMember λ)
$cgunfold :: forall λ (c :: * -> *).
Data λ =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (ModuleMember λ)
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (ModuleMember λ)
$ctoConstr :: forall λ. Data λ => ModuleMember λ -> Constr
toConstr :: ModuleMember λ -> Constr
$cdataTypeOf :: forall λ. Data λ => ModuleMember λ -> DataType
dataTypeOf :: ModuleMember λ -> DataType
$cdataCast1 :: forall λ (t :: * -> *) (c :: * -> *).
(Data λ, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (ModuleMember λ))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (ModuleMember λ))
$cdataCast2 :: forall λ (t :: * -> * -> *) (c :: * -> *).
(Data λ, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (ModuleMember λ))
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (ModuleMember λ))
$cgmapT :: forall λ.
Data λ =>
(forall b. Data b => b -> b) -> ModuleMember λ -> ModuleMember λ
gmapT :: (forall b. Data b => b -> b) -> ModuleMember λ -> ModuleMember λ
$cgmapQl :: forall λ r r'.
Data λ =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r
$cgmapQr :: forall λ r r'.
Data λ =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ModuleMember λ -> r
$cgmapQ :: forall λ u.
Data λ =>
(forall d. Data d => d -> u) -> ModuleMember λ -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> ModuleMember λ -> [u]
$cgmapQi :: forall λ u.
Data λ =>
Int -> (forall d. Data d => d -> u) -> ModuleMember λ -> u
gmapQi :: forall u.
Int -> (forall d. Data d => d -> u) -> ModuleMember λ -> u
$cgmapM :: forall λ (m :: * -> *).
(Data λ, Monad m) =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
$cgmapMp :: forall λ (m :: * -> *).
(Data λ, MonadPlus m) =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
$cgmapMo :: forall λ (m :: * -> *).
(Data λ, MonadPlus m) =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d)
-> ModuleMember λ -> m (ModuleMember λ)
Data, ModuleMember λ -> ModuleMember λ -> Bool
(ModuleMember λ -> ModuleMember λ -> Bool)
-> (ModuleMember λ -> ModuleMember λ -> Bool)
-> Eq (ModuleMember λ)
forall λ. ModuleMember λ -> ModuleMember λ -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall λ. ModuleMember λ -> ModuleMember λ -> Bool
== :: ModuleMember λ -> ModuleMember λ -> Bool
$c/= :: forall λ. ModuleMember λ -> ModuleMember λ -> Bool
/= :: ModuleMember λ -> ModuleMember λ -> Bool
Eq, Int -> ModuleMember λ -> ShowS
[ModuleMember λ] -> ShowS
ModuleMember λ -> String
(Int -> ModuleMember λ -> ShowS)
-> (ModuleMember λ -> String)
-> ([ModuleMember λ] -> ShowS)
-> Show (ModuleMember λ)
forall λ. Int -> ModuleMember λ -> ShowS
forall λ. [ModuleMember λ] -> ShowS
forall λ. ModuleMember λ -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall λ. Int -> ModuleMember λ -> ShowS
showsPrec :: Int -> ModuleMember λ -> ShowS
$cshow :: forall λ. ModuleMember λ -> String
show :: ModuleMember λ -> String
$cshowList :: forall λ. [ModuleMember λ] -> ShowS
showList :: [ModuleMember λ] -> ShowS
Show)

data TypeRole λ = InferredRole
                | NominalRole
                | RepresentationalRole
                | PhantomRole
                deriving (Typeable (TypeRole λ)
Typeable (TypeRole λ) =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> TypeRole λ -> c (TypeRole λ))
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c (TypeRole λ))
-> (TypeRole λ -> Constr)
-> (TypeRole λ -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c (TypeRole λ)))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c (TypeRole λ)))
-> ((forall b. Data b => b -> b) -> TypeRole λ -> TypeRole λ)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r)
-> (forall u. (forall d. Data d => d -> u) -> TypeRole λ -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> TypeRole λ -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ))
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ))
-> Data (TypeRole λ)
TypeRole λ -> Constr
TypeRole λ -> DataType
(forall b. Data b => b -> b) -> TypeRole λ -> TypeRole λ
forall λ. Data λ => Typeable (TypeRole λ)
forall λ. Data λ => TypeRole λ -> Constr
forall λ. Data λ => TypeRole λ -> DataType
forall λ.
Data λ =>
(forall b. Data b => b -> b) -> TypeRole λ -> TypeRole λ
forall λ u.
Data λ =>
Int -> (forall d. Data d => d -> u) -> TypeRole λ -> u
forall λ u.
Data λ =>
(forall d. Data d => d -> u) -> TypeRole λ -> [u]
forall λ r r'.
Data λ =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r
forall λ r r'.
Data λ =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r
forall λ (m :: * -> *).
(Data λ, Monad m) =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
forall λ (m :: * -> *).
(Data λ, MonadPlus m) =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
forall λ (c :: * -> *).
Data λ =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (TypeRole λ)
forall λ (c :: * -> *).
Data λ =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> TypeRole λ -> c (TypeRole λ)
forall λ (t :: * -> *) (c :: * -> *).
(Data λ, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (TypeRole λ))
forall λ (t :: * -> * -> *) (c :: * -> *).
(Data λ, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (TypeRole λ))
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> TypeRole λ -> u
forall u. (forall d. Data d => d -> u) -> TypeRole λ -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (TypeRole λ)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> TypeRole λ -> c (TypeRole λ)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (TypeRole λ))
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (TypeRole λ))
$cgfoldl :: forall λ (c :: * -> *).
Data λ =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> TypeRole λ -> c (TypeRole λ)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> TypeRole λ -> c (TypeRole λ)
$cgunfold :: forall λ (c :: * -> *).
Data λ =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (TypeRole λ)
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (TypeRole λ)
$ctoConstr :: forall λ. Data λ => TypeRole λ -> Constr
toConstr :: TypeRole λ -> Constr
$cdataTypeOf :: forall λ. Data λ => TypeRole λ -> DataType
dataTypeOf :: TypeRole λ -> DataType
$cdataCast1 :: forall λ (t :: * -> *) (c :: * -> *).
(Data λ, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (TypeRole λ))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (TypeRole λ))
$cdataCast2 :: forall λ (t :: * -> * -> *) (c :: * -> *).
(Data λ, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (TypeRole λ))
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (TypeRole λ))
$cgmapT :: forall λ.
Data λ =>
(forall b. Data b => b -> b) -> TypeRole λ -> TypeRole λ
gmapT :: (forall b. Data b => b -> b) -> TypeRole λ -> TypeRole λ
$cgmapQl :: forall λ r r'.
Data λ =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r
$cgmapQr :: forall λ r r'.
Data λ =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> TypeRole λ -> r
$cgmapQ :: forall λ u.
Data λ =>
(forall d. Data d => d -> u) -> TypeRole λ -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> TypeRole λ -> [u]
$cgmapQi :: forall λ u.
Data λ =>
Int -> (forall d. Data d => d -> u) -> TypeRole λ -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> TypeRole λ -> u
$cgmapM :: forall λ (m :: * -> *).
(Data λ, Monad m) =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
$cgmapMp :: forall λ (m :: * -> *).
(Data λ, MonadPlus m) =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
$cgmapMo :: forall λ (m :: * -> *).
(Data λ, MonadPlus m) =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> TypeRole λ -> m (TypeRole λ)
Data, TypeRole λ -> TypeRole λ -> Bool
(TypeRole λ -> TypeRole λ -> Bool)
-> (TypeRole λ -> TypeRole λ -> Bool) -> Eq (TypeRole λ)
forall λ. TypeRole λ -> TypeRole λ -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall λ. TypeRole λ -> TypeRole λ -> Bool
== :: TypeRole λ -> TypeRole λ -> Bool
$c/= :: forall λ. TypeRole λ -> TypeRole λ -> Bool
/= :: TypeRole λ -> TypeRole λ -> Bool
Eq, Int -> TypeRole λ -> ShowS
[TypeRole λ] -> ShowS
TypeRole λ -> String
(Int -> TypeRole λ -> ShowS)
-> (TypeRole λ -> String)
-> ([TypeRole λ] -> ShowS)
-> Show (TypeRole λ)
forall λ. Int -> TypeRole λ -> ShowS
forall λ. [TypeRole λ] -> ShowS
forall λ. TypeRole λ -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall λ. Int -> TypeRole λ -> ShowS
showsPrec :: Int -> TypeRole λ -> ShowS
$cshow :: forall λ. TypeRole λ -> String
show :: TypeRole λ -> String
$cshowList :: forall λ. [TypeRole λ] -> ShowS
showList :: [TypeRole λ] -> ShowS
Show)

data Declaration λ l d s =
   ClassDeclaration (s (Abstract.Context l l d d)) (s (Abstract.TypeLHS l l d d)) [s (Abstract.Declaration l l d d)]
   | FunDepClassDeclaration !(Abstract.SupportFor 'Extensions.FunctionalDependencies λ)
                            (s (Abstract.Context l l d d)) (s (Abstract.TypeLHS l l d d))
                            [s (Abstract.FunctionalDependency l l d d)] [s (Abstract.Declaration l l d d)]
   | DataDeclaration (s (Abstract.Context l l d d)) (s (Abstract.TypeLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
                     [s (Abstract.DataConstructor l l d d)] [s (Abstract.DerivingClause l l d d)]
   | GADTDeclaration (s (Abstract.TypeLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
                     [s (Abstract.GADTConstructor l l d d)] [s (Abstract.DerivingClause l l d d)]
   | TypeDataDeclaration !(Abstract.SupportFor 'Extensions.TypeData λ)
                         (s (Abstract.TypeLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
                         [s (Abstract.DataConstructor l l d d)]
   | TypeGADTDeclaration !(Abstract.SupportFor 'Extensions.GADTs λ)
                         !(Abstract.SupportFor 'Extensions.TypeData λ)
                         (s (Abstract.TypeLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
                         [s (Abstract.GADTConstructor l l d d)]
   | DefaultDeclaration [s (Abstract.Type l l d d)]
   | NamedDefaultDeclaration !(Abstract.SupportFor 'Extensions.NamedDefaults λ)
                             (Abstract.QualifiedName λ) [s (Abstract.Type l l d d)]
   | DefaultMethodSignature !(Abstract.SupportFor 'Extensions.DefaultSignatures λ)
                             (Name λ) (s (Abstract.Context l l d d)) (s (Abstract.Type l l d d))
   | EquationDeclaration (s (Abstract.EquationLHS l l d d)) (s (Abstract.EquationRHS l l d d))
                         [s (Abstract.Declaration l l d d)]
   | FixityDeclaration (Associativity λ) (Maybe Int) (NonEmpty (Abstract.Name λ))
   | ExplicitTypeFixityDeclaration !(Abstract.SupportFor 'Extensions.ExplicitNamespaces λ)
                                   (Associativity λ) (Maybe Int) (NonEmpty (Abstract.Name λ))
   | ExplicitDataFixityDeclaration !(Abstract.SupportFor 'Extensions.ExplicitNamespaces λ)
                                   (Associativity λ) (Maybe Int) (NonEmpty (Abstract.Name λ))
   | ForeignExport (CallingConvention λ) (Maybe Text) (Abstract.Name λ) (s (Abstract.Type l l d d))
   | ForeignImport (CallingConvention λ) (Maybe (CallSafety λ)) (Maybe Text) (Abstract.Name λ)
                   (s (Abstract.Type l l d d))
   | InstanceDeclaration [TypeVarBinding λ l d s] (s (Abstract.Context l l d d))
                         (s (Abstract.ClassInstanceLHS l l d d)) [s (Abstract.Declaration l l d d)]
   | StandaloneDerivingDeclaration !(Abstract.SupportFor 'Extensions.StandaloneDeriving λ)
                                   [TypeVarBinding λ l d s]
                                   (s (Abstract.Context l l d d))
                                   (s (Abstract.ClassInstanceLHS l l d d))
   | StandaloneStrategicDerivingDeclaration !(Abstract.SupportFor 'Extensions.StandaloneDeriving λ)
                                            !(Abstract.SupportFor 'Extensions.DerivingStrategies λ)
                                            (s (Abstract.DerivingStrategy l l d d))
                                            [TypeVarBinding λ l d s]
                                            (s (Abstract.Context l l d d))
                                            (s (Abstract.ClassInstanceLHS l l d d))
   | NewtypeDeclaration (s (Abstract.Context l l d d)) (s (Abstract.TypeLHS l l d d))
                        (Maybe (s (Abstract.Kind l l d d))) (s (Abstract.DataConstructor l l d d))
                        [s (Abstract.DerivingClause l l d d)]
   | GADTNewtypeDeclaration (s (Abstract.TypeLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
                            (s (Abstract.GADTConstructor l l d d)) [s (Abstract.DerivingClause l l d d)]
   | TypeSynonymDeclaration (s (Abstract.TypeLHS l l d d)) (s (Abstract.Type l l d d))
   | TypeSignature (NonEmpty (Abstract.Name λ)) (s (Abstract.Context l l d d)) (s (Abstract.Type l l d d))
   | DataFamilyDeclaration (s (Abstract.TypeLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
   | OpenTypeFamilyDeclaration (s (Abstract.TypeLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
   | ClosedTypeFamilyDeclaration (s (Abstract.TypeLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
                                 [s (Abstract.Declaration l l d d)]
   | InjectiveOpenTypeFamilyDeclaration (s (Abstract.TypeLHS l l d d)) (TypeVarBinding λ l d s)
                                        (Maybe (Abstract.Name λ, NonEmpty (Abstract.Name λ)))
   | InjectiveClosedTypeFamilyDeclaration (s (Abstract.TypeLHS l l d d)) (TypeVarBinding λ l d s)
                                          (Maybe (Abstract.Name λ, NonEmpty (Abstract.Name λ)))
                                          [s (Abstract.Declaration l l d d)]
   | DataFamilyInstance [TypeVarBinding λ l d s] (s (Abstract.Context l l d d))
                        (s (Abstract.ClassInstanceLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
                        [s (Abstract.DataConstructor l l d d)]
                        [s (Abstract.DerivingClause l l d d)]
   | NewtypeFamilyInstance [TypeVarBinding λ l d s] (s (Abstract.Context l l d d))
                           (s (Abstract.ClassInstanceLHS l l d d)) (Maybe (s (Abstract.Kind l l d d)))
                           (s (Abstract.DataConstructor l l d d)) [s (Abstract.DerivingClause l l d d)]
   | GADTDataFamilyInstance [TypeVarBinding λ l d s] (s (Abstract.ClassInstanceLHS l l d d))
                            (Maybe (s (Abstract.Kind l l d d)))
                            [s (Abstract.GADTConstructor l l d d)] [s (Abstract.DerivingClause l l d d)]
   | GADTNewtypeFamilyInstance [TypeVarBinding λ l d s] (s (Abstract.ClassInstanceLHS l l d d))
                               (Maybe (s (Abstract.Kind l l d d)))
                               (s (Abstract.GADTConstructor l l d d)) [s (Abstract.DerivingClause l l d d)]
   | TypeFamilyInstance [TypeVarBinding λ l d s] (s (Abstract.ClassInstanceLHS l l d d))
                        (s (Abstract.Type l l d d))
   | KindSignature (Abstract.Name λ) (s (Abstract.Kind l l d d))
   | TypeRoleDeclaration (Abstract.QualifiedName λ) [Abstract.TypeRole λ]
   | ImplicitPatternSynonym !(Abstract.SupportFor 'Extensions.PatternSynonyms λ)
                            (s (Abstract.PatternLHS l l d d)) (s (Abstract.Pattern l l d d))
   | UnidirectionalPatternSynonym !(Abstract.SupportFor 'Extensions.PatternSynonyms λ)
                                  (s (Abstract.PatternLHS l l d d)) (s (Abstract.Pattern l l d d))
   | ExplicitPatternSynonym !(Abstract.SupportFor 'Extensions.PatternSynonyms λ)
                            (s (Abstract.PatternLHS l l d d)) (s (Abstract.Pattern l l d d))
                            [s (Abstract.PatternEquationClause l l d d)]
   | PatternSynonymSignature !(Abstract.SupportFor 'Extensions.PatternSynonyms λ)
                             (NonEmpty (Abstract.Name λ))
                             [TypeVarBinding λ l d s] (s (Abstract.Context l l d d))
                             [TypeVarBinding λ l d s] (s (Abstract.Context l l d d))
                             [s (Abstract.Type l l d d)]
                             (s (Abstract.Type l l d d))
   | ImplicitParameterDeclaration !(Abstract.SupportFor 'Extensions.ImplicitParameters λ)
                                  (Abstract.Name λ)
                                  (s (Abstract.Expression l l d d))

data PatternEquationClause λ l d s =
   PatternEquationClause !(Abstract.SupportFor 'Extensions.PatternSynonyms λ)
                         (s (Abstract.PatternEquationLHS l l d d))
                         (s (Abstract.EquationRHS l l d d))
                         [s (Abstract.Declaration l l d d)]

data PatternEquationLHS λ l d s =
   PrefixPatternEquationLHS (Abstract.Name λ) [s (Abstract.Pattern l l d d)]
   | InfixPatternEquationLHS (s (Abstract.Pattern l l d d)) (Abstract.Name λ) (s (Abstract.Pattern l l d d))

data FunctionalDependency λ l (d :: Kind.Type -> Kind.Type) (s :: Kind.Type -> Kind.Type) =
   FunctionalDependency [Abstract.Name λ] [Abstract.Name λ]

data GADTConstructor λ l d s =
   GADTConstructors (NonEmpty (Abstract.Name λ)) [TypeVarBinding λ l d s]
                    (s (Abstract.Context l l d d)) (s (Abstract.Type l l d d))

data DataConstructor λ l d s =
   Constructor (Abstract.Name λ) [s (Abstract.Type l l d d)]
   | RecordConstructor (Abstract.Name λ) [s (Abstract.FieldDeclaration l l d d)]
   | ExistentialConstructor [TypeVarBinding λ l d s] (s (Abstract.Context l l d d)) (s (Abstract.DataConstructor l l d d))

data DerivingClause λ l (d :: Kind.Type -> Kind.Type) (s :: Kind.Type -> Kind.Type) =
   SimpleDerive (Abstract.QualifiedName λ)
   | StrategicDerive !(Abstract.SupportFor 'Extensions.DerivingStrategies λ)
                     (s (Abstract.DerivingStrategy l l d d)) [s (Abstract.Type l l d d)]
   | DeriveVia !(Abstract.SupportFor 'Extensions.DerivingVia λ)
               [s (Abstract.Type l l d d)] (s (Abstract.Type l l d d))

data DerivingStrategy λ l (d :: Kind.Type -> Kind.Type) (s :: Kind.Type -> Kind.Type) =
   Default | Stock | AnyClass | Newtype
   | Via !(Abstract.SupportFor 'Extensions.DerivingVia λ) (s (Abstract.Type l l d d))

data Context λ l d s =
   ClassConstraint (Abstract.QualifiedName λ) (s (Abstract.Type l l d d))
   | Constraints [s (Abstract.Context l l d d)]
   | TypeConstraint (s (Abstract.Type l l d d))
   | TypeEquality (s (Abstract.Type l l d d)) (s (Abstract.Type l l d d))
   | ImplicitParameterConstraint !(Abstract.SupportFor 'Extensions.ImplicitParameters λ)
                                 (Abstract.Name λ)
                                 (s (Abstract.Type l l d d))
   | NoContext

data Type λ l d s =
   ConstructorType (s (Abstract.Constructor l l d d))
   | FunctionConstructorType
   | FunctionType (s (Abstract.Type l l d d)) (s (Abstract.Type l l d d))
   | LinearFunctionType (s (Abstract.Type l l d d)) (s (Abstract.Type l l d d))
   | MultiplicityFunctionType (s (Abstract.Type l l d d)) (s (Abstract.Type l l d d)) (s (Abstract.Type l l d d))
   | RecordFunctionType [s (Abstract.FieldDeclaration l l d d)] (s (Abstract.Type l l d d))
   | ListType (s (Abstract.Type l l d d))
   | StrictType (s (Abstract.Type l l d d))
   | LazyType !(Abstract.SupportFor 'Extensions.StrictData λ) (s (Abstract.Type l l d d))
   | TupleType (NonEmpty (s (Abstract.Type l l d d)))
   | UnboxedTupleType !(Abstract.SupportFor 'Extensions.UnboxedTuples λ) (NonEmpty (s (Abstract.Type l l d d)))
   | UnboxedSumType !(Abstract.SupportFor 'Extensions.UnboxedSums λ) (NonEmpty (s (Abstract.Type l l d d)))
   | TypeApplication (s (Abstract.Type l l d d)) (s (Abstract.Type l l d d))
   | InfixTypeApplication (s (Abstract.Type l l d d)) (Abstract.QualifiedName λ) (s (Abstract.Type l l d d))
   | TypeVariable (Abstract.Name λ)
   | ForallType [TypeVarBinding λ l d s] (s (Abstract.Type l l d d))
   | ConstrainedType (s (Abstract.Context l l d d)) (s (Abstract.Type l l d d))
   | ConstraintType (s (Abstract.Context l l d d))
   | KindedType (s (Abstract.Type l l d d)) (s (Abstract.Kind l l d d))
   | TypeWildcard
   | TypeKind (s (Abstract.Type l l d d))
   | GroundTypeKind
   | VisibleDependentType [TypeVarBinding λ l d s] (s (Abstract.Type l l d d))
   | PromotedConstructorType (s (Abstract.Constructor l l d d))
   | PromotedTupleType [s (Abstract.Type l l d d)]
   | PromotedListType [s (Abstract.Type l l d d)]
   | PromotedIntegerLiteral Integer
   | PromotedCharLiteral Char
   | PromotedStringLiteral Text
   | PromotedInfixTypeApplication (s (Abstract.Type l l d d)) (Abstract.QualifiedName λ) (s (Abstract.Type l l d d))
   | VisibleKindApplication (s (Abstract.Type l l d d)) (s (Abstract.Kind l l d d))

data TypeVarBinding λ l d s =
   ExplicitlyKindedTypeVariable Bool (Abstract.Name λ) (s (Abstract.Kind l l d d))
   | ImplicitlyKindedTypeVariable Bool (Abstract.Name λ)

data TypeLHS λ l d s =
   SimpleTypeLHS (Abstract.Name λ) [TypeVarBinding λ l d s]
   | TypeLHSApplication (s (Abstract.TypeLHS l l d d)) (TypeVarBinding λ l d s)
   | TypeLHSTypeApplication !(Abstract.SupportFor 'Extensions.TypeAbstractions λ)
                            (s (Abstract.TypeLHS l l d d))
                            (TypeVarBinding λ l d s)

data ClassInstanceLHS λ l d s =
   TypeClassInstanceLHS (Abstract.QualifiedName λ) (s (Abstract.Type l l d d))
   | ClassReferenceInstanceLHS (Abstract.QualifiedName λ)
   | InfixTypeClassInstanceLHS (s (Abstract.Type l l d d)) (Abstract.QualifiedName λ) (s (Abstract.Type l l d d))
   | ClassInstanceLHSApplication (s (Abstract.ClassInstanceLHS l l d d)) (s (Abstract.Type l l d d))
   | ClassInstanceLHSKindApplication (s (Abstract.ClassInstanceLHS l l d d)) (s (Abstract.Kind l l d d))

data Expression λ l d s =
   ApplyExpression (s (Abstract.Expression l l d d)) (s (Abstract.Expression l l d d))
   | ConditionalExpression (s (Abstract.Expression l l d d)) (s (Abstract.Expression l l d d))
                           (s (Abstract.Expression l l d d))
   | ConstructorExpression (s (Abstract.Constructor l l d d))
   | CaseExpression (s (Abstract.Expression l l d d)) [s (Abstract.CaseAlternative l l d d)]
   | LambdaCaseExpression !(Abstract.SupportFor 'Extensions.LambdaCase λ) [s (Abstract.CaseAlternative l l d d)]
   | LambdaCasesExpression !(Abstract.SupportFor 'Extensions.LambdaCase λ)
                           [s (Abstract.LambdaCasesAlternative l l d d)]
   | MultiWayIfExpression [s (Abstract.GuardedExpression l l d d)]
   | DoExpression (s (Abstract.GuardedExpression l l d d))
   | MDoExpression (s (Abstract.GuardedExpression l l d d))
   | QualifiedDoExpression !(Abstract.SupportFor 'Extensions.QualifiedDo λ)
                           (Abstract.ModuleName λ) (s (Abstract.GuardedExpression l l d d))
   | MDoQualifiedExpression !(Abstract.SupportFor 'Extensions.QualifiedDo λ)
                            !(Abstract.SupportFor 'Extensions.RecursiveDo λ)
                            (Abstract.ModuleName λ) (s (Abstract.GuardedExpression l l d d))
   | InfixExpression (s (Abstract.Expression l l d d)) (s (Abstract.Expression l l d d))
                     (s (Abstract.Expression l l d d))
   | LeftSectionExpression (s (Abstract.Expression l l d d)) (Abstract.QualifiedName λ)
   | LambdaExpression [s (Abstract.Pattern l l d d)] (s (Abstract.Expression l l d d))
   | LetExpression [s (Abstract.Declaration l l d d)] (s (Abstract.Expression l l d d))
   | ListComprehension (s (Abstract.Expression l l d d)) (NonEmpty (s (Abstract.Statement l l d d)))
   | ParallelListComprehension (s (Abstract.Expression l l d d)) (NonEmpty (s (Abstract.Statement l l d d)))
                               (NonEmpty (s (Abstract.Statement l l d d))) [NonEmpty (s (Abstract.Statement l l d d))]
   | ListExpression [s (Abstract.Expression l l d d)]
   | LiteralExpression (s (Abstract.Value l l d d))
   | Negate
   | RecordExpression (s (Abstract.Expression l l d d)) [s (Abstract.FieldBinding l l d d)]
   | ReferenceExpression (Abstract.QualifiedName λ)
   | RightSectionExpression (Abstract.QualifiedName λ) (s (Abstract.Expression l l d d))
   | SequenceExpression (s (Abstract.Expression l l d d)) (Maybe (s (Abstract.Expression l l d d)))
                        (Maybe (s (Abstract.Expression l l d d)))
   | TupleExpression (NonEmpty (s (Abstract.Expression l l d d)))
   | TupleSectionExpression (NonEmpty (Maybe (s (Abstract.Expression l l d d))))
   | UnboxedSumExpression !(Abstract.SupportFor 'Extensions.UnboxedSums λ)
                          Int (s (Abstract.Expression l l d d)) Int
   | UnboxedTupleExpression !(Abstract.SupportFor 'Extensions.UnboxedTuples λ)
                            (NonEmpty (s (Abstract.Expression l l d d)))
   | UnboxedTupleSectionExpression !(Abstract.SupportFor 'Extensions.UnboxedTuples λ)
                                   (NonEmpty (Maybe (s (Abstract.Expression l l d d))))
   | TypedExpression (s (Abstract.Expression l l d d)) (s (Abstract.Type l l d d))
   | VisibleTypeApplication (s (Abstract.Expression l l d d)) (s (Abstract.Type l l d d))
   | ExplicitTypeExpression !(Abstract.SupportFor 'Extensions.ExplicitNamespaces λ) (s (Abstract.Type l l d d))
   | OverloadedLabel Text
   | ImplicitParameterExpression !(Abstract.SupportFor 'Extensions.ImplicitParameters λ) (Abstract.Name λ)
   | GetField (s (Abstract.Expression l l d d)) (Abstract.Name λ)
   | FieldProjection (NonEmpty (Abstract.Name λ))
   | WildcardRecordExpression !(Abstract.SupportFor 'Extensions.RecordWildCards λ)
                               (Abstract.QualifiedName λ)
                               [s (Abstract.FieldBinding l l d d)]

data LambdaCasesAlternative λ l d s =
   LambdaCasesAlternative !(Abstract.SupportFor 'Extensions.LambdaCase λ)
                          [s (Abstract.Pattern l l d d)] (s (Abstract.EquationRHS l l d d))

data FieldBinding λ l d s =
   FieldBinding (Abstract.QualifiedName λ) (s (Abstract.Expression l l d d))
   | PunnedFieldBinding (Abstract.QualifiedName λ)

data Pattern λ l d s =
   AsPattern (Abstract.Name λ) (s (Abstract.Pattern l l d d))
   | ConstructorPattern (s (Abstract.Constructor l l d d)) [s (Abstract.Type l l d d)] [s (Abstract.Pattern l l d d)]
   | InfixPattern (s (Abstract.Pattern l l d d)) (Abstract.QualifiedName λ) (s (Abstract.Pattern l l d d))
   | IrrefutablePattern (s (Abstract.Pattern l l d d))
   | ListPattern [s (Abstract.Pattern l l d d)]
   | LiteralPattern (s (Abstract.Value l l d d))
   | RecordPattern (Abstract.QualifiedName λ) [s (Abstract.FieldPattern l l d d)]
   | WildcardRecordPattern !(Abstract.SupportFor 'Extensions.RecordWildCards λ)
                            (Abstract.QualifiedName λ)
                            [s (Abstract.FieldPattern l l d d)]
   | TypedPattern (s (Abstract.Pattern l l d d)) (s (Abstract.Type l l d d))
   | InvisibleTypePattern !(Abstract.SupportFor 'Extensions.TypeAbstractions λ) (s (Abstract.Type l l d d))
   | ExplicitTypePattern !(Abstract.SupportFor 'Extensions.ExplicitNamespaces λ) (s (Abstract.Type l l d d))
   | BangPattern !(Abstract.SupportFor 'Extensions.BangPatterns λ) (s (Abstract.Pattern l l d d))
   | LazyPattern !(Abstract.SupportFor 'Extensions.Strict λ) (s (Abstract.Pattern l l d d))
   | ViewPattern !(Abstract.SupportFor 'Extensions.ViewPatterns λ)
                  (s (Abstract.Expression l l d d))
                  (s (Abstract.Pattern l l d d))
   | NPlusKPattern !(Abstract.SupportFor 'Extensions.NPlusKPatterns λ) (Abstract.Name λ) Integer
   | TuplePattern (NonEmpty (s (Abstract.Pattern l l d d)))
   | UnboxedTuplePattern !(Abstract.SupportFor 'Extensions.UnboxedTuples λ) (NonEmpty (s (Abstract.Pattern l l d d)))
   | UnboxedSumPattern !(Abstract.SupportFor 'Extensions.UnboxedSums λ)
                       Int (s (Abstract.Pattern l l d d)) Int
   | VariablePattern (Abstract.Name λ)
   | WildcardPattern

data PatternLHS λ l (d :: Kind.Type -> Kind.Type) (s :: Kind.Type -> Kind.Type) =
   PrefixPatternLHS (Name λ) [Name λ]
   | InfixPatternLHS (Name λ) (Name λ) (Name λ)
   | RecordPatternLHS (Name λ) [Name λ]

data FieldPattern λ l d s =
  FieldPattern (Abstract.QualifiedName λ) (s (Abstract.Pattern l l d d))
  | PunnedFieldPattern (Abstract.QualifiedName λ)

data Statement λ l d s =
   BindStatement (s (Abstract.Pattern l l d d)) (s (Abstract.Expression l l d d))
   | ExpressionStatement (s (Abstract.Expression l l d d))
   | LetStatement [s (Abstract.Declaration l l d d)]
   | RecursiveStatement [s (Abstract.Statement l l d d)]

data Constructor λ l (d :: Kind.Type -> Kind.Type) (s :: Kind.Type -> Kind.Type) =
   ConstructorReference (Abstract.QualifiedName λ)
   | EmptyListConstructor
   | TupleConstructor Int
   | UnboxedTupleConstructor !(Abstract.SupportFor 'Extensions.UnboxedTuples λ) Int
   | UnboxedSumConstructor !(Abstract.SupportFor 'Extensions.UnboxedSums λ) Int
   | UnitConstructor

data Value λ l (d :: Kind.Type -> Kind.Type) (s :: Kind.Type -> Kind.Type) =
   CharLiteral Char
   | FloatingLiteral Rational
   | IntegerLiteral Integer
   | StringLiteral Text
   | HashLiteral !(Abstract.SupportFor 'Extensions.MagicHash λ) (Value λ l d s)
   | ExtendedLiteral !(Abstract.SupportFor 'Extensions.ExtendedLiterals λ) Integer (Name λ)

data CallSafety λ = SafeCall | UnsafeCall | InterruptibleCall !(Abstract.SupportFor 'Extensions.InterruptibleFFI λ)
data CallingConvention λ = CCall | CppCall | DotNetCall | JvmCall | StdCall
                         | CApiCall !(Abstract.SupportFor 'Extensions.CApiFFI λ)

deriving instance Typeable (Export λ l d s)
deriving instance (Data (Abstract.Members λ), Data (Abstract.ModuleName λ), Data (Abstract.QualifiedName λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Export λ l d s)
deriving instance (Show (Abstract.Members λ),
                   Show (Abstract.ModuleName λ), Show (Abstract.QualifiedName λ)) => Show (Export λ l d s)
deriving instance (Eq (Abstract.Members λ),
                   Eq (Abstract.ModuleName λ), Eq (Abstract.QualifiedName λ)) => Eq (Export λ l d s)

deriving instance Typeable (Import λ l d s)
deriving instance (Data (s (Abstract.ImportSpecification l l d d)), Data (Abstract.ModuleName λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Import λ l d s)
deriving instance (Show (s (Abstract.ImportSpecification l l d d)), Show (Abstract.ModuleName λ)) =>
                  Show (Import λ l d s)
deriving instance (Eq (s (Abstract.ImportSpecification l l d d)), Eq (Abstract.ModuleName λ)) =>
                  Eq (Import λ l d s)

deriving instance Typeable (ImportItem λ l d s)
deriving instance (Data (Abstract.Members λ), Data (Abstract.Name λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (ImportItem λ l d s)
deriving instance (Show (Abstract.Members λ), Show (Abstract.Name λ)) => Show (ImportItem λ l d s)
deriving instance (Eq (Abstract.Members λ), Eq (Abstract.Name λ)) => Eq (ImportItem λ l d s)

deriving instance (Data λ, Data (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ)) => Data (Members λ)
deriving instance (Show (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ)) => Show (Members λ)
deriving instance (Eq (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ)) => Eq (Members λ)

deriving instance Typeable (Declaration λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ),
                   Data (Abstract.SupportFor 'Extensions.StandaloneDeriving λ),
                   Data (Abstract.SupportFor 'Extensions.DerivingStrategies λ),
                   Data (Abstract.SupportFor 'Extensions.DefaultSignatures λ),
                   Data (Abstract.SupportFor 'Extensions.GADTs λ),
                   Data (Abstract.SupportFor 'Extensions.NamedDefaults λ),
                   Data (Abstract.SupportFor 'Extensions.TypeData λ),
                   Data (Abstract.SupportFor 'Extensions.FunctionalDependencies λ),
                   Data (Abstract.SupportFor 'Extensions.ImplicitParameters λ),
                   Data (Abstract.SupportFor 'Extensions.InterruptibleFFI λ),
                   Data (Abstract.SupportFor 'Extensions.CApiFFI λ),
                   Data (Abstract.SupportFor 'Extensions.PatternSynonyms λ),
                   Data (s (Abstract.Context l l d d)), Data (s (Abstract.Kind l l d d)),
                   Data (s (Abstract.FunctionalDependency l l d d)),
                   Data (s (Abstract.DataConstructor l l d d)), Data (s (Abstract.GADTConstructor l l d d)),
                   Data (s (Abstract.DerivingStrategy l l d d)),
                   Data (s (Abstract.Declaration l l d d)), Data (s (Abstract.DerivingClause l l d d)),
                   Data (s (Abstract.EquationLHS l l d d)), Data (s (Abstract.EquationRHS l l d d)),
                   Data (s (Abstract.Expression l l d d)),
                   Data (s (Abstract.Type l l d d)), Data (s (Abstract.TypeLHS l l d d)),
                   Data (s (Abstract.Kind l l d d)), Data (s (Abstract.ClassInstanceLHS l l d d)),
                   Data (s (Abstract.PatternLHS l l d d)), Data (s (Abstract.PatternEquationClause l l d d)),
                   Data (s (Abstract.Pattern l l d d)),
                   Data (Abstract.TypeVarBinding λ l d s),
                   Data (Abstract.Name λ), Data (Abstract.QualifiedName λ), Data (Abstract.TypeRole λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Declaration λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ),
                   Show (Abstract.SupportFor 'Extensions.StandaloneDeriving λ),
                   Show (Abstract.SupportFor 'Extensions.DerivingStrategies λ),
                   Show (Abstract.SupportFor 'Extensions.DefaultSignatures λ),
                   Show (Abstract.SupportFor 'Extensions.GADTs λ),
                   Show (Abstract.SupportFor 'Extensions.NamedDefaults λ),
                   Show (Abstract.SupportFor 'Extensions.TypeData λ),
                   Show (Abstract.SupportFor 'Extensions.FunctionalDependencies λ),
                   Show (Abstract.SupportFor 'Extensions.ImplicitParameters λ),
                   Show (Abstract.SupportFor 'Extensions.InterruptibleFFI λ),
                   Show (Abstract.SupportFor 'Extensions.CApiFFI λ),
                   Show (Abstract.SupportFor 'Extensions.PatternSynonyms λ),
                   Show (s (Abstract.Context l l d d)), Show (s (Abstract.Kind l l d d)),
                   Show (s (Abstract.FunctionalDependency l l d d)),
                   Show (s (Abstract.DataConstructor l l d d)), Show (s (Abstract.GADTConstructor l l d d)),
                   Show (s (Abstract.DerivingStrategy l l d d)),
                   Show (s (Abstract.Declaration l l d d)), Show (s (Abstract.DerivingClause l l d d)),
                   Show (s (Abstract.EquationLHS l l d d)), Show (s (Abstract.EquationRHS l l d d)),
                   Show (s (Abstract.Expression l l d d)),
                   Show (s (Abstract.Type l l d d)), Show (s (Abstract.TypeLHS l l d d)),
                   Show (s (Abstract.Kind l l d d)), Show (s (Abstract.ClassInstanceLHS l l d d)),
                   Show (s (Abstract.PatternLHS l l d d)), Show (s (Abstract.PatternEquationClause l l d d)),
                   Show (s (Abstract.Pattern l l d d)),
                   Show (Abstract.TypeVarBinding λ l d s),
                   Show (Abstract.Name λ), Show (Abstract.QualifiedName λ),
                   Show (Abstract.TypeRole λ)) => Show (Declaration λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ),
                   Eq (Abstract.SupportFor 'Extensions.StandaloneDeriving λ),
                   Eq (Abstract.SupportFor 'Extensions.DerivingStrategies λ),
                   Eq (Abstract.SupportFor 'Extensions.DefaultSignatures λ),
                   Eq (Abstract.SupportFor 'Extensions.GADTs λ),
                   Eq (Abstract.SupportFor 'Extensions.NamedDefaults λ),
                   Eq (Abstract.SupportFor 'Extensions.TypeData λ),
                   Eq (Abstract.SupportFor 'Extensions.FunctionalDependencies λ),
                   Eq (Abstract.SupportFor 'Extensions.ImplicitParameters λ),
                   Eq (Abstract.SupportFor 'Extensions.InterruptibleFFI λ),
                   Eq (Abstract.SupportFor 'Extensions.CApiFFI λ),
                   Eq (Abstract.SupportFor 'Extensions.PatternSynonyms λ),
                   Eq (s (Abstract.Context l l d d)), Eq (s (Abstract.Kind l l d d)),
                   Eq (s (Abstract.DataConstructor l l d d)), Eq (s (Abstract.GADTConstructor l l d d)),
                   Eq (s (Abstract.DerivingStrategy l l d d)),
                   Eq (s (Abstract.FunctionalDependency l l d d)),
                   Eq (s (Abstract.Declaration l l d d)), Eq (s (Abstract.DerivingClause l l d d)),
                   Eq (s (Abstract.EquationLHS l l d d)), Eq (s (Abstract.EquationRHS l l d d)),
                   Eq (s (Abstract.Expression l l d d)),
                   Eq (s (Abstract.Type l l d d)), Eq (s (Abstract.TypeLHS l l d d)), Eq (s (Abstract.Kind l l d d)),
                   Eq (s (Abstract.ClassInstanceLHS l l d d)),
                   Eq (s (Abstract.PatternLHS l l d d)), Eq (s (Abstract.PatternEquationClause l l d d)),
                   Eq (s (Abstract.Pattern l l d d)),
                   Eq (Abstract.TypeVarBinding λ l d s),
                   Eq (Abstract.Name λ), Eq (Abstract.QualifiedName λ),
                   Eq (Abstract.TypeRole λ)) => Eq (Declaration λ l d s)

deriving instance Typeable (PatternEquationClause λ l d s)
deriving instance (Typeable λ, Typeable l, Typeable d, Typeable s,
                   Data (Abstract.SupportFor 'Extensions.PatternSynonyms λ),
                   Data (s (Abstract.PatternEquationLHS l l d d)), Data (s (Abstract.EquationRHS l l d d)),
                   Data (s (Abstract.Declaration l l d d))) => Data (PatternEquationClause λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.PatternSynonyms λ),
                   Eq (s (Abstract.PatternEquationLHS l l d d)), Eq (s (Abstract.EquationRHS l l d d)),
                   Eq (s (Abstract.Declaration l l d d))) => Eq (PatternEquationClause λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.PatternSynonyms λ),
                   Show (s (Abstract.PatternEquationLHS l l d d)), Show (s (Abstract.EquationRHS l l d d)),
                   Show (s (Abstract.Declaration l l d d))) => Show (PatternEquationClause λ l d s)

deriving instance Typeable (PatternEquationLHS λ l d s)
deriving instance (Typeable λ, Typeable l, Typeable d, Typeable s,
                   Data (Abstract.Name λ), Data (s (Abstract.Pattern l l d d))) => Data (PatternEquationLHS λ l d s)
deriving instance (Eq (Abstract.Name λ), Eq (s (Abstract.Pattern l l d d))) => Eq (PatternEquationLHS λ l d s)
deriving instance (Show (Abstract.Name λ), Show (s (Abstract.Pattern l l d d))) => Show (PatternEquationLHS λ l d s)

deriving instance Typeable (FunctionalDependency λ l d s)
deriving instance (Data (Abstract.Name λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (FunctionalDependency λ l d s)
deriving instance (Show (Abstract.Name λ)) => Show (FunctionalDependency λ l d s)
deriving instance (Eq (Abstract.Name λ)) => Eq (FunctionalDependency λ l d s)

deriving instance Typeable (DataConstructor λ l d s)
deriving instance (Data (s (Abstract.Context l l d d)), Data (s (Abstract.DataConstructor l l d d)),
                   Data (s (Abstract.FieldDeclaration l l d d)), Data (s (Abstract.Type l l d d)),
                   Data (s (Abstract.Kind l l d d)), Data (Abstract.Name λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (DataConstructor λ l d s)
deriving instance (Show (s (Abstract.Context l l d d)), Show (s (Abstract.DataConstructor l l d d)),
                   Show (s (Abstract.FieldDeclaration l l d d)), Show (s (Abstract.Type l l d d)),
                   Show (s (Abstract.Kind l l d d)), Show (Abstract.Name λ)) => Show (DataConstructor λ l d s)
deriving instance (Eq (s (Abstract.Context l l d d)), Eq (s (Abstract.DataConstructor l l d d)),
                   Eq (s (Abstract.FieldDeclaration l l d d)), Eq (s (Abstract.Type l l d d)),
                   Eq (s (Abstract.Kind l l d d)), Eq (Abstract.Name λ)) => Eq (DataConstructor λ l d s)

deriving instance Typeable (GADTConstructor λ l d s)
deriving instance (Data (s (Abstract.Context l l d d)), Data (s (Abstract.Type l l d d)),
                   Data (s (Abstract.Kind l l d d)), Data (Abstract.Name λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (GADTConstructor λ l d s)
deriving instance (Show (s (Abstract.Context l l d d)), Show (s (Abstract.Type l l d d)),
                   Show (s (Abstract.Kind l l d d)),
                   Show (Abstract.Name λ), Show (Abstract.Name λ)) => Show (GADTConstructor λ l d s)
deriving instance (Eq (s (Abstract.Context l l d d)), Eq (s (Abstract.Type l l d d)),
                   Eq (s (Abstract.Kind l l d d)),
                   Eq (Abstract.Name λ), Eq (Abstract.Name λ)) => Eq (GADTConstructor λ l d s)

deriving instance Typeable (DerivingClause λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.DerivingStrategies λ),
                   Data (Abstract.SupportFor 'Extensions.DerivingVia λ),
                   Data (Abstract.QualifiedName λ), Data (s (Abstract.Type l l d d)),
                   Data (s (Abstract.DerivingStrategy l l d d)),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (DerivingClause λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.DerivingStrategies λ),
                   Show (Abstract.SupportFor 'Extensions.DerivingVia λ),
                   Show (Abstract.QualifiedName λ), Show (s (Abstract.Type l l d d)),
                   Show (s (Abstract.DerivingStrategy l l d d))) => Show (DerivingClause λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.DerivingStrategies λ),
                   Eq (Abstract.SupportFor 'Extensions.DerivingVia λ),
                   Eq (Abstract.QualifiedName λ), Eq (s (Abstract.Type l l d d)),
                   Eq (s (Abstract.DerivingStrategy l l d d))) => Eq (DerivingClause λ l d s)

deriving instance Typeable (DerivingStrategy λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.DerivingVia λ),
                   Data λ, Typeable l, Typeable d, Typeable s, Data (s (Abstract.Type l l d d))) =>
                  Data (DerivingStrategy λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.DerivingVia λ),
                   Show (s (Abstract.Type l l d d))) => Show (DerivingStrategy λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.DerivingVia λ),
                   Eq (s (Abstract.Type l l d d))) => Eq (DerivingStrategy λ l d s)

deriving instance Typeable (Type λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Data (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Data (Abstract.SupportFor 'Extensions.StrictData λ),
                   Data (s (Abstract.Constructor l l d d)), Data (s (Abstract.Context l l d d)),
                   Data (s (Abstract.Kind l l d d)), Data (s (Abstract.Type l l d d)),
                   Data (s (Abstract.FieldDeclaration l l d d)),
                   Data (Abstract.Name λ), Data (Abstract.QualifiedName λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Type λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Show (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Show (Abstract.SupportFor 'Extensions.StrictData λ),
                   Show (s (Abstract.Constructor l l d d)), Show (s (Abstract.Context l l d d)),
                   Show (s (Abstract.Kind l l d d)), Show (s (Abstract.Type l l d d)),
                   Show (s (Abstract.FieldDeclaration l l d d)),
                   Show (Abstract.Name λ), Show (Abstract.QualifiedName λ)) => Show (Type λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Eq (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Eq (Abstract.SupportFor 'Extensions.StrictData λ),
                   Eq (s (Abstract.Constructor l l d d)), Eq (s (Abstract.Context l l d d)),
                   Eq (s (Abstract.Kind l l d d)), Eq (s (Abstract.Type l l d d)),
                   Eq (s (Abstract.FieldDeclaration l l d d)),
                   Eq (Abstract.Name λ), Eq (Abstract.QualifiedName λ)) => Eq (Type λ l d s)

deriving instance Typeable (TypeVarBinding λ l d s)
deriving instance (Data (s (Abstract.Kind l l d d)), Data (Abstract.Name λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (TypeVarBinding λ l d s)
deriving instance (Show (s (Abstract.Kind l l d d)), Show (Abstract.Name λ)) => Show (TypeVarBinding λ l d s)
deriving instance (Eq (s (Abstract.Kind l l d d)), Eq (Abstract.Name λ)) => Eq (TypeVarBinding λ l d s)

deriving instance Typeable (TypeLHS λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.TypeAbstractions λ),
                   Data (s (Abstract.Type l l d d)), Data (s (Abstract.TypeLHS l l d d)),
                   Data (s (Abstract.Kind l l d d)),
                   Data (Abstract.QualifiedName λ), Data (Abstract.Name λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (TypeLHS λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.TypeAbstractions λ),
                   Show (s (Abstract.Type l l d d)), Show (s (Abstract.TypeLHS l l d d)),
                   Show (s (Abstract.Kind l l d d)),
                   Show (Abstract.QualifiedName λ), Show (Abstract.Name λ)) => Show (TypeLHS λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.TypeAbstractions λ),
                   Eq (s (Abstract.Type l l d d)), Eq (s (Abstract.TypeLHS l l d d)), Eq (s (Abstract.Kind l l d d)),
                   Eq (Abstract.QualifiedName λ), Eq (Abstract.Name λ)) => Eq (TypeLHS λ l d s)

deriving instance Typeable (ClassInstanceLHS λ l d s)
deriving instance (Data (s (Abstract.ClassInstanceLHS l l d d)), Data (s (Abstract.Type l l d d)),
                   Data (s (Abstract.Kind l l d d)), Data (Abstract.QualifiedName λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (ClassInstanceLHS λ l d s)
deriving instance (Show (s (Abstract.ClassInstanceLHS l l d d)), Show (s (Abstract.Type l l d d)),
                   Show (s (Abstract.Kind l l d d)), Show (Abstract.QualifiedName λ)) => Show (ClassInstanceLHS λ l d s)
deriving instance (Eq (s (Abstract.ClassInstanceLHS l l d d)), Eq (s (Abstract.Type l l d d)),
                   Eq (s (Abstract.Kind l l d d)), Eq (Abstract.QualifiedName λ)) => Eq (ClassInstanceLHS λ l d s)

deriving instance Typeable (Context λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.ImplicitParameters λ),
                   Data (s (Abstract.Context l l d d)), Data (s (Abstract.Type l l d d)),
                   Data (Abstract.Name λ), Data (Abstract.QualifiedName λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Context λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.ImplicitParameters λ),
                   Show (s (Abstract.Context l l d d)), Show (s (Abstract.Type l l d d)),
                   Show (Abstract.QualifiedName λ), Show (Abstract.Name λ)) => Show (Context λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.ImplicitParameters λ),
                   Eq (s (Abstract.Context l l d d)), Eq (s (Abstract.Type l l d d)),
                   Eq (Abstract.QualifiedName λ), Eq (Abstract.Name λ)) => Eq (Context λ l d s)

deriving instance Typeable (Expression λ l d s)
deriving instance (Typeable (Abstract.Pattern l), Typeable (Abstract.EquationRHS l),
                   Data (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ),
                   Data (Abstract.SupportFor 'Extensions.ImplicitParameters λ),
                   Data (Abstract.SupportFor 'Extensions.QualifiedDo λ),
                   Data (Abstract.SupportFor 'Extensions.RecursiveDo λ),
                   Data (Abstract.SupportFor 'Extensions.LambdaCase λ),
                   Data (Abstract.SupportFor 'Extensions.RecordWildCards λ),
                   Data (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Data (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Data (s (Abstract.CaseAlternative l l d d)), Data (s (Abstract.Constructor l l d d)),
                   Data (s (Abstract.Expression l l d d)), Data (s (Abstract.GuardedExpression l l d d)),
                   Data (s (Abstract.Declaration l l d d)), Data (s (Abstract.FieldBinding l l d d)),
                   Data (s (Abstract.Pattern l l d d)), Data (s (Abstract.Statement l l d d)),
                   Data (s (Abstract.LambdaCasesAlternative l l d d)),
                   Data (s (Abstract.Type l l d d)), Data (s (Abstract.Value l l d d)),
                   Data (Abstract.QualifiedName λ), Data (Abstract.ModuleName λ), Data (Abstract.Name λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Expression λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ),
                   Show (Abstract.SupportFor 'Extensions.ImplicitParameters λ),
                   Show (Abstract.SupportFor 'Extensions.QualifiedDo λ),
                   Show (Abstract.SupportFor 'Extensions.RecursiveDo λ),
                   Show (Abstract.SupportFor 'Extensions.LambdaCase λ),
                   Show (Abstract.SupportFor 'Extensions.RecordWildCards λ),
                   Show (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Show (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Show (s (Abstract.CaseAlternative l l d d)), Show (s (Abstract.Constructor l l d d)),
                   Show (s (Abstract.Expression l l d d)), Show (s (Abstract.GuardedExpression l l d d)),
                   Show (s (Abstract.Declaration l l d d)), Show (s (Abstract.FieldBinding l l d d)),
                   Show (s (Abstract.Pattern l l d d)), Show (s (Abstract.Statement l l d d)),
                   Show (s (Abstract.LambdaCasesAlternative l l d d)),
                   Show (s (Abstract.EquationRHS l l d d)),
                   Show (s (Abstract.Type l l d d)), Show (s (Abstract.Value l l d d)),
                   Show (Abstract.QualifiedName λ), Show (Abstract.ModuleName λ),
                   Show (Abstract.Name λ)) => Show (Expression λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ),
                   Eq (Abstract.SupportFor 'Extensions.ImplicitParameters λ),
                   Eq (Abstract.SupportFor 'Extensions.QualifiedDo λ),
                   Eq (Abstract.SupportFor 'Extensions.RecursiveDo λ),
                   Eq (Abstract.SupportFor 'Extensions.LambdaCase λ),
                   Eq (Abstract.SupportFor 'Extensions.RecordWildCards λ),
                   Eq (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Eq (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Eq (s (Abstract.CaseAlternative l l d d)), Eq (s (Abstract.Constructor l l d d)),
                   Eq (s (Abstract.Expression l l d d)), Eq (s (Abstract.GuardedExpression l l d d)),
                   Eq (s (Abstract.Declaration l l d d)), Eq (s (Abstract.FieldBinding l l d d)),
                   Eq (s (Abstract.Pattern l l d d)), Eq (s (Abstract.Statement l l d d)),
                   Eq (s (Abstract.LambdaCasesAlternative l l d d)),
                   Eq (s (Abstract.EquationRHS l l d d)),
                   Eq (s (Abstract.Type l l d d)), Eq (s (Abstract.Value l l d d)),
                   Eq (Abstract.QualifiedName λ), Eq (Abstract.ModuleName λ),
                   Eq (Abstract.Name λ)) => Eq (Expression λ l d s)

deriving instance Typeable (FieldBinding λ l d s)
deriving instance (Data (s (Abstract.Expression l l d d)), Data (Abstract.QualifiedName λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (FieldBinding λ l d s)
deriving instance (Show (s (Abstract.Expression l l d d)), Show (Abstract.QualifiedName λ)) =>
                  Show (FieldBinding λ l d s)
deriving instance (Eq (s (Abstract.Expression l l d d)), Eq (Abstract.QualifiedName λ)) =>
                  Eq (FieldBinding λ l d s)

deriving instance Typeable (LambdaCasesAlternative λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.LambdaCase λ),
                   Data (s (Abstract.Pattern l l d d)), Data (s (Abstract.EquationRHS l l d d)),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (LambdaCasesAlternative λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.LambdaCase λ),
                   Show (s (Abstract.Pattern l l d d)), Show (s (Abstract.EquationRHS l l d d))) =>
                  Show (LambdaCasesAlternative λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.LambdaCase λ),
                   Eq (s (Abstract.Pattern l l d d)), Eq (s (Abstract.EquationRHS l l d d))) =>
                  Eq (LambdaCasesAlternative λ l d s)

deriving instance Typeable (Pattern λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ),
                   Data (Abstract.SupportFor 'Extensions.RecordWildCards λ),
                   Data (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Data (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Data (Abstract.SupportFor 'Extensions.Strict λ),
                   Data (Abstract.SupportFor 'Extensions.BangPatterns λ),
                   Data (Abstract.SupportFor 'Extensions.ViewPatterns λ),
                   Data (Abstract.SupportFor 'Extensions.NPlusKPatterns λ),
                   Data (Abstract.SupportFor 'Extensions.TypeAbstractions λ),
                   Data (s (Abstract.Constructor l l d d)), Data (s (Abstract.Expression l l d d)),
                   Data (s (Abstract.FieldPattern l l d d)), Data (s (Abstract.Pattern l l d d)),
                   Data (s (Abstract.Value l l d d)), Data (s (Abstract.Type l l d d)),
                   Data (Abstract.Name λ), Data (Abstract.QualifiedName λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Pattern λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ),
                   Show (Abstract.SupportFor 'Extensions.RecordWildCards λ),
                   Show (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Show (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Show (Abstract.SupportFor 'Extensions.Strict λ),
                   Show (Abstract.SupportFor 'Extensions.BangPatterns λ),
                   Show (Abstract.SupportFor 'Extensions.ViewPatterns λ),
                   Show (Abstract.SupportFor 'Extensions.NPlusKPatterns λ),
                   Show (Abstract.SupportFor 'Extensions.TypeAbstractions λ),
                   Show (s (Abstract.Constructor l l d d)), Show (s (Abstract.Expression l l d d)),
                   Show (s (Abstract.FieldPattern l l d d)), Show (s (Abstract.Pattern l l d d)),
                   Show (s (Abstract.Value l l d d)), Show (s (Abstract.Type l l d d)),
                   Show (Abstract.QualifiedName λ), Show (Abstract.Name λ)) => Show (Pattern λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.ExplicitNamespaces λ),
                   Eq (Abstract.SupportFor 'Extensions.RecordWildCards λ),
                   Eq (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Eq (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Eq (Abstract.SupportFor 'Extensions.Strict λ),
                   Eq (Abstract.SupportFor 'Extensions.BangPatterns λ),
                   Eq (Abstract.SupportFor 'Extensions.ViewPatterns λ),
                   Eq (Abstract.SupportFor 'Extensions.NPlusKPatterns λ),
                   Eq (Abstract.SupportFor 'Extensions.TypeAbstractions λ),
                   Eq (s (Abstract.Constructor l l d d)), Eq (s (Abstract.Expression l l d d)),
                   Eq (s (Abstract.FieldPattern l l d d)), Eq (s (Abstract.Pattern l l d d)),
                   Eq (s (Abstract.Value l l d d)), Eq (s (Abstract.Type l l d d)),
                   Eq (Abstract.QualifiedName λ), Eq (Abstract.Name λ)) => Eq (Pattern λ l d s)

deriving instance Typeable (FieldPattern λ l d s)
deriving instance (Data (s (Abstract.Pattern l l d d)), Data (Abstract.QualifiedName λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (FieldPattern λ l d s)
deriving instance (Show (s (Abstract.Pattern l l d d)), Show (Abstract.QualifiedName λ)) => Show (FieldPattern λ l d s)
deriving instance (Eq (s (Abstract.Pattern l l d d)), Eq (Abstract.QualifiedName λ)) => Eq (FieldPattern λ l d s)

deriving instance Typeable (PatternLHS λ l d s)
deriving instance (Data (Abstract.Name λ), Data λ, Typeable l, Typeable d, Typeable s) => Data (PatternLHS λ l d s)
deriving instance (Show (Abstract.Name λ)) => Show (PatternLHS λ l d s)
deriving instance (Eq (Abstract.Name λ)) => Eq (PatternLHS λ l d s)

deriving instance Typeable (Statement λ l d s)
deriving instance (Data (s (Abstract.Declaration l l d d)), Data (s (Abstract.Expression l l d d)),
                   Data (s (Abstract.Pattern l l d d)), Data (s (Abstract.Statement l l d d)),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Statement λ l d s)
deriving instance (Show (s (Abstract.Declaration l l d d)), Show (s (Abstract.Expression l l d d)),
                   Show (s (Abstract.Pattern l l d d)), Show (s (Abstract.Statement l l d d)))
                   => Show (Statement λ l d s)
deriving instance (Eq (s (Abstract.Declaration l l d d)), Eq (s (Abstract.Expression l l d d)),
                   Eq (s (Abstract.Pattern l l d d)), Eq (s (Abstract.Statement l l d d))) => Eq (Statement λ l d s)

deriving instance Data (Abstract.QualifiedName λ) => Typeable (Constructor λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Data (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Data (Abstract.QualifiedName λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Constructor λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Show (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Show (Abstract.QualifiedName λ)) => Show (Constructor λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.UnboxedSums λ),
                   Eq (Abstract.SupportFor 'Extensions.UnboxedTuples λ),
                   Eq (Abstract.QualifiedName λ)) => Eq (Constructor λ l d s)

deriving instance Typeable (Value λ l d s)
deriving instance (Data (Abstract.SupportFor 'Extensions.ExtendedLiterals λ),
                   Data (Abstract.SupportFor 'Extensions.MagicHash λ),
                   Data λ, Typeable l, Typeable d, Typeable s) => Data (Value λ l d s)
deriving instance (Show (Abstract.SupportFor 'Extensions.ExtendedLiterals λ),
                   Show (Abstract.SupportFor 'Extensions.MagicHash λ)) => Show (Value λ l d s)
deriving instance (Eq (Abstract.SupportFor 'Extensions.ExtendedLiterals λ),
                   Eq (Abstract.SupportFor 'Extensions.MagicHash λ)) => Eq (Value λ l d s)

deriving instance Typeable (CallSafety λ)
deriving instance (Data (Abstract.SupportFor 'Extensions.InterruptibleFFI λ), Data λ) => Data (CallSafety λ)
deriving instance Show (Abstract.SupportFor 'Extensions.InterruptibleFFI λ) => Show (CallSafety λ)
deriving instance Eq (Abstract.SupportFor 'Extensions.InterruptibleFFI λ) => Eq (CallSafety λ)

deriving instance Typeable (CallingConvention λ)
deriving instance (Data (Abstract.SupportFor 'Extensions.CApiFFI λ), Data λ) => Data (CallingConvention λ)
deriving instance Show (Abstract.SupportFor 'Extensions.CApiFFI λ) => Show (CallingConvention λ)
deriving instance Eq (Abstract.SupportFor 'Extensions.CApiFFI λ) => Eq (CallingConvention λ)


$(concat <$>
  (forM [Rank2.TH.deriveFunctor, Rank2.TH.deriveFoldable, Rank2.TH.deriveTraversable, Rank2.TH.unsafeDeriveApply,
         Transformation.Shallow.TH.deriveAll, Transformation.Deep.TH.deriveAll] $
   \derive-> mconcat <$> mapM derive
             [''Export, ''Import, ''ImportItem,
              ''Declaration, ''FunctionalDependency, ''DataConstructor, ''GADTConstructor,
              ''PatternEquationClause, ''DerivingClause, ''DerivingStrategy,
              ''Type, ''TypeLHS, ''TypeVarBinding, ''ClassInstanceLHS, ''Context,
              ''Expression, ''FieldBinding, ''LambdaCasesAlternative,
              ''Pattern, ''PatternLHS, ''PatternEquationLHS, ''FieldPattern,
              ''Statement, ''Constructor, ''Value]))