haskell-tools-ast-0.1.3.0: Language/Haskell/Tools/AST/Stmts.hs
-- | Representation of Haskell statements (both do-notation and comprehensions)
module Language.Haskell.Tools.AST.Stmts where
import Language.Haskell.Tools.AST.Ann
import Language.Haskell.Tools.AST.Base
import Language.Haskell.Tools.AST.Patterns
import {-# SOURCE #-} Language.Haskell.Tools.AST.Exprs (Expr, Cmd)
import {-# SOURCE #-} Language.Haskell.Tools.AST.Binds (LocalBind)
-- | Normal monadic statements
data Stmt' expr dom stage
= BindStmt { _stmtPattern :: Ann Pattern dom stage
, _stmtExpr :: Ann expr dom stage
} -- ^ Binding statement (@ x <- action @)
| ExprStmt { _stmtExpr :: Ann expr dom stage
} -- ^ Non-binding statement (@ action @)
| LetStmt { _stmtBinds :: AnnList LocalBind dom stage
} -- ^ Let statement (@ let x = 3; y = 4 @)
| RecStmt { _cmdStmtBinds :: AnnList (Stmt' expr) dom stage
} -- ^ A recursive binding statement with (@ rec b <- f a c; c <- f b a @)
type Stmt = Stmt' Expr
-- | Body of a list comprehension: (@ | x <- [1..10] @)
data ListCompBody dom stage
= ListCompBody { _compStmts :: AnnList CompStmt dom stage
}
-- | List comprehension statement
data CompStmt dom stage
= CompStmt { _compStmt :: Ann Stmt dom stage
} -- ^ Normal monadic statement of a list comprehension
| ThenStmt { _thenExpr :: Ann Expr dom stage
, _byExpr :: AnnMaybe Expr dom stage
} -- ^ Then statements by @TransformListComp@ (@ then sortWith by (x + y) @)
| GroupStmt { _byExpr :: AnnMaybe Expr dom stage
, _usingExpr :: AnnMaybe Expr dom stage
} -- ^ Grouping statements by @TransformListComp@ (@ then group by (x + y) using groupWith @)
-- Note: either byExpr or usingExpr must have a value