polyglot-0.1.1.0: src/SyntaxTrees/Haskell/FnDef.hs
module SyntaxTrees.Haskell.FnDef where
import SyntaxTrees.Haskell.Common (Literal, QCtor, QCtorOp, QVar, QVarOp, Var,
VarOp)
import SyntaxTrees.Haskell.Pattern (Pattern)
import SyntaxTrees.Haskell.Type (Type)
data FnSig
= FnSig
{ name :: Var
, type' :: Type
}
deriving (Show)
data FnDef
= FnDef
{ names :: [Var]
, args :: [Pattern]
, body :: MaybeGuardedFnBody
}
deriving (Show)
data InfixFnAnnotation
= InfixFnAnnotation
{ associativity :: Associativity
, precedence :: Integer
, name :: VarOp
}
deriving (Show)
data FnDefOrSig
= Def FnDef
| Sig FnSig
deriving (Show)
data FnBody
= FnApply
{ fn :: FnBody
, args :: [FnBody]
}
| InfixFnApply
{ fnOps :: [FnOp]
, args :: [FnBody]
}
| LeftOpSection
{ fnOp :: FnOp
, arg :: FnBody
}
| RightOpSection
{ arg :: FnBody
, fnOp :: FnOp
}
| LambdaExpr
{ patterns :: [Pattern]
, body :: FnBody
}
| LetExpr
{ fnBindings :: [FnDefOrSig]
, body :: FnBody
}
| WhereExpr
{ body :: FnBody
, fnBindings :: [FnDefOrSig]
}
| IfExpr
{ cond :: FnBody
, ifBranch :: FnBody
, elseBranch :: FnBody
}
| MultiWayIfExpr
{ whenExprs :: [GuardedFnBody]
}
| DoExpr
{ steps :: [DoStep]
}
| CaseOfExpr
{ matchee :: FnBody
, cases :: [CaseBinding]
}
| LambdaCaseExpr
{ cases :: [CaseBinding]
}
| RecordCreate
{ ctor :: FnBody
, namedFields :: [(Var, FnBody)]
}
| RecordUpdate
{ var :: FnBody
, namedFields :: [(Var, FnBody)]
}
| TypeAnnotation FnBody Type
| ListRange FnBody (Maybe FnBody)
| Tuple [FnBody]
| List [FnBody]
| FnVar' FnVar
| FnOp' FnOp
| Literal' Literal
deriving (Show)
data FnVar
= Selector Var
| Selection QVar [Var]
| Var' QVar
| Ctor' QCtor
deriving (Show)
data FnOp
= VarOp' QVarOp
| CtorOp' QCtorOp
deriving (Show)
data DoStep
= DoBinding [Var] FnBody
| LetBinding [FnDefOrSig]
| Body FnBody
deriving (Show)
data CaseBinding
= CaseBinding Pattern MaybeGuardedFnBody
deriving (Show)
data MaybeGuardedFnBody
= Guarded [GuardedFnBody]
| Standard FnBody
deriving (Show)
data GuardedFnBody
= GuardedFnBody
{ guard :: Guard
, body :: FnBody
}
deriving (Show)
data Guard
= Guard [PatternGuard]
| Otherwise
deriving (Show)
data PatternGuard
= PatternGuard Pattern FnBody
| SimpleGuard FnBody
deriving (Show)
data Associativity
= LAssoc
| RAssoc
deriving (Show)