module Pipes.Transduce.Text (
intoLazyText
, lines
, lines_
, foldedLines
, eachLine
, decoder
, decoderx
, utf8
, utf8x
) where
import Prelude hiding (lines)
import Data.ByteString
import qualified Data.Text
import qualified Data.Text.Lazy
import Data.Text hiding (lines)
import Data.Text.Encoding.Error (UnicodeException(..))
import qualified Control.Foldl as Foldl
import Control.Exception
import Control.Applicative
import Control.Monad
import Control.Monad.Trans.Class
import Control.Monad.Trans.Except
import Pipes
import qualified Pipes.Text
import Pipes.Text.Encoding (decodeUtf8)
import Pipes.Transduce
foldedLines
:: Transducer Continuous Text e Data.Text.Lazy.Text
foldedLines =
Pipes.Transduce.folds
(fmap Data.Text.Lazy.fromChunks (Pipes.Transduce.withFold Foldl.list))
(lines_ (Pipes.Transduce.mapper id))
eachLine :: (Data.Text.Lazy.Text -> IO (Either e ())) -> Fold1 Data.Text.Text e ()
eachLine action = transduce1 foldedLines (withFallibleConsumer (forever (do
await >>= lift . ExceptT . action)))
lines_
:: Transducer Continuous a e Text
-> Transducer Delimited a e Text
lines_ sometrans = delimit (view Pipes.Text.lines) sometrans
lines
:: Transducer Continuous a e Text
-> Transducer Delimited a e Text
lines = groups (\p -> p <* Pipes.yield (Data.Text.singleton '\n')) . lines_
decoder
:: (forall r. Producer ByteString IO r -> Producer Text IO (Producer ByteString IO r))
-> Transducer Continuous ByteString ByteString Text
decoder f = fallibleTransducer (\producer -> f producer >>= \producer' -> lift (do
n <- next producer'
case n of
Left r -> return (Right r)
Right b -> return (Left (fst b))))
decoderx
:: (forall r. Producer ByteString IO r -> Producer Text IO (Producer ByteString IO r))
-> Transducer Continuous ByteString e Text
decoderx f = transducer (\producer -> f producer >>= \producer' -> lift (do
n <- next producer'
case n of
Left r -> return r
Right b -> throwIO (DecodeError "transducer decoding error" (Just (Data.ByteString.head (fst b))))))
utf8 :: Transducer Continuous ByteString ByteString Text
utf8 = decoder decodeUtf8
utf8x :: Transducer Continuous ByteString e Text
utf8x = decoderx decodeUtf8
intoLazyText :: Fold1 Text e Data.Text.Lazy.Text
intoLazyText = fmap Data.Text.Lazy.fromChunks (withFold Foldl.list)
type Getting r s a = (a -> Const r a) -> s -> Const r s
view :: Getting a s a -> s -> a
view l s = getConst (l Const s)