@@ -9,6 +9,8 @@ module Data.Isoparsec.Internal
11 arrowsWhile,
11 arrowsWhile,
@@ -82,6 +84,9 @@ class
82arrowsWhile :: (PolyArrow m SemiIso, ArrowPlus m) => m () a -> m () [a]
84arrowsWhile :: (PolyArrow m SemiIso, ArrowPlus m) => m () a -> m () [a]
83arrowsWhile f = ((f &&& arrowsWhile f) >>^ siCons) <+^ isoConst () []
85arrowsWhile f = ((f &&& arrowsWhile f) >>^ siCons) <+^ isoConst () []
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))
85unroll :: (PolyArrow m SemiIso, ArrowPlus m, Eq a) => a -> m a (b, a) -> m () [b]
90unroll :: (PolyArrow m SemiIso, ArrowPlus m, Eq a) => a -> m a (b, a) -> m () [b]
86unroll a f = (konst a ^>> unroll' f) <+^ isoConst () []
91unroll a f = (konst a ^>> unroll' f) <+^ isoConst () []
@@ -117,3 +122,6 @@ check f = isoCheck f id id
118konst :: Eq x => x -> SemiIso () x
123konst :: Eq x => x -> SemiIso () x
119konst x = isoConst () x >>> check (== x)
124konst x = isoConst () x >>> check (== x)
126+assoc :: SemiIso (a, (b, c)) ((a, b), c)
127+assoc = siPure (\(a, (b, c)) -> ((a, b), c)) (\((a, b), c) -> (a, (b, c)))