module Language.Haskell.Tools.AST.Gen.Patterns where
import qualified Name as GHC
import Data.List
import Data.String
import Data.Function (on)
import Control.Reference
import Language.Haskell.Tools.AST
import Language.Haskell.Tools.AST.ElementTypes
import Language.Haskell.Tools.AST.Gen.Utils
import Language.Haskell.Tools.AST.Gen.Names
import Language.Haskell.Tools.Transform
mkVarPat :: Name dom -> Pattern dom
mkVarPat = mkAnn child . UVarPat
mkLitPat :: Literal dom -> Pattern dom
mkLitPat = mkAnn child . ULitPat
mkInfixAppPat :: Pattern dom -> Operator dom -> Pattern dom -> Pattern dom
mkInfixAppPat lhs op rhs = mkAnn (child <> " " <> child <> " " <> child) $ UInfixAppPat lhs op rhs
mkAppPat :: Name dom -> [Pattern dom] -> Pattern dom
mkAppPat n pat = mkAnn (child <> child) $ UAppPat n (mkAnnList (after " " $ separatedBy " " list) pat)
mkTuplePat :: [Pattern dom] -> Pattern dom
mkTuplePat pats = mkAnn ("(" <> child <> ")") $ UTuplePat (mkAnnList (separatedBy ", " list) pats)
mkUnboxTuplePat :: [Pattern dom] -> Pattern dom
mkUnboxTuplePat pats = mkAnn ("(# " <> child <> " #)") $ UUnboxTuplePat (mkAnnList (separatedBy ", " list) pats)
mkListPat :: [Pattern dom] -> Pattern dom
mkListPat pats = mkAnn ("[" <> child <> "]") $ UListPat (mkAnnList (separatedBy ", " list) pats)
mkParArrayPat :: [Pattern dom] -> Pattern dom
mkParArrayPat pats = mkAnn ("[:" <> child <> ":]") $ UParArrPat (mkAnnList (separatedBy ", " list) pats)
mkParenPat :: Pattern dom -> Pattern dom
mkParenPat = mkAnn ("(" <> child <> ")") . UParenPat
mkRecPat :: Name dom -> [PatternField dom] -> Pattern dom
mkRecPat name flds = mkAnn (child <> "{ " <> child <> " }") $ URecPat name (mkAnnList (separatedBy ", " list) flds)
mkAsPat :: Name dom -> Pattern dom -> Pattern dom
mkAsPat name pat = mkAnn (child <> "@" <> child) $ UAsPat name pat
mkWildPat :: Pattern dom
mkWildPat = mkAnn "_" UWildPat
mkIrrefutablePat :: Pattern dom -> Pattern dom
mkIrrefutablePat = mkAnn ("~" <> child) . UIrrefutablePat
mkBangPat :: Pattern dom -> Pattern dom
mkBangPat = mkAnn ("!" <> child) . UBangPat
mkTypeSigPat :: Pattern dom -> Type dom -> Pattern dom
mkTypeSigPat pat typ = mkAnn (child <> " :: " <> child) $ UTypeSigPat pat typ
mkViewPat :: Expr dom -> Pattern dom -> Pattern dom
mkViewPat name pat = mkAnn (child <> " -> " <> child) $ UViewPat name pat
mkSplicePat :: Splice dom -> Pattern dom
mkSplicePat = mkAnn child . USplicePat
mkQuasiQuotePat :: QuasiQuote dom -> Pattern dom
mkQuasiQuotePat = mkAnn child . UQuasiQuotePat
mkPatternField :: Name dom -> Pattern dom -> PatternField dom
mkPatternField name pat = mkAnn (child <> " = " <> child) $ UNormalFieldPattern name pat
mkFieldPunPattern :: Name dom -> PatternField dom
mkFieldPunPattern name = mkAnn child $ UFieldPunPattern name
mkFieldWildcardPattern :: PatternField dom
mkFieldWildcardPattern = mkAnn child $ UFieldWildcardPattern $ mkAnn ".." FldWildcard