1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Parse.Pattern (term, expression) where
7import qualified AST.Literal as L
8import qualified AST.Pattern as P
9import qualified AST.Variable as Var
11import qualified Parse.Literal as Literal
12import qualified Reporting.Annotation as A
13import qualified Reporting.Error.Syntax as E
14import qualified Reporting.Region as R
24 do start <- getPosition
33termHelp :: R.Position -> Parser P.Raw
37 [ underscore >> return P.Anything
39 , mkCtor <$> qualifiedCapVar
40 , P.Literal <$> Literal.literal
43 return (A.at start end pattern)
46mkCtor :: Text -> P.Raw'
50 P.Literal (L.Boolean True)
53 P.Literal (L.Boolean False)
56 P.Ctor (Var.Raw ctor) []
63record :: R.Position -> Parser P.Raw
66 inContext start E.ExprRecord $
71 recordHelp start [var]
74 return (A.at start end (P.Record []))
78recordHelp :: R.Position -> [Text] -> Parser P.Raw
79recordHelp start vars =
85 recordHelp start (var:vars)
88 return (A.at start end (P.Record vars))
96tuple :: R.Position -> Parser P.Raw
99 inContext start E.ExprTuple $
102 [ do (pattern, sPos) <- expression
104 tupleHelp start [pattern]
107 return (A.at start end (P.tuple []))
111tupleHelp :: R.Position -> [P.Raw] -> Parser P.Raw
112tupleHelp start patterns =
116 (pattern, sPos) <- expression
118 tupleHelp start (pattern:patterns)
125 do end <- getPosition
126 return (A.at start end (P.tuple (reverse patterns)))
134list :: R.Position -> Parser P.Raw
137 inContext start E.PatternList $
140 [ do (pattern, sPos) <- expression
145 return (P.list end [])
149listHelp :: [P.Raw] -> Parser P.Raw
154 (pattern, sPos) <- expression
156 listHelp (pattern:patterns)
157 , do end <- getPosition
159 return (P.list end (reverse patterns))
167expression :: Parser (P.Raw, SPos)
170 do start <- getPosition
172 exprHelp start [] cTerm
175consTerm :: SParser P.Raw
178 [ do start <- getPosition
179 ctor <- qualifiedCapVar
181 "True" -> boolEnd start True
182 "False" -> boolEnd start False
183 _ -> constructorHelp start ctor []
185 , (,,) <$> term <*> getPosition <*> whitespace
189boolEnd :: R.Position -> Bool -> SParser P.Raw
191 do end <- getPosition
194 ( A.at start end $ P.Literal (L.Boolean bool)
200exprHelp :: R.Position -> [P.Raw] -> (P.Raw, R.Position, SPos) -> Parser (P.Raw, SPos)
201exprHelp start patterns (pattern, end, sPos) =
207 exprHelp start (pattern:patterns) cTerm
212 newEnd <- getPosition
213 newSpace <- whitespace
215 ( A.at start newEnd (P.Alias alias (foldl (consHelp end) pattern patterns))
219 ( foldl (consHelp end) pattern patterns
225consHelp :: R.Position -> P.Raw -> P.Raw -> P.Raw
226consHelp end tl hd@(A.A (R.Region start _) _) =
227 A.at start end (P.Ctor (Var.Raw "::") [hd, tl])
230constructorHelp :: R.Position -> Text -> [P.Raw] -> SParser P.Raw
231constructorHelp start ctor args =
232 do end <- getPosition
237 constructorHelp start ctor (arg:args)
239 ( A.at start end (P.Ctor (Var.Raw ctor) (reverse args))
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