Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Data/Attoparsec/ByteString.hs
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@ module Data.Attoparsec.ByteString
, sepBy1'
, skipMany
, skipMany1
, skipTill
, skipTill'
, eitherP
, I.match
-- * State observation and manipulation functions
Expand Down
2 changes: 2 additions & 0 deletions Data/Attoparsec/ByteString/Char8.hs
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ module Data.Attoparsec.ByteString.Char8
, sepBy1'
, skipMany
, skipMany1
, skipTill
, skipTill'
, eitherP
, I.match
-- * State observation and manipulation functions
Expand Down
30 changes: 30 additions & 0 deletions Data/Attoparsec/Combinator.hs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ module Data.Attoparsec.Combinator
, sepBy1'
, skipMany
, skipMany1
, skipTill
, skipTill'
, eitherP
, feed
, satisfyElem
Expand Down Expand Up @@ -229,6 +231,34 @@ skipMany1 p = p *> skipMany p
{-# SPECIALIZE skipMany1 :: Parser Text a -> Parser Text () #-}
{-# SPECIALIZE skipMany1 :: Z.Parser a -> Z.Parser () #-}

-- | @skipTill p end@ applies action @p@ /zero/ or more times until
-- action @end@ succeeds, and returns the value returned by @end@.
-- This complements @manyTill@ and can be used to find a specific
-- pattern in a text.
--
-- The value returned by @p@ is forced to WHNF.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't believe this is true, is it?

skipTill :: Alternative f => f a -> f b -> f b
skipTill p end = scan
where scan = end <|> (p *> scan)
{-# SPECIALIZE skipTill :: Parser ByteString a -> Parser ByteString b
-> Parser ByteString b #-}
{-# SPECIALIZE skipTill :: Parser Text a -> Parser Text b -> Parser Text b #-}
{-# SPECIALIZE skipTill :: Z.Parser a -> Z.Parser b -> Z.Parser b #-}

-- | @skipTill' p end@ applies action @p@ /zero/ or more times until
-- action @end@ succeeds, and returns the value returned by @end@.
-- This complements @manyTill'@ and can be used to find a specific
-- pattern in a text.
--
-- The value returned by @p@ is forced to WHNF.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where is this forcing done?

skipTill' :: (MonadPlus m) => m a -> m b -> m b
skipTill' p end = scan
where scan = end `mplus` (p *> scan)
{-# SPECIALIZE skipTill' :: Parser ByteString a -> Parser ByteString b
-> Parser ByteString b #-}
{-# SPECIALIZE skipTill' :: Parser Text a -> Parser Text b -> Parser Text b #-}
{-# SPECIALIZE skipTill' :: Z.Parser a -> Z.Parser b -> Z.Parser b #-}

-- | Apply the given action repeatedly, returning every result.
count :: Monad m => Int -> m a -> m [a]
count n p = sequence (replicate n p)
Expand Down
2 changes: 2 additions & 0 deletions Data/Attoparsec/Text.hs
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ module Data.Attoparsec.Text
, sepBy1'
, skipMany
, skipMany1
, skipTill
, skipTill'
, eitherP
, I.match
-- * State observation and manipulation functions
Expand Down