diff options
Diffstat (limited to 'Pipes')
-rw-r--r-- | Pipes/Text.hs | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/Pipes/Text.hs b/Pipes/Text.hs index e8b64dc..74d2023 100644 --- a/Pipes/Text.hs +++ b/Pipes/Text.hs | |||
@@ -1,4 +1,4 @@ | |||
1 | {-# LANGUAGE RankNTypes, TypeFamilies, NoMonomorphismRestriction #-} | 1 | {-# LANGUAGE RankNTypes, TypeFamilies #-} |
2 | 2 | ||
3 | {-| This module provides @pipes@ utilities for \"text streams\", which are | 3 | {-| This module provides @pipes@ utilities for \"text streams\", which are |
4 | streams of 'Text' chunks. The individual chunks are uniformly @strict@, but | 4 | streams of 'Text' chunks. The individual chunks are uniformly @strict@, but |
@@ -587,20 +587,23 @@ count :: (Monad m, Num n) => Text -> Producer Text m () -> m n | |||
587 | count c p = P.fold (+) 0 id (p >-> P.map (fromIntegral . T.count c)) | 587 | count c p = P.fold (+) 0 id (p >-> P.map (fromIntegral . T.count c)) |
588 | {-# INLINABLE count #-} | 588 | {-# INLINABLE count #-} |
589 | 589 | ||
590 | -- | Transform a Pipe of 'ByteString's expected to be UTF-8 encoded | 590 | -- | Transform a Pipe of 'ByteString's expected to be UTF-8 encoded into a Pipe of Text |
591 | -- into a Pipe of Text | 591 | -- returning a Pipe of ByteStrings that begins at the point of failure. |
592 | 592 | ||
593 | decodeUtf8 :: Monad m => Producer ByteString m r -> Producer Text m (Producer ByteString m r) | 593 | decodeUtf8 :: Monad m => Producer ByteString m r -> Producer Text m (Producer ByteString m r) |
594 | decodeUtf8 = go B.empty PE.streamDecodeUtf8 where | 594 | decodeUtf8 = go B.empty PE.streamDecodeUtf8 where |
595 | go carry dec0 p = do | 595 | go carry dec0 p = do |
596 | x <- lift (next p) | 596 | x <- lift (next p) |
597 | case x of Left r -> return (do yield carry | 597 | case x of Left r -> if B.null carry |
598 | return r) | 598 | then return (return r) -- all input was consumed |
599 | else return (do yield carry -- a potentially valid fragment remains | ||
600 | return r) | ||
601 | |||
599 | Right (chunk, p') -> case dec0 chunk of | 602 | Right (chunk, p') -> case dec0 chunk of |
600 | PE.Some text carry2 dec -> do yield text | 603 | PE.Some text carry2 dec -> do yield text |
601 | go carry2 dec p' | 604 | go carry2 dec p' |
602 | PE.Other text bs -> do yield text | 605 | PE.Other text bs -> do yield text |
603 | return (do yield bs | 606 | return (do yield bs -- an invalid blob remains |
604 | p') | 607 | p') |
605 | 608 | ||
606 | -- | Splits a 'Producer' after the given number of characters | 609 | -- | Splits a 'Producer' after the given number of characters |