0 | module Data.List.Suffix.Result0
2 | import Derive.Prelude
4 | import Data.List.Suffix
7 | import Text.ParseError
10 | %language ElabReflection
46 | -> {auto 0 p : Suffix b xs ts}
47 | -> Result0 b t ts e a
54 | -> Result0 b t ts e a
58 | public export %inline
65 | -> (0 p : Suffix b xs ts)
66 | -> Result0 b t ts e a
67 | succ val _ = Succ0 val xs
70 | Functor (Result0 b t ts e) where
71 | map f (Succ0 v xs) = Succ0 (f v) xs
72 | map _ (Fail0 err) = Fail0 err
74 | public export %inline
78 | -> {auto 0 p : Suffix b xs ts}
80 | -> Result0 b t ts e a
81 | fromEither xs (Left x) = Fail0 x
82 | fromEither xs (Right x) = Succ0 x xs
88 | public export %inline
89 | swapOr : {0 x,y : _} -> Result0 (x || y) t ts e a -> Result0 (y || x) t ts e a
90 | swapOr = swapOr (\k => Result0 k t ts e a)
92 | public export %inline
93 | orSame : {0 x : _} -> Result0 (x || x) t ts e a -> Result0 x t ts e a
94 | orSame = orSame (\k => Result0 k t ts e a)
96 | public export %inline
97 | orTrue : {0 x : _} -> Result0 (x || True) t ts e a -> Result0 True t ts e a
98 | orTrue = orTrue (\k => Result0 k t ts e a)
100 | public export %inline
101 | orFalse : {0 x : _} -> Result0 (x || False) t ts e a -> Result0 x t ts e a
102 | orFalse = orFalse (\k => Result0 k t ts e a)
104 | public export %inline
105 | swapAnd : {0 x,y : _} -> Result0 (x && y) t ts e a -> Result0 (y && x) t ts e a
106 | swapAnd = swapAnd (\k => Result0 k t ts e a)
108 | public export %inline
109 | andSame : {0 x : _} -> Result0 (x && x) t ts e a -> Result0 x t ts e a
110 | andSame = andSame (\k => Result0 k t ts e a)
112 | public export %inline
113 | andTrue : {0 x : _} -> Result0 (x && True) t ts e a -> Result0 x t ts e a
114 | andTrue = andTrue (\k => Result0 k t ts e a)
116 | public export %inline
117 | andFalse : {0 x : _} -> Result0 (x && False) t ts e a -> Result0 False t ts e a
118 | andFalse = andFalse (\k => Result0 k t ts e a)
120 | public export %inline
121 | weaken : {0 x : _} -> Result0 x t ts e a -> Result0 False t ts e a
122 | weaken (Succ0 val xs @{p}) = Succ0 val xs @{weaken p}
123 | weaken (Fail0 err) = Fail0 err
125 | public export %inline
126 | weakens : {0 x : _} -> Result0 True t ts e a -> Result0 x t ts e a
127 | weakens (Succ0 val xs @{p}) = Succ0 val xs @{weakens p}
128 | weakens (Fail0 err) = Fail0 err
130 | public export %inline
131 | and1 : {0 x : _} -> Result0 x t ts e a -> Result0 (x && y) t ts e a
132 | and1 (Succ0 val xs @{p}) = Succ0 val xs @{and1 p}
133 | and1 (Fail0 err) = Fail0 err
135 | public export %inline
136 | and2 : {0 x : _} -> Result0 x t ts e a -> Result0 (y && x) t ts e a
137 | and2 r = swapAnd $
and1 r
139 | public export %inline
141 | Result0 b1 t xs e a
142 | -> (0 _ : Suffix b2 xs ys)
143 | -> Result0 (b1 || b2) t ys e a
144 | trans (Succ0 val ts @{p}) q = Succ0 val ts @{trans p q}
145 | trans (Fail0 err) _ = Fail0 err
147 | public export %inline
149 | Result0 b1 t xs e a
150 | -> {auto 0 p : Suffix True xs ys}
151 | -> Result0 True t ys e a
152 | succT r = swapOr $
trans r p
154 | public export %inline
156 | Result0 b1 t xs e a
157 | -> {auto 0 p : Suffix True xs ys}
158 | -> Result0 False t ys e a
159 | succF r = weaken $
trans r p
167 | Result0 b1 t ts e a
168 | -> Lazy (Result0 b2 t ts e a)
169 | -> Result0 (b1 && b2) t ts e a
170 | Succ0 v xs @{p} <|> _ = Succ0 v xs @{and1 p}
171 | Fail0 _ <|> r2 = and2 r2
185 | -> ((ts : List t) -> Result0 True t ts e a)
186 | -> List t -> Either e (List a)
187 | run f cs = go [<] cs suffixAcc
192 | -> (0 acc : SuffixAcc ts)
193 | -> Either e (List a)
194 | go sx [] _ = Right $
sx <>> []
195 | go sx xs (SA r) = case f xs of
196 | Succ0 v xs2 => go (sx :< v) xs2 r
197 | Fail0 err => Left err
207 | runDropWhitespace :
209 | -> ((cs : List Char) -> Result0 True Char cs e a)
210 | -> List Char -> Either e (List a)
211 | runDropWhitespace f cs = go [<] cs suffixAcc
215 | -> (cs : List Char)
216 | -> (0 acc : SuffixAcc cs)
217 | -> Either e (List a)
218 | go sx [] _ = Right $
sx <>> []
219 | go sx (x::xs) (SA r) =
220 | if isSpace x then go sx xs r
221 | else case f (x::xs) of
222 | Succ0 v xs2 => go (sx :< v) xs2 r
223 | Fail0 err => Left err
230 | data TokError : Type -> Type where
232 | ExpectedEOI : t -> TokError t
233 | Unexpected : t -> TokError t
236 | Interpolation t => Interpolation (TokError t) where
237 | interpolate (Unexpected t) = "Unexpected item: \{t}"
238 | interpolate EOI = "End of input"
239 | interpolate (ExpectedEOI t) = "Expected end of input but found: \{t}"
241 | %runElab derive "TokError" [Show,Eq]
247 | 0 AutoTok0 : (t,e,a : Type) -> Type
251 | -> {auto 0 p : Suffix True xs orig}
252 | -> Result0 True t orig e a
256 | 0 SafeTok0 : (t,a : Type) -> Type
261 | -> {auto 0 p : Suffix True xs orig}
262 | -> Result0 True t orig e a
267 | 0 OntoTok0 : (t,e,a : Type) -> Type
271 | -> {auto 0 p : Suffix False xs orig}
272 | -> Result0 True t orig e a
275 | head : OntoTok0 t (TokError t) t
276 | head (x :: xs) = Succ0 x xs
277 | head [] = Fail0 EOI
280 | eoi : AutoTok0 t (TokError t) ()
281 | eoi [] = Succ0 () []
282 | eoi (x :: _) = Fail0 (ExpectedEOI x)
285 | takeOnto : SnocList t -> (n : Nat) -> AutoTok0 t (TokError t) (SnocList t)
286 | takeOnto st 0 xs = Succ0 st xs
287 | takeOnto st (S k) (x :: xs) = takeOnto (st :< x) k xs
288 | takeOnto st (S k) [] = Fail0 EOI
290 | public export %inline
291 | take : (n : Nat) -> AutoTok0 t (TokError t) (SnocList t)
292 | take = takeOnto [<]
294 | public export %inline
295 | take1 : (n : Nat) -> (0 _ : IsSucc n) => OntoTok0 t (TokError t) (SnocList t)
296 | take1 (S n) (x :: xs) = takeOnto [<x] n xs
297 | take1 _ [] = Fail0 EOI
300 | takeWhileOnto : SnocList t -> (t -> Bool) -> SafeTok0 t (SnocList t)
301 | takeWhileOnto st f (x :: xs) =
302 | if f x then takeWhileOnto (st :< x) f xs else Succ0 st (x::xs)
303 | takeWhileOnto st f [] = Succ0 st []
305 | public export %inline
306 | takeWhile : (t -> Bool) -> SafeTok0 t (SnocList t)
307 | takeWhile = takeWhileOnto [<]
309 | public export %inline
310 | takeWhile1 : (t -> Bool) -> OntoTok0 t (TokError t) (SnocList t)
311 | takeWhile1 f (x :: xs) =
312 | if f x then takeWhileOnto [<x] f xs else Fail0 (Unexpected x)
313 | takeWhile1 f [] = Fail0 EOI
315 | public export %inline
316 | takeUntil : (t -> Bool) -> SafeTok0 t (SnocList t)
317 | takeUntil f = takeWhile (not . f)
319 | public export %inline
320 | takeUntil1 : (t -> Bool) -> OntoTok0 t (TokError t) (SnocList t)
321 | takeUntil1 f = takeWhile1 (not . f)
324 | takeWhileJustOnto : SnocList s -> (t -> Maybe s) -> SafeTok0 t (SnocList s)
325 | takeWhileJustOnto st f (x :: xs) = case f x of
326 | Just vs => takeWhileJustOnto (st :< vs) f xs
327 | Nothing => Succ0 st (x::xs)
328 | takeWhileJustOnto st f [] = Succ0 st []
330 | public export %inline
331 | takeWhileJust : (t -> Maybe s) -> SafeTok0 t (SnocList s)
332 | takeWhileJust = takeWhileJustOnto [<]
335 | takeWhileJust1 : (t -> Maybe s) -> OntoTok0 t (TokError t) (SnocList s)
336 | takeWhileJust1 f (x :: xs) = case f x of
337 | Just vs => takeWhileJustOnto [<vs] f xs
338 | Nothing => Fail0 (Unexpected x)
339 | takeWhileJust1 f [] = Fail0 EOI
341 | public export %inline
342 | accum : s -> (s -> t -> Maybe s) -> SafeTok0 t s
343 | accum cur f (x::xs) = case f cur x of
344 | Just s2 => accum s2 f xs
345 | Nothing => Succ0 cur (x::xs)
346 | accum cur f [] = Succ0 cur []
348 | public export %inline
349 | accum1 : s -> (s -> t -> Maybe s) -> OntoTok0 t (TokError t) s
350 | accum1 cur f (x::xs) = case f cur x of
351 | Just s2 => accum s2 f xs
352 | Nothing => Fail0 (Unexpected x)
353 | accum1 cur f [] = Fail0 EOI
356 | data AccumRes : (state,err : Type) -> Type where
357 | Done : {0 state,err : _} -> AccumRes state err
358 | Cont : {0 state,err : _} -> state -> AccumRes state err
359 | Error : {0 state,err : _} -> err -> AccumRes state err
361 | public export %inline
362 | accumErr : s -> (s -> x) -> (s -> t -> AccumRes s e) -> AutoTok0 t e x
363 | accumErr cur f g (x::xs) = case g cur x of
364 | Done => Succ0 (f cur) (x::xs)
365 | Cont s' => accumErr s' f g xs
366 | Error err => Fail0 err
367 | accumErr cur f g [] = Succ0 (f cur) []
373 | public export %inline
374 | FailParse (Result0 b t ts (Bounded $
InnerError y)) y where
375 | parseFail b err = Fail0 (B err b)
387 | {auto int : Interpolation t}
390 | -> Result0 b1 (Bounded t) ts (Bounded $
InnerError e) a
391 | -> Result0 b2 (Bounded t) ts (Bounded $
InnerError e) x
392 | failInParen b tok (Fail0 (B EOI _)) = unclosed b tok
393 | failInParen b tok (Fail0 err) = Fail0 err
394 | failInParen b tok (Succ0 _ []) = unclosed b tok
395 | failInParen b tok (Succ0 _ (x :: xs)) = unexpected x
400 | {auto int : Interpolation t}
401 | -> List (Bounded t)
402 | -> Result0 b (Bounded t) ts (Bounded $
InnerError y) a
403 | fail (x :: xs) = unexpected x
408 | {auto int : Interpolation t}
411 | -> Result0 b (Bounded t) ts (Bounded $
InnerError e) a
412 | -> Either (ParseError e) a
413 | result o s (Fail0 err) = Left $
toParseError o s err
414 | result _ s (Succ0 res []) = Right res
415 | result o s (Succ0 res (x :: xs)) = leftErr o s $
unexpected x