]> git.immae.eu Git - github/fretlink/text-pipes.git/commitdiff
added eoflens to discriminate whether decoding was completed
authormichaelt <what_is_it_to_do_anything@yahoo.com>
Wed, 12 Nov 2014 03:02:24 +0000 (22:02 -0500)
committermichaelt <what_is_it_to_do_anything@yahoo.com>
Wed, 12 Nov 2014 03:02:24 +0000 (22:02 -0500)
Pipes/Text/Encoding.hs
Pipes/Text/Tutorial.hs

index e00cd430e20771d1ebda6b6c0f2de8bf8a280175..f26f168e7847935a02dda61ce2291a2a31436ef4 100644 (file)
@@ -12,6 +12,7 @@ module Pipes.Text.Encoding
     -- $lenses
     Codec
     , decode
+    , eof
     -- * \'Viewing\' the Text in a byte stream
     -- $codecs
     , utf8
@@ -88,9 +89,42 @@ type Codec
 
 -}
 
+
 decode :: ((b -> Constant b b) -> (a -> Constant b a)) -> a -> b
 decode codec a = getConstant (codec Constant a)
 
+{- | 'eof' tells you explicitly when decoding stops due to bad bytes or instead
+      reaches end-of-file happily. (Without it one just makes an explicit test 
+      for emptiness of the resulting bytestring production using 'next') 
+      Thus
+
+>     decode (utf8 . eof) p =  view (utf8 . eof) p = p^.utf8.eof
+      will be a text producer. If we hit undecodable bytes, the remaining
+      bytestring producer will be returned as a 'Left' value; 
+      in the happy case, a 'Right' value is returned with the anticipated 
+      return value for the original bytestring producer. 
+      ) 
+
+-}
+
+eof :: Monad m => Lens' (Producer Text m (Producer ByteString m r))
+                        (Producer Text m (Either (Producer ByteString m r) r))
+eof k p = fmap fromEither (k (toEither p)) where
+
+  fromEither = liftM (either id return)
+
+  toEither pp = do p <- pp
+                   check p
+
+  check p = do e <- lift (next p)
+               case e of 
+                 Left r -> return (Right r)
+                 Right (bs,pb) ->  if B.null bs 
+                                     then check pb
+                                     else return (Left (do yield bs
+                                                           pb))
+
 
 {- $codecs
     
@@ -186,6 +220,7 @@ decodeStream = loop where
                                                                  p')
 {-# INLINABLE decodeStream#-}
 
+
 {- $decoders
    These are functions with the simple type:
    
index 07b8751943fed354e1dd19ea2005d8721dc9bbbe..25f9e411c660c792eb29cb098c84ceef9daf378f 100644 (file)
@@ -24,12 +24,12 @@ module Pipes.Text.Tutorial (
     -- * Special types: @Producer Text m (Producer Text m r)@ and @FreeT (Producer Text m) m r@
     -- $special
     ) where
-      
+
 import Pipes
 import Pipes.Text
 import Pipes.Text.IO
 import Pipes.Text.Encoding
-      
+
 {- $intro
     This package provides @pipes@ utilities for /character streams/,
     realized as streams of 'Text' chunks. The individual chunks are uniformly /strict/,