on master help sign in
Destruct Parser new type directly, not with helper
765f61aEvan Czaplicki
src/Parse/Primitives.hs+26−25
@@ -55,16 +55,15 @@ import Reporting.Error.Syntax
55
55
56
56
57newtype Parser a =
57newtype Parser a =
58− Parser
58+ Parser (
59− { _run
60− :: forall b.
59+ forall b.
61− State
60+ State
62− -> (a -> State -> ParseError -> b) -- consumed ok
61+ -> (a -> State -> ParseError -> b) -- consumed ok
63− -> ( ParseError -> b) -- consumed err
62+ -> ( ParseError -> b) -- consumed err
64− -> (a -> State -> ParseError -> b) -- empty ok
63+ -> (a -> State -> ParseError -> b) -- empty ok
65− -> ( ParseError -> b) -- empty err
64+ -> ( ParseError -> b) -- empty err
66− -> b
65+ -> b
67− }
66+ )
68
67
69
68
70data State =
69data State =
@@ -101,8 +100,8 @@ run parser text =
101
100
102
101
103runAt :: Int -> Int -> Parser a -> Text -> Either (A.Located E.Error) a
102runAt :: Int -> Int -> Parser a -> Text -> Either (A.Located E.Error) a
104−runAt sRow sCol parser (Text.Text array offset length) =
103+runAt sRow sCol (Parser parser) (Text.Text array offset length) =
105− case _run parser (State array offset length 0 sRow sCol []) Ok Err Ok Err of
104+ case parser (State array offset length 0 sRow sCol []) Ok Err Ok Err of
106 Ok value _ _ ->
105 Ok value _ _ ->
107 Right value
106 Right value
108
107
@@ -139,9 +138,9 @@ data Result a
139
138
140
139
141try :: Parser a -> Parser a
140try :: Parser a -> Parser a
142−try parser =
141+try (Parser parser) =
143 Parser $ \state cok _ eok eerr ->
142 Parser $ \state cok _ eok eerr ->
144− _run parser state cok eerr eok eerr
143+ parser state cok eerr eok eerr
145
144
146
145
147shaderFailure :: Int -> Int -> Text -> Parser a
146shaderFailure :: Int -> Int -> Text -> Parser a
@@ -157,7 +156,7 @@ deadend thrys =
157
156
158
157
159hint :: E.Next -> Parser a -> Parser a
158hint :: E.Next -> Parser a -> Parser a
160−hint next parser =
159+hint next (Parser parser) =
161 Parser $ \state@(State _ _ _ _ row col ctx) cok cerr eok eerr ->
160 Parser $ \state@(State _ _ _ _ row col ctx) cok cerr eok eerr ->
162 let
161 let
163 eok' x s _ =
162 eok' x s _ =
@@ -166,7 +165,7 @@ hint next parser =
166 eerr' _ =
165 eerr' _ =
167 eerr (expect row col ctx (Expecting next))
166 eerr (expect row col ctx (Expecting next))
168 in
167 in
169− _run parser state cok cerr eok' eerr'
168+ parser state cok cerr eok' eerr'
170
169
171
170
172endOfFile :: Parser ()
171endOfFile :: Parser ()
@@ -185,13 +184,13 @@ endOfFile =
185
184
186instance Functor Parser where
185instance Functor Parser where
187 {-# INLINE fmap #-}
186 {-# INLINE fmap #-}
188− fmap f parser =
187+ fmap f (Parser parser) =
189 Parser $ \state cok cerr eok eerr ->
188 Parser $ \state cok cerr eok eerr ->
190 let
189 let
191 cok' x s e = cok (f x) s e
190 cok' x s e = cok (f x) s e
192 eok' x s e = eok (f x) s e
191 eok' x s e = eok (f x) s e
193 in
192 in
194− _run parser state cok' cerr eok' eerr
193+ parser state cok' cerr eok' eerr
195
194
196
195
197
196
@@ -226,7 +225,7 @@ allTheOptionsFailed =
226
225
227
226
228oneOfHelp :: Parser a -> Parser a -> Parser a
227oneOfHelp :: Parser a -> Parser a -> Parser a
229−oneOfHelp parser1 parser2 =
228+oneOfHelp (Parser parser1) (Parser parser2) =
230 Parser $ \state cok cerr eok eerr ->
229 Parser $ \state cok cerr eok eerr ->
231 let
230 let
232 eerr1 e1 =
231 eerr1 e1 =
@@ -234,9 +233,9 @@ oneOfHelp parser1 parser2 =
234 eok2 y s e2 = eok y s (mergeErrors e1 e2)
233 eok2 y s e2 = eok y s (mergeErrors e1 e2)
235 eerr2 e2 = eerr (mergeErrors e1 e2)
234 eerr2 e2 = eerr (mergeErrors e1 e2)
236 in
235 in
237− _run parser2 state cok cerr eok2 eerr2
236+ parser2 state cok cerr eok2 eerr2
238 in
237 in
239− _run parser1 state cok cerr eok eerr1
238+ parser1 state cok cerr eok eerr1
240
239
241
240
242mergeErrors :: ParseError -> ParseError -> ParseError
241mergeErrors :: ParseError -> ParseError -> ParseError
@@ -277,7 +276,7 @@ instance Monad Parser where
277 eok value state noError
276 eok value state noError
278
277
279 {-# INLINE (>>=) #-}
278 {-# INLINE (>>=) #-}
280− parser >>= callback =
279+ (Parser parser) >>= callback =
281 Parser $ \state cok cerr eok eerr ->
280 Parser $ \state cok cerr eok eerr ->
282 let
281 let
283 cok1 x s1 e1 =
282 cok1 x s1 e1 =
@@ -285,16 +284,18 @@ instance Monad Parser where
285 eok2 y s2 e2 = cok y s2 (mergeErrors e1 e2)
284 eok2 y s2 e2 = cok y s2 (mergeErrors e1 e2)
286 eerr2 e2 = cerr (mergeErrors e1 e2)
285 eerr2 e2 = cerr (mergeErrors e1 e2)
287 in
286 in
287+ case callback x of
288− _run (callback x) s1 cok cerr eok2 eerr2
288+ Parser parser2 -> parser2 s1 cok cerr eok2 eerr2
289
289
290 eok1 x s1 e1 =
290 eok1 x s1 e1 =
291 let
291 let
292 eok2 y s2 e2 = eok y s2 (mergeErrors e1 e2)
292 eok2 y s2 e2 = eok y s2 (mergeErrors e1 e2)
293 eerr2 e2 = eerr (mergeErrors e1 e2)
293 eerr2 e2 = eerr (mergeErrors e1 e2)
294 in
294 in
295+ case callback x of
295− _run (callback x) s1 cok cerr eok2 eerr2
296+ Parser parser2 -> parser2 s1 cok cerr eok2 eerr2
296 in
297 in
297− _run parser state cok1 cerr eok1 eerr
298+ parser state cok1 cerr eok1 eerr
298
299
299
300
300
301