module SyntaxTrees.Scala.Pattern where

import SyntaxTrees.Scala.Common (Literal, QCtor, QCtorOp, Var)
import Utils.String

data Pattern
  = CtorPattern
      { Pattern -> QCtor
ctor   :: QCtor
      , Pattern -> [Pattern]
fields :: [Pattern]
      }
  | InfixCtorPattern
      { Pattern -> QCtorOp
ctorOp :: QCtorOp
      , fields :: [Pattern]
      }
  | AliasedPattern Var Pattern
  | TuplePattern [Pattern]
  | VarPattern Var
  | LitPattern Literal
  | Wildcard



instance Show Pattern where
  show :: Pattern -> String
show (CtorPattern QCtor
x [Pattern]
y)      = forall a. Show a => a -> String
show QCtor
x String -> ShowS
+++ forall a. Show a => [a] -> String
wrapParensCsv [Pattern]
y
  show (InfixCtorPattern QCtorOp
x [Pattern]
y) = forall a. Show a => String -> [a] -> String
str (ShowS
wrapSpaces forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show QCtorOp
x) [Pattern]
y
  show (AliasedPattern Var
x Pattern
y)   = ShowS
wrapParens forall a b. (a -> b) -> a -> b
$ forall a. Show a => a -> String
show Var
x String -> ShowS
+++ String
"@" String -> ShowS
+++ forall a. Show a => a -> String
show Pattern
y
  show (TuplePattern [Pattern
x])     = forall a. Show a => a -> String
show Pattern
x
  show (TuplePattern [Pattern]
x)       = forall a. Show a => [a] -> String
wrapParensCsv [Pattern]
x
  show (VarPattern Var
x)         = forall a. Show a => a -> String
show Var
x
  show (LitPattern Literal
x)         = forall a. Show a => a -> String
show Literal
x
  show Pattern
Wildcard               = String
"_"