1{-# OPTIONS_GHC -Wall -fno-warn-unused-do-bind #-}
2{-# LANGUAGE OverloadedStrings #-}
10import qualified Data.List as List
11import Data.Text (Text)
13import qualified AST.Literal as L
14import qualified AST.Pattern as P
15import qualified Parse.Literal as Literal
16import Parse.Primitives (Parser, SParser, SPos, checkSpace, getPosition, hint, inContext, spaces, oneOf)
17import qualified Parse.Primitives.Keyword as Keyword
18import qualified Parse.Primitives.Symbol as Symbol
19import qualified Parse.Primitives.Variable as Var
20import Parse.Primitives.Whitespace (whitespace)
21import qualified Reporting.Annotation as A
22import qualified Reporting.Error.Syntax as E
23import qualified Reporting.Region as R
33 do start <- getPosition
42termHelp :: R.Position -> Parser P.Raw
46 [ Symbol.underscore >> return P.RAnything
47 , P.RVar <$> Var.lower
48 , upperTerm <$> Var.foreignUpper
49 , P.RLiteral <$> Literal.literal
52 return (A.at start end pattern)
55upperTerm :: (Maybe Text, Text) -> P.Raw_
59 P.RLiteral (L.Boolean True)
62 P.RLiteral (L.Boolean False)
64 (maybePrefix, name) ->
65 P.RCtor maybePrefix name []
72record :: R.Position -> Parser P.Raw
75 inContext start E.ExprRecord $
80 recordHelp start [var]
81 , do Symbol.rightCurly
83 return (A.at start end (P.RRecord []))
87recordHelp :: R.Position -> [Text] -> Parser P.Raw
88recordHelp start vars =
94 recordHelp start (var:vars)
95 , do Symbol.rightCurly
97 return (A.at start end (P.RRecord vars))
105tuple :: R.Position -> Parser P.Raw
108 inContext start E.ExprTuple $
111 [ do (pattern, sPos) <- expression
113 tupleHelp start pattern []
114 , do Symbol.rightParen
116 return (A.at start end P.RUnit)
120tupleHelp :: R.Position -> P.Raw -> [P.Raw] -> Parser P.Raw
121tupleHelp start firstPattern revPatterns =
125 (pattern, sPos) <- expression
127 tupleHelp start firstPattern (pattern : revPatterns)
128 , do Symbol.rightParen
129 case reverse revPatterns of
133 secondPattern : otherPatterns ->
134 do end <- getPosition
135 return (A.at start end (P.RTuple firstPattern secondPattern otherPatterns))
143list :: R.Position -> Parser P.Raw
146 inContext start E.PatternList $
149 [ do (pattern, sPos) <- expression
151 listHelp start [pattern]
152 , do Symbol.rightSquare
154 return (A.at start end (P.RList []))
158listHelp :: R.Position -> [P.Raw] -> Parser P.Raw
159listHelp start patterns =
163 (pattern, sPos) <- expression
165 listHelp start (pattern:patterns)
166 , do Symbol.rightSquare
168 return (A.at start end (P.RList (reverse patterns)))
176expression :: Parser (P.Raw, SPos)
179 do start <- getPosition
181 exprHelp start [] cTerm
184exprHelp :: R.Position -> [P.Raw] -> (P.Raw, R.Position, SPos) -> Parser (P.Raw, SPos)
185exprHelp start patterns (pattern, _end, sPos) =
191 exprHelp start (pattern:patterns) cTerm
196 newEnd <- getPosition
197 newSpace <- whitespace
199 ( A.at start newEnd (P.RAlias alias (List.foldl' cons pattern patterns))
203 ( List.foldl' cons pattern patterns
209cons :: P.Raw -> P.Raw -> P.Raw
210cons tl@(A.A (R.Region _ end) _) hd@(A.A (R.Region start _) _) =
211 A.at start end (P.RCons hd tl)
218exprTerm :: SParser P.Raw
221 [ do start <- getPosition
222 pair <- Var.foreignUpper
223 exprTermHelp start pair []
225 , (,,) <$> term <*> getPosition <*> whitespace
229exprTermHelp :: R.Position -> (Maybe Text, Text) -> [P.Raw] -> SParser P.Raw
230exprTermHelp start pair@(prefix, name) args =
231 do end <- getPosition
236 exprTermHelp start pair (arg:args)
238 ( A.at start end (P.RCtor prefix name (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