1{-# OPTIONS_GHC -Wall #-}
2module AST.Pattern where
4import qualified Data.Set as Set
5import Text.PrettyPrint as P
7import qualified AST.Helpers as Help
8import qualified AST.Literal as L
9import qualified AST.Variable as Var
10import qualified Reporting.Annotation as A
11import qualified Reporting.PrettyPrint as P
12import qualified Reporting.Region as R
16 A.Annotated ann (Pattern' ann var)
20 = Data var [Pattern ann var]
22 | Alias String (Pattern ann var)
30 Pattern R.Region Var.Raw
34 Pattern' R.Region Var.Raw
37type CanonicalPattern =
38 Pattern R.Region Var.Canonical
41list :: R.Position -> [RawPattern] -> RawPattern
45 A.at end end (Data (Var.Raw "[]") [])
47 pattern@(A.A (R.Region start _) _) : rest ->
48 A.at start end (Data (Var.Raw "::") [pattern, list end rest])
51consMany :: R.Position -> [RawPattern] -> RawPattern
52consMany end patterns =
53 let cons hd@(A.A (R.Region start _) _) tl =
54 A.at start end (Data (Var.Raw "::") [hd, tl])
59tuple :: [RawPattern] -> RawPattern'
61 Data (Var.Raw ("_Tuple" ++ show (length patterns))) patterns
66boundVars :: Pattern ann var -> [A.Annotated ann String]
67boundVars (A.A ann pattern) =
72 Alias name realPattern ->
73 A.A ann name : boundVars realPattern
76 concatMap boundVars patterns
88member :: String -> Pattern ann var -> Bool
90 any (name==) (map A.drop (boundVars pattern))
93boundVarSet :: Pattern ann var -> Set.Set String
95 Set.fromList (map A.drop (boundVars pattern))
98boundVarList :: Pattern ann var -> [String]
100 Set.toList (boundVarSet pattern)
105instance Var.ToString var => P.Pretty (Pattern' ann var) where
106 pretty dealiaser needsParens pattern =
112 P.pretty dealiaser needsParens literal
115 P.braces (P.commaCat (map P.text fields))
118 P.parensIf needsParens $
119 P.pretty dealiaser True ptrn <+> P.text "as" <+> P.text x
124 Data name [A.A _ hd, A.A _ tl]
125 | Var.toString name == "::" ->
126 P.parensIf isCons (P.pretty dealiaser False hd)
128 <+> P.pretty dealiaser False tl
132 Data ctor _ -> Var.toString ctor == "::"
135 Data name patterns ->
136 let name' = Var.toString name
138 if Help.isTuple name'
140 P.parens (P.commaCat (map (P.pretty dealiaser False) patterns))
142 P.parensIf needsParens $
143 P.hsep (P.text name' : map (P.pretty dealiaser True) patterns)
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