1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module AST.Pattern where
5import qualified Data.List as List
6import qualified Data.Set as Set
7import qualified Data.Text as Text
10import qualified AST.Literal as L
11import qualified AST.Variable as Var
12import qualified Reporting.Annotation as A
13import qualified Reporting.Region as R
17 A.Annotated ann (Pattern' ann var)
21 = Ctor var [Pattern ann var]
23 | Alias Text (Pattern ann var)
30 Pattern R.Region Var.Raw
34 Pattern' R.Region Var.Raw
38 Pattern R.Region Var.Canonical
41isVar :: Text -> Pattern ann var -> Bool
42isVar name (A.A _ pattern) =
51list :: R.Position -> [Raw] -> Raw
55 A.at end end (Ctor (Var.Raw "[]") [])
57 pattern@(A.A (R.Region start _) _) : rest ->
58 A.at start end (Ctor (Var.Raw "::") [pattern, list end rest])
65 Text.append "_Tuple" (Text.pack (show (length patterns)))
67 Ctor (Var.Raw name) patterns
74boundVars :: Pattern ann var -> [A.Annotated ann Text]
75boundVars (A.A ann pattern) =
80 Alias name realPattern ->
81 A.A ann name : boundVars realPattern
84 concatMap boundVars patterns
96member :: Text -> Pattern ann var -> Bool
98 elem name (map A.drop (boundVars pattern))
101boundVarSet :: Pattern ann var -> Set.Set Text
103 Set.fromList (map A.drop (boundVars pattern))
106boundVarList :: Pattern ann var -> [Text]
107boundVarList pattern =
108 Set.toList (boundVarSet pattern)
115toString :: Bool -> Canonical -> String
116toString needsParens (A.A _ pattern) =
122 if Var.isTuple name then
128 if Var.isTuple name then
129 "( " ++ List.intercalate ", " (map (toString False) args) ++ " )"
131 parensIf needsParens $
132 Var.toString name ++ concatMap ((" "++) . toString True) args
135 "{" ++ List.intercalate "," (map Text.unpack fields) ++ "}"
137 Alias alias subPattern ->
138 parensIf needsParens $
139 toString False subPattern ++ " as " ++ Text.unpack alias
148parensIf :: Bool -> String -> String
149parensIf needsParens str =
150 if needsParens then "(" ++ str ++ ")" else str
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list