on master help sign in
Added arrowsuntil (#39)
commit6091e0c6c90860fb6979501f5dc3d297ddaafd66 authoriko <ilyakooo0@gmail.com> dateWed 19 Feb 2020, 20:47 (7 years ago) parent1ea7c74
1 file changed+8
src/Data/Isoparsec/Internal.hs+8
src/Data/Isoparsec/Internal.hs+8
@@ -9,6 +9,8 @@ module Data.Isoparsec.Internal
99 check,
1010 unroll,
1111 arrowsWhile,
12+ assoc,
13+ arrowsUntil,
1214 )
1315where
1416
@@ -82,6 +84,9 @@ class
8284arrowsWhile :: (PolyArrow m SemiIso, ArrowPlus m) => m () a -> m () [a]
8385arrowsWhile f = ((f &&& arrowsWhile f) >>^ siCons) <+^ isoConst () []
8486
87+arrowsUntil :: (ArrowPlus m, Eq a, PolyArrow m SemiIso) => m () a -> m () b -> m () ([a], b)
88+arrowsUntil a b = (arr (konst []) &&& b) <+> (a &&& arrowsUntil a b >>^ (assoc >>> first siCons))
89+
8590unroll :: (PolyArrow m SemiIso, ArrowPlus m, Eq a) => a -> m a (b, a) -> m () [b]
8691unroll a f = (konst a ^>> unroll' f) <+^ isoConst () []
8792 where
@@ -117,3 +122,6 @@ check f = isoCheck f id id
117122
118123konst :: Eq x => x -> SemiIso () x
119124konst x = isoConst () x >>> check (== x)
125+
126+assoc :: SemiIso (a, (b, c)) ((a, b), c)
127+assoc = siPure (\(a, (b, c)) -> ((a, b), c)) (\((a, b), c) -> (a, (b, c)))