@@ -221,6 +221,7 @@ import Streamly.Internal.Data.Parser.ParserD.Type
222-- >>> :set -package streamly
222-- >>> :set -package streamly
223-- >>> import Prelude hiding ()
223-- >>> import Prelude hiding ()
224+-- >>> import qualified Data.Maybe as Maybe
224-- >>> import qualified Streamly.Prelude as Stream
225-- >>> import qualified Streamly.Prelude as Stream
225-- >>> import qualified Streamly.Internal.Data.Stream.IsStream as Stream
226-- >>> import qualified Streamly.Internal.Data.Stream.IsStream as Stream
226-- >>> import qualified Streamly.Data.Fold as Fold
227-- >>> import qualified Streamly.Data.Fold as Fold
@@ -330,25 +331,6 @@ eof = Parser step initial return
331 step () _ = return $ Error "eof: not at end of input"
332 step () _ = return $ Error "eof: not at end of input"
333−-- | See 'Streamly.Internal.Data.Parser.satisfy'.
337−{-# INLINE satisfy #-}
338−satisfy :: MonadThrow m => (a -> Bool) -> Parser m a a
339−satisfy predicate = Parser step initial extract
343− initial = return $ IPartial ()
345− step () a = return $
348− else Error "satisfy: predicate failed"
350− extract _ = throwM $ ParseError "satisfy: end of input"
352-- | See 'Streamly.Internal.Data.Parser.next'.
334-- | See 'Streamly.Internal.Data.Parser.next'.
354-- /Pre-release/
336-- /Pre-release/
@@ -361,12 +343,35 @@ next = Parser step initial extract
361 step _ a = pure $ Done 0 (Just a)
343 step _ a = pure $ Done 0 (Just a)
362 extract _ = pure Nothing
344 extract _ = pure Nothing
346+-- | See 'Streamly.Internal.Data.Parser.either'.
350+{-# INLINE either #-}
351+either :: MonadThrow m => (a -> Either String b) -> Parser m a b
352+either f = Parser step initial extract
356+ initial = return $ IPartial ()
358+ step () a = return $
361+ Left err -> Error err
363+ extract _ = throwM $ ParseError "end of input"
364-- | See 'Streamly.Internal.Data.Parser.maybe'.
365-- | See 'Streamly.Internal.Data.Parser.maybe'.
367+-- >>> toEither = Maybe.maybe (Left "maybe: predicate failed") Right
368+-- >>> maybe f = Parser.either (toEither . f)
366-- /Pre-release/
370-- /Pre-release/
368{-# INLINE maybe #-}
372{-# INLINE maybe #-}
369maybe :: MonadThrow m => (a -> Maybe b) -> Parser m a b
373maybe :: MonadThrow m => (a -> Maybe b) -> Parser m a b
374+-- maybe f = either (Maybe.maybe (Left "maybe: predicate failed") Right . f)
370maybe parserF = Parser step initial extract
375maybe parserF = Parser step initial extract
@@ -380,24 +385,28 @@ maybe parserF = Parser step initial extract
381 extract _ = throwM $ ParseError "maybe: end of input"
386 extract _ = throwM $ ParseError "maybe: end of input"
383−-- | See 'Streamly.Internal.Data.Parser.either'.
388+-- | See 'Streamly.Internal.Data.Parser.satisfy'.
390+-- >>> toMaybe f x = if f x then Just x else Nothing
391+-- >>> satisfy f = Parser.maybe (toMaybe f)
385-- /Pre-release/
393-- /Pre-release/
387−{-# INLINE either #-}
395+{-# INLINE satisfy #-}
388−either :: MonadThrow m => (a -> Either String b) -> Parser m a b
396+satisfy :: MonadThrow m => (a -> Bool) -> Parser m a a
397+-- satisfy predicate = maybe (\a -> if predicate a then Just a else Nothing)
389−either parserF = Parser step initial extract
398+satisfy predicate = Parser step initial extract
393 initial = return $ IPartial ()
402 initial = return $ IPartial ()
395 step () a = return $
404 step () a = return $
396− case parserF a of
405+ if predicate a
397− Right b -> Done 0 b
406+ then Done 0 a
398− Left err -> Error $ "either: " ++ err
407+ else Error "satisfy: predicate failed"
400− extract _ = throwM $ ParseError "either: end of input"
409+ extract _ = throwM $ ParseError "satisfy: end of input"
402-------------------------------------------------------------------------------
411-------------------------------------------------------------------------------
403-- Taking elements
412-- Taking elements