-- UUAGC 0.9.52.1 (build/103/lib-ehc/UHC/Light/Compiler/HS.ag)
module UHC.Light.Compiler.HS(module UU.Scanner.Position
, AGItf (..), Module (..), Body (..), Declaration (..), Declarations, MaybeDeclarations, Type (..), Types, MaybeType, Expression (..), Expressions, MaybeExpression, FunctionBinding (..), FunctionBindings, LeftHandSide (..), RightHandSide (..), Pattern (..), Patterns, Literal (..), Name, Names, MaybeName, MaybeNames, Strings, Range (..), Fixity (..)
, TypeAnnotation (..), ExpressionAnnotation (..), PatternAnnotation (..)
, mkRngNm, mkRngNm', mkRngStr
, TypeLeftHandSide (..), TypePattern (..), TypePatterns
, Constructor (..), Constructors
, GuardedExpression (..), GuardedExpressions, Alternative (..), Alternatives, Qualifier (..), Qualifiers
, Kind (..), Kinds, KindAnnotation (..)
, FieldDeclaration (..), FieldDeclarations
, RecordPatternBinding (..), RecordPatternBindings
, RecordExpressionBinding (..), RecordExpressionBindings
, RowRecordExpressionUpdate (..), RowRecordExpressionUpdates, RowRecordPatternBinding (..), RowRecordPatternBindings, RowTypeUpdate (..), RowTypeUpdates
, module UHC.Light.Compiler.Base.Target
, ContextItem (..), ContextItems
, Statement (..), Statements
, ContextedExpression (..), ContextedExpressions, ContextedPattern (..), ContextedPatterns
, FunctionalDependency (..), FunctionalDependencies
, Export (..), Exports, MaybeExports, ImportDeclaration (..), ImportDeclarations, ImportSpecification (..), MaybeImportSpecification, Import (..), Imports
, Deriving (..), Derivings
, Pragma (..), Pragmas) where

import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.Base.TermLike
import UU.Scanner.Position
import UHC.Util.ScanUtils
import UHC.Light.Compiler.Scanner.Token
import UHC.Light.Compiler.Base.Target (FFIWay)













































deriving instance Typeable AGItf



type Name = HsName
type Names = [Name]
type MaybeName = Maybe Name
type MaybeNames = Maybe Names





mkRngNm' :: (Position t,HSNM t) => (Range -> HsName -> r) -> t -> (r,Range)
mkRngNm' ast t
  = (ast r (mkHNm t),r)
  where r = mkRange1 t

