module Language.Haskell.Tools.AST.Patterns where
import Language.Haskell.Tools.AST.Ann
import Language.Haskell.Tools.AST.Base
import Language.Haskell.Tools.AST.Literals
import Language.Haskell.Tools.AST.Types
import Language.Haskell.Tools.AST.Exprs (Expr, FieldWildcard)
import Language.Haskell.Tools.AST.TH
data Pattern dom stage
= VarPat { _patternName :: Ann Name dom stage
}
| LitPat { _patternLiteral :: Ann Literal dom stage
}
| InfixPat { _patternLhs :: Ann Pattern dom stage
, _patternOperator :: Ann Operator dom stage
, _patternRhs :: Ann Pattern dom stage
}
| AppPat { _patternName :: Ann Name dom stage
, _patternArgs :: AnnList Pattern dom stage
}
| TuplePat { _patternElems :: AnnList Pattern dom stage
}
| UnboxTuplePat { _patternElems :: AnnList Pattern dom stage
}
| ListPat { _patternElems :: AnnList Pattern dom stage
}
| ParArrPat { _patternElems :: AnnList Pattern dom stage
}
| ParenPat { _patternInner :: Ann Pattern dom stage
}
| RecPat { _patternName :: Ann Name dom stage
, _patternFields :: AnnList PatternField dom stage
}
| AsPat { _patternName :: Ann Name dom stage
, _patternInner :: Ann Pattern dom stage
}
| WildPat
| IrrPat { _patternInner :: Ann Pattern dom stage
}
| BangPat { _patternInner :: Ann Pattern dom stage
}
| TypeSigPat { _patternInner :: Ann Pattern dom stage
, _patternType :: Ann Type dom stage
}
| ViewPat { _patternExpr :: Ann Expr dom stage
, _patternInner :: Ann Pattern dom stage
}
| SplicePat { _patternSplice :: Ann Splice dom stage
}
| QuasiQuotePat { _patQQ :: Ann QuasiQuote dom stage
}
| NPlusKPat { _patternName :: Ann Name dom stage
, _patternLit :: Ann Literal dom stage
}
data PatternField dom stage
= NormalFieldPattern { _fieldPatternName :: Ann Name dom stage
, _fieldPattern :: Ann Pattern dom stage
}
| FieldPunPattern { _fieldPatternName :: Ann Name dom stage
}
| FieldWildcardPattern { _fieldPatternWildcard :: Ann FieldWildcard dom stage
}