-- | UPattern matching on pattern-level AST fragments for refactorings.

{-# LANGUAGE PatternSynonyms #-}

module Language.Haskell.Tools.Rewrite.Match.Patterns where

import Language.Haskell.Tools.AST (Ann(..), UPatternField(..), UPattern(..))
import Language.Haskell.Tools.Rewrite.ElementTypes

-- | Pattern name binding

pattern VarPat :: Name -> Pattern
pattern VarPat var <- Ann _ (UVarPat var)

-- | Literal pattern

pattern LitPat :: Literal -> Pattern
pattern LitPat lit <- Ann _ (ULitPat lit)

-- | Infix constructor application pattern (@ a :+: b @)

pattern InfixAppPat :: Pattern -> Operator -> Pattern -> Pattern
pattern InfixAppPat lhs op rhs <- Ann _ (UInfixAppPat lhs op rhs)

-- | Constructor application pattern (@ Point x y @)

pattern AppPat :: Name -> PatternList -> Pattern
pattern AppPat n pat <- Ann _ (UAppPat n pat)

-- | Tuple pattern (@ (x,y) @)

pattern TuplePat :: PatternList -> Pattern
pattern TuplePat pats <- Ann _ (UTuplePat pats)

-- | Unboxed tuple pattern (@ (\# x, y \#) @)

pattern UnboxTuplePat :: PatternList -> Pattern
pattern UnboxTuplePat pats <- Ann _ (UUnboxTuplePat pats)

-- | List pattern (@ [1,2,a,x] @)

pattern ListPat :: PatternList -> Pattern
pattern ListPat pats <- Ann _ (UListPat pats)

-- | Parallel array pattern (@ [:1,2,a,x:] @)

pattern ParArrayPat :: PatternList -> Pattern
pattern ParArrayPat pats <- Ann _ (UParArrPat pats)

-- | Parenthesised patterns

pattern ParenPat :: Pattern -> Pattern
pattern ParenPat pat <- Ann _ (UParenPat pat)

-- | Record pattern (@ Point { x = 3, y } @)

pattern RecPat :: Name -> PatternFieldList -> Pattern
pattern RecPat name flds <- Ann _ (URecPat name flds)

-- | As-pattern (explicit name binding) (@ ls\@(hd:_) @)

pattern AsPat :: Name -> Pattern -> Pattern
pattern AsPat name pat <- Ann _ (UAsPat name pat)

-- | Wildcard pattern: (@ _ @)

pattern WildPat :: Pattern
pattern WildPat <- Ann _ UWildPat

-- | Irrefutable pattern (@ ~(x:_) @)

pattern IrrefutablePat :: Pattern -> Pattern
pattern IrrefutablePat pat <- Ann _ (UIrrefutablePat pat)

-- | Bang pattern (@ !x @)

pattern BangPat :: Pattern -> Pattern
pattern BangPat pat <- Ann _ (UBangPat pat)

-- | Pattern with explicit type signature (@ x :: Int @)

pattern TypeSigPat :: Pattern -> Type -> Pattern
pattern TypeSigPat pat typ <- Ann _ (UTypeSigPat pat typ)

-- | View pattern (@ f -> Just 1 @)

pattern ViewPat :: Expr -> Pattern -> Pattern
pattern ViewPat name pat <- Ann _ (UViewPat name pat)

-- | Splice patterns: @$(generateX inp)@

pattern SplicePat :: Splice -> Pattern
pattern SplicePat splice <- Ann _ (USplicePat splice)

-- | Quasi-quoted patterns: @[| 1 + 2 |]@

pattern QuasiQuotePat :: QuasiQuote -> Pattern
pattern QuasiQuotePat qq <- Ann _ (UQuasiQuotePat qq)

pattern NPlusKPat :: Name -> Literal -> Pattern
pattern NPlusKPat name lit <- Ann _ (UNPlusKPat name lit)

-- | Named field pattern (@ p = Point 3 2 @)

pattern FieldPattern :: Name -> Pattern -> PatternField
pattern FieldPattern name pat <- Ann _ (UNormalFieldPattern name pat)

-- | Named field pun (@ p @)

pattern FieldPunPattern :: Name -> PatternField
pattern FieldPunPattern name <- Ann _ (UFieldPunPattern name)

-- | Wildcard field pattern (@ .. @)

pattern FieldWildcardPattern :: FieldWildcard -> PatternField
pattern FieldWildcardPattern wildc <- Ann _ (UFieldWildcardPattern wildc)