mkRngNm :: (Position t,HSNM t) => (Range -> HsName -> r) -> t -> r
mkRngNm ast t = fst (mkRngNm' ast t)

mkRngStr :: (Range -> String -> r) -> Token -> r
mkRngStr ast t = ast (mkRange1 t) (tokMkStr t)





instance AppLike Type () {- TypeAnnotation () -} where
  app1App       = \e1 e2 -> Type_NormalApplication emptyRange e1 [e2]
  appTop        = id
  appCon        = mkRngNm Type_Constructor
  appPar        = Type_Parenthesized emptyRange
  appTopApp (a:as)  = if null as then a else Type_NormalApplication emptyRange a as
  appRngCon r n     = Type_Constructor r (mkHNm n)


  appRngVar r n = Type_Variable r (mkHNm n)



instance AppLike Expression () {- ExpressionAnnotation () -} where
  app1App           = \e1 e2 -> Expression_NormalApplication emptyRange e1 [e2]
  appTop            = id
  appCon            = mkRngNm Expression_Constructor
  appPar            = Expression_Parenthesized emptyRange
  appTopApp (a:as)  = if null as then a else Expression_NormalApplication emptyRange a as
  appRngCon r n     = Expression_Constructor r (mkHNm n)
  appRngVar r n     = Expression_Variable r (mkHNm n)

-- AGItf -------------------------------------------------------
data AGItf = AGItf_AGItf {module_AGItf_AGItf :: !(Module)}
-- Alternative -------------------------------------------------
data Alternative = Alternative_Alternative {range_Alternative_Alternative :: !(Range),pattern_Alternative_Alternative :: !(Pattern),righthandside_Alternative_Alternative :: !(RightHandSide)}
                 | Alternative_Empty {range_Alternative_Empty :: !(Range)}
-- Alternatives ------------------------------------------------
type Alternatives = [Alternative]
-- Body --------------------------------------------------------
data Body = Body_Body {range_Body_Body :: !(Range),importdeclarations_Body_Body :: !(ImportDeclarations),declarations_Body_Body :: !(Declarations)}
-- Constructor -------------------------------------------------
data Constructor = Constructor_Constructor {range_Constructor_Constructor :: !(Range),constructor_Constructor_Constructor :: !(Name),types_Constructor_Constructor :: !(Types)}
                 | Constructor_Infix {range_Constructor_Infix :: !(Range),leftType_Constructor_Infix :: !(Type),constructorOperator_Constructor_Infix :: !(Name),rightType_Constructor_Infix :: !(Type)}
                 | Constructor_Record {range_Constructor_Record :: !(Range),constructor_Constructor_Record :: !(Name),fieldDeclarations_Constructor_Record :: !(FieldDeclarations)}
                 | Constructor_Contexted {range_Constructor_Contexted :: !(Range),context_Constructor_Contexted :: !(ContextItems),constructor_Constructor_Contexted :: !(Constructor)}
                 | Constructor_GADTFunction {range_Constructor_GADTFunction :: !(Range),constructor_Constructor_GADTFunction :: !(Name),type_Constructor_GADTFunction :: !(Type)}
-- Constructors ------------------------------------------------
type Constructors = [Constructor]
-- ContextItem -------------------------------------------------
data ContextItem = ContextItem_Class {range_ContextItem_Class :: !(Range),name_ContextItem_Class :: !(Name),types_ContextItem_Class :: !(Types)}
                 | ContextItem_Forall {range_ContextItem_Forall :: !(Range),typevariables_ContextItem_Forall :: !(Names),context_ContextItem_Forall :: !(ContextItem)}
                 | ContextItem_Arrow {range_ContextItem_Arrow :: !(Range),argument_ContextItem_Arrow :: !(ContextItem),result_ContextItem_Arrow :: !(ContextItem)}
                 | ContextItem_Implicits {range_ContextItem_Implicits :: !(Range)}
                 | ContextItem_NoImplicits {range_ContextItem_NoImplicits :: !(Range)}
                 | ContextItem_RowLacksLabel {range_ContextItem_RowLacksLabel :: !(Range),rowvariable_ContextItem_RowLacksLabel :: !(Name),name_ContextItem_RowLacksLabel :: !(Name)}
                 | ContextItem_Equal {range_ContextItem_Equal :: !(Range),type1_ContextItem_Equal :: !(Type),type2_ContextItem_Equal :: !(Type)}
-- ContextItems ------------------------------------------------
type ContextItems = [ContextItem]
-- ContextedExpression -----------------------------------------
data ContextedExpression = ContextedExpression_Contexted {range_ContextedExpression_Contexted :: !(Range),expression_ContextedExpression_Contexted :: !(Expression),context_ContextedExpression_Contexted :: !(ContextItem)}
-- ContextedExpressions ----------------------------------------
type ContextedExpressions = [ContextedExpression]
-- ContextedPattern --------------------------------------------
data ContextedPattern = ContextedPattern_Contexted {range_ContextedPattern_Contexted :: !(Range),pattern_ContextedPattern_Contexted :: !(Pattern),context_ContextedPattern_Contexted :: !(ContextItem)}
-- ContextedPatterns -------------------------------------------
type ContextedPatterns = [ContextedPattern]
-- Declaration -------------------------------------------------
data Declaration = Declaration_FunctionBindings {range_Declaration_FunctionBindings :: !(Range),bindings_Declaration_FunctionBindings :: !(FunctionBindings)}
                 | Declaration_PatternBinding {range_Declaration_PatternBinding :: !(Range),pattern_Declaration_PatternBinding :: !(Pattern),righthandside_Declaration_PatternBinding :: !(RightHandSide)}
                 | Declaration_TypeSignature {range_Declaration_TypeSignature :: !(Range),names_Declaration_TypeSignature :: !(Names),type_Declaration_TypeSignature :: !(Type)}
                 | Declaration_Fixity {range_Declaration_Fixity :: !(Range),fixity_Declaration_Fixity :: !(Fixity),priority_Declaration_Fixity :: !((Maybe Int)),operators_Declaration_Fixity :: !(Names)}
                 | Declaration_FusionDeclaration {range_Declaration_FusionDeclaration :: !(Range),fusename_Declaration_FusionDeclaration :: !(Name)}
                 | Declaration_FusionConversion {range_Declaration_FusionConversion :: !(Range),absname_Declaration_FusionConversion :: !(Name),conname_Declaration_FusionConversion :: !(Name)}
                 | Declaration_Empty {range_Declaration_Empty :: !(Range)}
                 | Declaration_Data {range_Declaration_Data :: !(Range),context_Declaration_Data :: !(ContextItems),typelefthandside_Declaration_Data :: !(TypeLeftHandSide),constructors_Declaration_Data :: !(Constructors),derivings_Declaration_Data :: !(Derivings)}
                 | Declaration_Newtype {range_Declaration_Newtype :: !(Range),context_Declaration_Newtype :: !(ContextItems),typelefthandside_Declaration_Newtype :: !(TypeLeftHandSide),constructors_Declaration_Newtype :: !(Constructor),derivings_Declaration_Newtype :: !(Derivings)}
                 | Declaration_GADT {range_Declaration_GADT :: !(Range),context_Declaration_GADT :: !(ContextItems),typelefthandside_Declaration_GADT :: !(TypeLeftHandSide),constructors_Declaration_GADT :: !(Constructors),derivings_Declaration_GADT :: !(Derivings)}
                 | Declaration_KindSignature {range_Declaration_KindSignature :: !(Range),names_Declaration_KindSignature :: !(Names),kind_Declaration_KindSignature :: !(Kind)}
                 | Declaration_ForeignImport {range_Declaration_ForeignImport :: !(Range),callconvention_Declaration_ForeignImport :: !(FFIWay),safety_Declaration_ForeignImport :: !((Maybe String)),importname_Declaration_ForeignImport :: !((Maybe String)),name_Declaration_ForeignImport :: !(Name),type_Declaration_ForeignImport :: !(Type)}
                 | Declaration_ForeignExport {range_Declaration_ForeignExport :: !(Range),callconvention_Declaration_ForeignExport :: !(FFIWay),exportname_Declaration_ForeignExport :: !((Maybe String)),name_Declaration_ForeignExport :: !(Name),type_Declaration_ForeignExport :: !(Type)}
                 | Declaration_Class {range_Declaration_Class :: !(Range),context_Declaration_Class :: !(ContextItems),typelefthandside_Declaration_Class :: !(TypeLeftHandSide),dependencies_Declaration_Class :: !(FunctionalDependencies),where_Declaration_Class :: !(MaybeDeclarations)}
                 | Declaration_Instance {range_Declaration_Instance :: !(Range),instVariant_Declaration_Instance :: !(InstVariant),maybeinstancename_Declaration_Instance :: !(MaybeName),useimplicitly_Declaration_Instance :: !(Bool),context_Declaration_Instance :: !(ContextItems),type_Declaration_Instance :: !(Type),where_Declaration_Instance :: !(MaybeDeclarations)}
                 | Declaration_InstanceUseImplicitly {range_Declaration_InstanceUseImplicitly :: !(Range),expression_Declaration_InstanceUseImplicitly :: !(Expression),type_Declaration_InstanceUseImplicitly :: !(Type)}
                 | Declaration_Default {range_Declaration_Default :: !(Range),name_Declaration_Default :: !(MaybeName),types_Declaration_Default :: !(Types)}
                 | Declaration_Type {range_Declaration_Type :: !(Range),typelefthandside_Declaration_Type :: !(TypeLeftHandSide),type_Declaration_Type :: !(Type)}
                 | Declaration_Pragma {range_Declaration_Pragma :: !(Range),pragma_Declaration_Pragma :: !(Pragma)}
                 | Declaration_Module {range_Declaration_Module :: !(Range),name_Declaration_Module :: !(MaybeName),exports_Declaration_Module :: !(MaybeExports)}
-- Declarations ------------------------------------------------
type Declarations = [Declaration]
-- Deriving ----------------------------------------------------
data Deriving = Deriving_Deriving {range_Deriving_Deriving :: !(Range),maybeinstancename_Deriving_Deriving :: !(MaybeName),useimplicitly_Deriving_Deriving :: !(Bool),name_Deriving_Deriving :: !(Name)}
-- Derivings ---------------------------------------------------
type Derivings = [Deriving]
-- Export ------------------------------------------------------
data Export = Export_Variable {range_Export_Variable :: !(Range),name_Export_Variable :: !(Name)}
            | Export_TypeOrClass {range_Export_TypeOrClass :: !(Range),name_Export_TypeOrClass :: !(Name),names_Export_TypeOrClass :: !(MaybeNames)}
            | Export_TypeOrClassComplete {range_Export_TypeOrClassComplete :: !(Range),name_Export_TypeOrClassComplete :: !(Name)}
            | Export_Module {range_Export_Module :: !(Range),name_Export_Module :: !(Name)}
-- Exports -----------------------------------------------------
type Exports = [Export]
-- Expression --------------------------------------------------
data Expression = Expression_Literal {range_Expression_Literal :: !(Range),literal_Expression_Literal :: !(Literal)}
                | Expression_Variable {range_Expression_Variable :: !(Range),name_Expression_Variable :: !(Name)}
                | Expression_Constructor {range_Expression_Constructor :: !(Range),name_Expression_Constructor :: !(Name)}
                | Expression_TupleConstructor {range_Expression_TupleConstructor :: !(Range),arity_Expression_TupleConstructor :: !(Int)}
                | Expression_Parenthesized {range_Expression_Parenthesized :: !(Range),expression_Expression_Parenthesized :: !(Expression)}
                | Expression_NormalApplication {range_Expression_NormalApplication :: !(Range),function_Expression_NormalApplication :: !(Expression),arguments_Expression_NormalApplication :: !(Expressions)}
                | Expression_SectionApplication {range_Expression_SectionApplication :: !(Range),leftExpression_Expression_SectionApplication :: !(MaybeExpression),operator_Expression_SectionApplication :: !(Expression),rightExpression_Expression_SectionApplication :: !(MaybeExpression)}
                | Expression_InfixApplication {range_Expression_InfixApplication :: !(Range),leftExpression_Expression_InfixApplication :: !(Expression),operator_Expression_InfixApplication :: !(Expression),rightExpression_Expression_InfixApplication :: !(Expression)}
                | Expression_InfixApplicationChainTop {range_Expression_InfixApplicationChainTop :: !(Range),expression_Expression_InfixApplicationChainTop :: !(Expression)}
                | Expression_Lambda {range_Expression_Lambda :: !(Range),patterns_Expression_Lambda :: !(Patterns),expression_Expression_Lambda :: !(Expression)}
                | Expression_Let {range_Expression_Let :: !(Range),isStrict_Expression_Let :: !(Bool),declarations_Expression_Let :: !(Declarations),expression_Expression_Let :: !(Expression)}
                | Expression_Tuple {range_Expression_Tuple :: !(Range),expressions_Expression_Tuple :: !(Expressions)}
                | Expression_Typed {range_Expression_Typed :: !(Range),expression_Expression_Typed :: !(Expression),type_Expression_Typed :: !(Type)}
                | Expression_Negate {range_Expression_Negate :: !(Range),expression_Expression_Negate :: !(Expression)}
                | Expression_Annotate {range_Expression_Annotate :: !(Range),annotation_Expression_Annotate :: !(ExpressionAnnotation),expression_Expression_Annotate :: !(Expression)}
                | Expression_ImpredicativeApplication {range_Expression_ImpredicativeApplication :: !(Range),function_Expression_ImpredicativeApplication :: !(Expression),arguments_Expression_ImpredicativeApplication :: !(Expressions)}
                | Expression_If {range_Expression_If :: !(Range),guardExpression_Expression_If :: !(Expression),thenExpression_Expression_If :: !(Expression),elseExpression_Expression_If :: !(Expression)}
                | Expression_Case {range_Expression_Case :: !(Range),expression_Expression_Case :: !(Expression),alternatives_Expression_Case :: !(Alternatives)}
                | Expression_List {range_Expression_List :: !(Range),expressions_Expression_List :: !(Expressions)}
                | Expression_Enum {range_Expression_Enum :: !(Range),from_Expression_Enum :: !(Expression),then_Expression_Enum :: !(MaybeExpression),to_Expression_Enum :: !(MaybeExpression)}
                | Expression_Comprehension {range_Expression_Comprehension :: !(Range),expression_Expression_Comprehension :: !(Expression),qualifiers_Expression_Comprehension :: !(Qualifiers)}
                | Expression_RecordConstruction {range_Expression_RecordConstruction :: !(Range),name_Expression_RecordConstruction :: !(Name),recordExpressionBindings_Expression_RecordConstruction :: !(RecordExpressionBindings)}
                | Expression_RecordUpdate {range_Expression_RecordUpdate :: !(Range),expression_Expression_RecordUpdate :: !(Expression),recordExpressionBindings_Expression_RecordUpdate :: !(RecordExpressionBindings)}
                | Expression_RowRecordUpdate {range_Expression_RowRecordUpdate :: !(Range),expression_Expression_RowRecordUpdate :: !(Expression),rowRecordExpressionUpdates_Expression_RowRecordUpdate :: !(RowRecordExpressionUpdates)}
                | Expression_RowRecordEmpty {range_Expression_RowRecordEmpty :: !(Range)}
                | Expression_RowRecordSelect {range_Expression_RowRecordSelect :: !(Range),expression_Expression_RowRecordSelect :: !(Expression),name_Expression_RowRecordSelect :: !(Name)}
                | Expression_Do {range_Expression_Do :: !(Range),statements_Expression_Do :: !(Statements)}
                | Expression_ImplicitApplication {range_Expression_ImplicitApplication :: !(Range),function_Expression_ImplicitApplication :: !(Expression),arguments_Expression_ImplicitApplication :: !(ContextedExpressions)}
                | Expression_ImplicitLambda {range_Expression_ImplicitLambda :: !(Range),patterns_Expression_ImplicitLambda :: !(ContextedPatterns),expression_Expression_ImplicitLambda :: !(Expression)}
-- ExpressionAnnotation ----------------------------------------
data ExpressionAnnotation = ExpressionAnnotation_Empty {}
-- Expressions -------------------------------------------------
type Expressions = [Expression]
-- FieldDeclaration --------------------------------------------
data FieldDeclaration = FieldDeclaration_FieldDeclaration {range_FieldDeclaration_FieldDeclaration :: !(Range),names_FieldDeclaration_FieldDeclaration :: !(Names),type_FieldDeclaration_FieldDeclaration :: !(Type)}
-- FieldDeclarations -------------------------------------------
type FieldDeclarations = [FieldDeclaration]
-- FunctionBinding ---------------------------------------------
data FunctionBinding = FunctionBinding_FunctionBinding {range_FunctionBinding_FunctionBinding :: !(Range),lefthandside_FunctionBinding_FunctionBinding :: !(LeftHandSide),righthandside_FunctionBinding_FunctionBinding :: !(RightHandSide)}
-- FunctionBindings --------------------------------------------
type FunctionBindings = [FunctionBinding]
-- FunctionalDependencies --------------------------------------
type FunctionalDependencies = [FunctionalDependency]
-- FunctionalDependency ----------------------------------------
data FunctionalDependency = FunctionalDependency_Dependency {range_FunctionalDependency_Dependency :: !(Range),fromtypevariables_FunctionalDependency_Dependency :: !(Names),totypevariables_FunctionalDependency_Dependency :: !(Names)}
-- GuardedExpression -------------------------------------------
data GuardedExpression = GuardedExpression_GuardedExpression {range_GuardedExpression_GuardedExpression :: !(Range),guard_GuardedExpression_GuardedExpression :: !(Expression),expression_GuardedExpression_GuardedExpression :: !(Expression)}
-- GuardedExpressions ------------------------------------------
type GuardedExpressions = [GuardedExpression]
-- Import ------------------------------------------------------
data Import = Import_Variable {range_Import_Variable :: !(Range),name_Import_Variable :: !(Name)}
            | Import_TypeOrClass {range_Import_TypeOrClass :: !(Range),name_Import_TypeOrClass :: !(Name),names_Import_TypeOrClass :: !(MaybeNames)}
            | Import_TypeOrClassComplete {range_Import_TypeOrClassComplete :: !(Range),name_Import_TypeOrClassComplete :: !(Name)}
-- ImportDeclaration -------------------------------------------
data ImportDeclaration = ImportDeclaration_Import {range_ImportDeclaration_Import :: !(Range),qualified_ImportDeclaration_Import :: !(Bool),name_ImportDeclaration_Import :: !(Name),asname_ImportDeclaration_Import :: !(MaybeName),importspecification_ImportDeclaration_Import :: !(MaybeImportSpecification)}
                       | ImportDeclaration_Empty {range_ImportDeclaration_Empty :: !(Range)}
-- ImportDeclarations ------------------------------------------
type ImportDeclarations = [ImportDeclaration]
-- ImportSpecification -----------------------------------------
data ImportSpecification = ImportSpecification_Import {range_ImportSpecification_Import :: !(Range),hiding_ImportSpecification_Import :: !(Bool),imports_ImportSpecification_Import :: !(Imports)}
-- Imports -----------------------------------------------------
type Imports = [Import]
-- Kind --------------------------------------------------------
data Kind = Kind_NormalApplication {range_Kind_NormalApplication :: !(Range),function_Kind_NormalApplication :: !(Kind),arguments_Kind_NormalApplication :: !(Kinds)}
          | Kind_InfixApplication {range_Kind_InfixApplication :: !(Range),leftKind_Kind_InfixApplication :: !(Kind),operator_Kind_InfixApplication :: !(Kind),rightKind_Kind_InfixApplication :: !(Kind)}
          | Kind_Constructor {range_Kind_Constructor :: !(Range),name_Kind_Constructor :: !(Name)}
          | Kind_Parenthesized {range_Kind_Parenthesized :: !(Range),kind_Kind_Parenthesized :: !(Kind)}
          | Kind_Variable {range_Kind_Variable :: !(Range),name_Kind_Variable :: !(Name)}
          | Kind_Forall {range_Kind_Forall :: !(Range),kindvariables_Kind_Forall :: !(Names),kind_Kind_Forall :: !(Kind)}
          | Kind_Annotate {range_Kind_Annotate :: !(Range),annotation_Kind_Annotate :: !(KindAnnotation),kind_Kind_Annotate :: !(Kind)}
-- KindAnnotation ----------------------------------------------
data KindAnnotation = KindAnnotation_Empty {}
-- Kinds -------------------------------------------------------
type Kinds = [Kind]
-- LeftHandSide ------------------------------------------------
data LeftHandSide = LeftHandSide_Function {range_LeftHandSide_Function :: !(Range),name_LeftHandSide_Function :: !(Name),patterns_LeftHandSide_Function :: !(Patterns)}
                  | LeftHandSide_Infix {range_LeftHandSide_Infix :: !(Range),leftPattern_LeftHandSide_Infix :: !(Pattern),operator_LeftHandSide_Infix :: !(Name),rightPattern_LeftHandSide_Infix :: !(Pattern)}
                  | LeftHandSide_Parenthesized {range_LeftHandSide_Parenthesized :: !(Range),lefthandside_LeftHandSide_Parenthesized :: !(LeftHandSide),patterns_LeftHandSide_Parenthesized :: !(Patterns)}
                  | LeftHandSide_Typed {range_LeftHandSide_Typed :: !(Range),lefthandside_LeftHandSide_Typed :: !(LeftHandSide),type_LeftHandSide_Typed :: !(Type)}
-- Literal -----------------------------------------------------
data Literal = Literal_Int {range_Literal_Int :: !(Range),base_Literal_Int :: !(Int),value_Literal_Int :: !(String)}
             | Literal_Char {range_Literal_Char :: !(Range),value_Literal_Char :: !(String)}
             | Literal_String {range_Literal_String :: !(Range),value_Literal_String :: !(String)}
             | Literal_Float {range_Literal_Float :: !(Range),value_Literal_Float :: !(String)}
-- MaybeDeclarations -------------------------------------------
type MaybeDeclarations = Maybe (Declarations)
-- MaybeExports ------------------------------------------------
type MaybeExports = Maybe (Exports)
-- MaybeExpression ---------------------------------------------
type MaybeExpression = Maybe (Expression)
-- MaybeImportSpecification ------------------------------------
type MaybeImportSpecification = Maybe (ImportSpecification)
-- MaybeType ---------------------------------------------------
type MaybeType = Maybe (Type)
-- Module ------------------------------------------------------
data Module = Module_Module {range_Module_Module :: !(Range),name_Module_Module :: !(MaybeName),fileheaderpragmas_Module_Module :: !(Pragmas),exports_Module_Module :: !(MaybeExports),body_Module_Module :: !(Body)}
-- Pattern -----------------------------------------------------
data Pattern = Pattern_Literal {range_Pattern_Literal :: !(Range),sign_Pattern_Literal :: !(Int),literal_Pattern_Literal :: !(Literal)}
             | Pattern_Variable {range_Pattern_Variable :: !(Range),name_Pattern_Variable :: !(Name)}
             | Pattern_Constructor {range_Pattern_Constructor :: !(Range),name_Pattern_Constructor :: !(Name),patterns_Pattern_Constructor :: !(Patterns)}
             | Pattern_Parenthesized {range_Pattern_Parenthesized :: !(Range),pattern_Pattern_Parenthesized :: !(Pattern)}
             | Pattern_As {range_Pattern_As :: !(Range),name_Pattern_As :: !(Name),pattern_Pattern_As :: !(Pattern)}
             | Pattern_Wildcard {range_Pattern_Wildcard :: !(Range)}
             | Pattern_Tuple {range_Pattern_Tuple :: !(Range),arity_Pattern_Tuple :: !(Int),patterns_Pattern_Tuple :: !(Patterns)}
             | Pattern_Annotate {range_Pattern_Annotate :: !(Range),annotation_Pattern_Annotate :: !(PatternAnnotation),pattern_Pattern_Annotate :: !(Pattern)}
             | Pattern_Typed {range_Pattern_Typed :: !(Range),pattern_Pattern_Typed :: !(Pattern),type_Pattern_Typed :: !(Type)}
             | Pattern_InfixConstructor {range_Pattern_InfixConstructor :: !(Range),leftPattern_Pattern_InfixConstructor :: !(Pattern),constructorOperator_Pattern_InfixConstructor :: !(Name),rightPattern_Pattern_InfixConstructor :: !(Pattern)}
             | Pattern_List {range_Pattern_List :: !(Range),patterns_Pattern_List :: !(Patterns)}
             | Pattern_Record {range_Pattern_Record :: !(Range),name_Pattern_Record :: !(Name),recordPatternBindings_Pattern_Record :: !(RecordPatternBindings)}
             | Pattern_RowRecordBinding {range_Pattern_RowRecordBinding :: !(Range),pattern_Pattern_RowRecordBinding :: !(Pattern),rowRecordPattternBindings_Pattern_RowRecordBinding :: !(RowRecordPatternBindings)}
             | Pattern_RowRecordEmpty {range_Pattern_RowRecordEmpty :: !(Range)}
             | Pattern_Irrefutable {range_Pattern_Irrefutable :: !(Range),pattern_Pattern_Irrefutable :: !(Pattern)}
             | Pattern_Bang {range_Pattern_Bang :: !(Range),pattern_Pattern_Bang :: !(Pattern)}
-- PatternAnnotation -------------------------------------------
data PatternAnnotation = PatternAnnotation_Empty {}
-- Patterns ----------------------------------------------------
type Patterns = [Pattern]
-- Pragma ------------------------------------------------------
data Pragma = Pragma_Language {range_Pragma_Language :: !(Range),pragmas_Pragma_Language :: !(Names)}
            | Pragma_OptionsUHC {range_Pragma_OptionsUHC :: !(Range),options_Pragma_OptionsUHC :: !(String)}
            | Pragma_Derivable {range_Pragma_Derivable :: !(Range),className_Pragma_Derivable :: !(Name),fieldName_Pragma_Derivable :: !(Name),defaultName_Pragma_Derivable :: !(Name)}
            | Pragma_ExcludeIfTarget {range_Pragma_ExcludeIfTarget :: !(Range),targetNames_Pragma_ExcludeIfTarget :: !(([String]))}
-- Pragmas -----------------------------------------------------
type Pragmas = [Pragma]
-- Qualifier ---------------------------------------------------
data Qualifier = Qualifier_Guard {range_Qualifier_Guard :: !(Range),guard_Qualifier_Guard :: !(Expression)}
               | Qualifier_Let {range_Qualifier_Let :: !(Range),declarations_Qualifier_Let :: !(Declarations)}
               | Qualifier_Generator {range_Qualifier_Generator :: !(Range),pattern_Qualifier_Generator :: !(Pattern),expression_Qualifier_Generator :: !(Expression)}
               | Qualifier_Empty {range_Qualifier_Empty :: !(Range)}
-- Qualifiers --------------------------------------------------
type Qualifiers = [Qualifier]
-- RecordExpressionBinding -------------------------------------
data RecordExpressionBinding = RecordExpressionBinding_Binding {range_RecordExpressionBinding_Binding :: !(Range),name_RecordExpressionBinding_Binding :: !(Name),expression_RecordExpressionBinding_Binding :: !(Expression)}
-- RecordExpressionBindings ------------------------------------
type RecordExpressionBindings = [RecordExpressionBinding]
-- RecordPatternBinding ----------------------------------------
data RecordPatternBinding = RecordPatternBinding_Binding {range_RecordPatternBinding_Binding :: !(Range),name_RecordPatternBinding_Binding :: !(Name),pattern_RecordPatternBinding_Binding :: !(Pattern)}
                          | RecordPatternBinding_Pun {range_RecordPatternBinding_Pun :: !(Range),name_RecordPatternBinding_Pun :: !(Name)}
-- RecordPatternBindings ---------------------------------------
type RecordPatternBindings = [RecordPatternBinding]
-- RightHandSide -----------------------------------------------
data RightHandSide = RightHandSide_Expression {range_RightHandSide_Expression :: !(Range),expression_RightHandSide_Expression :: !(Expression),where_RightHandSide_Expression :: !(MaybeDeclarations)}
                   | RightHandSide_Guarded {range_RightHandSide_Guarded :: !(Range),guardedexpressions_RightHandSide_Guarded :: !(GuardedExpressions),where_RightHandSide_Guarded :: !(MaybeDeclarations)}
-- RowRecordExpressionUpdate -----------------------------------
data RowRecordExpressionUpdate = RowRecordExpressionUpdate_Update {range_RowRecordExpressionUpdate_Update :: !(Range),name_RowRecordExpressionUpdate_Update :: !(Name),expression_RowRecordExpressionUpdate_Update :: !(Expression)}
                               | RowRecordExpressionUpdate_Extends {range_RowRecordExpressionUpdate_Extends :: !(Range),name_RowRecordExpressionUpdate_Extends :: !(MaybeName),expression_RowRecordExpressionUpdate_Extends :: !(Expression)}
-- RowRecordExpressionUpdates ----------------------------------
type RowRecordExpressionUpdates = [RowRecordExpressionUpdate]
-- RowRecordPatternBinding -------------------------------------
data RowRecordPatternBinding = RowRecordPatternBinding_Binding {range_RowRecordPatternBinding_Binding :: !(Range),name_RowRecordPatternBinding_Binding :: !(MaybeName),pattern_RowRecordPatternBinding_Binding :: !(Pattern)}
-- RowRecordPatternBindings ------------------------------------
type RowRecordPatternBindings = [RowRecordPatternBinding]
-- RowTypeUpdate -----------------------------------------------
data RowTypeUpdate = RowTypeUpdate_Extends {range_RowTypeUpdate_Extends :: !(Range),name_RowTypeUpdate_Extends :: !(MaybeName),type_RowTypeUpdate_Extends :: !(Type)}
-- RowTypeUpdates ----------------------------------------------
type RowTypeUpdates = [RowTypeUpdate]
-- Statement ---------------------------------------------------
data Statement = Statement_Expression {range_Statement_Expression :: !(Range),expression_Statement_Expression :: !(Expression)}
               | Statement_Let {range_Statement_Let :: !(Range),declarations_Statement_Let :: !(Declarations)}
               | Statement_Generator {range_Statement_Generator :: !(Range),pattern_Statement_Generator :: !(Pattern),expression_Statement_Generator :: !(Expression)}
               | Statement_Empty {range_Statement_Empty :: !(Range)}
-- Statements --------------------------------------------------
type Statements = [Statement]
-- Strings -----------------------------------------------------
type Strings = [(String)]
-- Type --------------------------------------------------------
data Type = Type_NormalApplication {range_Type_NormalApplication :: !(Range),function_Type_NormalApplication :: !(Type),arguments_Type_NormalApplication :: !(Types)}
          | Type_InfixApplication {range_Type_InfixApplication :: !(Range),leftType_Type_InfixApplication :: !(Type),operator_Type_InfixApplication :: !(Type),rightType_Type_InfixApplication :: !(Type)}
          | Type_InfixApplicationChainTop {range_Type_InfixApplicationChainTop :: !(Range),type_Type_InfixApplicationChainTop :: !(Type)}
          | Type_Constructor {range_Type_Constructor :: !(Range),name_Type_Constructor :: !(Name)}
          | Type_Parenthesized {range_Type_Parenthesized :: !(Range),type_Type_Parenthesized :: !(Type)}
          | Type_SectionApplication {range_Type_SectionApplication :: !(Range),leftType_Type_SectionApplication :: !(MaybeType),operator_Type_SectionApplication :: !(Type),rightType_Type_SectionApplication :: !(MaybeType)}
          | Type_Annotate {range_Type_Annotate :: !(Range),annotation_Type_Annotate :: !(TypeAnnotation),type_Type_Annotate :: !(Type)}
          | Type_Wildcard {range_Type_Wildcard :: !(Range)}
          | Type_MonoWildcard {range_Type_MonoWildcard :: !(Range)}
          | Type_Variable {range_Type_Variable :: !(Range),name_Type_Variable :: !(Name)}
          | Type_NamedWildcard {range_Type_NamedWildcard :: !(Range),name_Type_NamedWildcard :: !(Name)}
          | Type_Forall {range_Type_Forall :: !(Range),typevariables_Type_Forall :: !(Names),type_Type_Forall :: !(Type)}
          | Type_Exists {range_Type_Exists :: !(Range),typevariables_Type_Exists :: !(Names),type_Type_Exists :: !(Type)}
          | Type_RowUpdate {range_Type_RowUpdate :: !(Range),type_Type_RowUpdate :: !(Type),rowTypeUpdates_Type_RowUpdate :: !(RowTypeUpdates)}
          | Type_RowEmpty {range_Type_RowEmpty :: !(Range)}
          | Type_RowRecUpdate {range_Type_RowRecUpdate :: !(Range),type_Type_RowRecUpdate :: !(Type),rowTypeUpdates_Type_RowRecUpdate :: !(RowTypeUpdates)}
          | Type_RowRecEmpty {range_Type_RowRecEmpty :: !(Range)}
          | Type_RowSumUpdate {range_Type_RowSumUpdate :: !(Range),type_Type_RowSumUpdate :: !(Type),rowTypeUpdates_Type_RowSumUpdate :: !(RowTypeUpdates)}
          | Type_RowSumEmpty {range_Type_RowSumEmpty :: !(Range)}
          | Type_Qualified {range_Type_Qualified :: !(Range),context_Type_Qualified :: !(ContextItems),type_Type_Qualified :: !(Type)}
          | Type_TupleConstructor {range_Type_TupleConstructor :: !(Range),arity_Type_TupleConstructor :: !(Int)}
-- TypeAnnotation ----------------------------------------------
data TypeAnnotation = TypeAnnotation_Strict {}
                    | TypeAnnotation_AnnotationName {name_TypeAnnotation_AnnotationName :: !(Name)}
                    | TypeAnnotation_AnnotationVar {name_TypeAnnotation_AnnotationVar :: !(Name),var_TypeAnnotation_AnnotationVar :: !(Name)}
-- TypeLeftHandSide --------------------------------------------
data TypeLeftHandSide = TypeLeftHandSide_Function {range_TypeLeftHandSide_Function :: !(Range),name_TypeLeftHandSide_Function :: !(Name),patterns_TypeLeftHandSide_Function :: !(TypePatterns)}
                      | TypeLeftHandSide_Infix {range_TypeLeftHandSide_Infix :: !(Range),leftPattern_TypeLeftHandSide_Infix :: !(TypePattern),operator_TypeLeftHandSide_Infix :: !(Name),rightPattern_TypeLeftHandSide_Infix :: !(TypePattern)}
                      | TypeLeftHandSide_Parenthesized {range_TypeLeftHandSide_Parenthesized :: !(Range),lefthandside_TypeLeftHandSide_Parenthesized :: !(TypeLeftHandSide),patterns_TypeLeftHandSide_Parenthesized :: !(TypePatterns)}
-- TypePattern -------------------------------------------------
data TypePattern = TypePattern_Variable {range_TypePattern_Variable :: !(Range),name_TypePattern_Variable :: !(Name)}
-- TypePatterns ------------------------------------------------
type TypePatterns = [TypePattern]
-- Types -------------------------------------------------------
type Types = [Type]