module Language.Haskell.Tools.AST.Representation.Binds where
import Language.Haskell.Tools.AST.Ann (Ann, AnnListG, AnnMaybeG)
import Language.Haskell.Tools.AST.Representation.Exprs (UExpr)
import Language.Haskell.Tools.AST.Representation.Names (UName, UOperator)
import Language.Haskell.Tools.AST.Representation.Patterns (UPattern)
import Language.Haskell.Tools.AST.Representation.Types (UType)
data UValueBind dom stage
= USimpleBind { _valBindPat :: Ann UPattern dom stage
, _valBindRhs :: Ann URhs dom stage
, _valBindLocals :: AnnMaybeG ULocalBinds dom stage
}
| UFunBind { _funBindMatches :: AnnListG UMatch dom stage
}
data UMatch dom stage
= UMatch { _matchLhs :: Ann UMatchLhs dom stage
, _matchRhs :: Ann URhs dom stage
, _matchBinds :: AnnMaybeG ULocalBinds dom stage
}
data UMatchLhs dom stage
= UNormalLhs { _matchLhsName :: Ann UName dom stage
, _matchLhsArgs :: AnnListG UPattern dom stage
}
| UInfixLhs { _matchLhsLhs :: Ann UPattern dom stage
, _matchLhsOperator :: Ann UOperator dom stage
, _matchLhsRhs :: Ann UPattern dom stage
, _matchLhsArgs :: AnnListG UPattern dom stage
}
data ULocalBinds dom stage
= ULocalBinds { _localBinds :: AnnListG ULocalBind dom stage
}
data ULocalBind dom stage
= ULocalValBind { _localVal :: Ann UValueBind dom stage
}
| ULocalSignature { _localSig :: Ann UTypeSignature dom stage
}
| ULocalFixity { _localFixity :: Ann UFixitySignature dom stage
}
| ULocalInline { _localInline :: Ann UInlinePragma dom stage
}
data UTypeSignature dom stage
= UTypeSignature { _tsName :: AnnListG UName dom stage
, _tsType :: Ann UType dom stage
}
data UFixitySignature dom stage
= UFixitySignature { _fixityAssoc :: Ann Assoc dom stage
, _fixityPrecedence :: AnnMaybeG Precedence dom stage
, _fixityOperators :: AnnListG UOperator dom stage
}
data Assoc dom stage
= AssocNone
| AssocLeft
| AssocRight
data Precedence dom stage
= Precedence { _precedenceValue :: Int }
data URhs dom stage
= UUnguardedRhs { _rhsExpr :: Ann UExpr dom stage
}
| UGuardedRhss { _rhsGuards :: AnnListG UGuardedRhs dom stage
}
data UGuardedRhs dom stage
= UGuardedRhs { _guardStmts :: AnnListG URhsGuard dom stage
, _guardExpr :: Ann UExpr dom stage
}
data URhsGuard dom stage
= UGuardBind { _guardPat :: Ann UPattern dom stage
, _guardRhs :: Ann UExpr dom stage
}
| UGuardLet { _guardBinds :: AnnListG ULocalBind dom stage
}
| UGuardCheck { _guardCheck :: Ann UExpr dom stage
}
data UInlinePragma dom stage
= UInlinePragma { _inlineConlike :: AnnMaybeG UConlikeAnnot dom stage
, _inlinePhase :: AnnMaybeG UPhaseControl dom stage
, _inlineDef :: Ann UName dom stage
}
| UNoInlinePragma { _noInlineDef :: Ann UName dom stage
}
| UInlinablePragma { _inlinePhase :: AnnMaybeG UPhaseControl dom stage
, _inlinableDef :: Ann UName dom stage
}
data UConlikeAnnot dom stage = UConlikeAnnot
data UPhaseControl dom stage
= UPhaseControl { _phaseUntil :: AnnMaybeG PhaseInvert dom stage
, _phaseNumber :: AnnMaybeG PhaseNumber dom stage
}
data PhaseNumber dom stage
= PhaseNumber { _phaseNum :: Integer }
data PhaseInvert dom stage = PhaseInvert