pipes-transduce-0.2.3.0: src/Pipes/Transduce/ByteString.hs
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Pipes.Transduce.ByteString (
-- * Collecting input
intoLazyBytes
-- * Reading from handles
, drainHandle
, drainHandleFallibly
, ChunkSize
, chunkSize
, chunkSizeDefault
) where
import Prelude hiding (lines)
import Data.Bifunctor
import Data.Void
import Data.ByteString
import qualified Data.ByteString.Lazy
import qualified Control.Foldl as Foldl
import qualified Pipes.ByteString (hGetSome)
import System.IO
import Data.ByteString.Lazy.Internal (defaultChunkSize)
import Pipes.Transduce
{- $setup
>>> :set -XOverloadedStrings
>>> import Control.Applicative
>>> import Control.Monad
>>> import qualified Pipes.Transduce as PT
-}
{-|
Collect strict 'ByteString's into a lazy 'ByteString'.
>>> PT.fold1 intoLazyBytes (mapM_ yield ["aa","bb","cc"])
("aabbcc",())
-}
intoLazyBytes :: Fold1 ByteString e Data.ByteString.Lazy.ByteString
intoLazyBytes = fmap Data.ByteString.Lazy.fromChunks (withFold Foldl.list)
drainHandleFallibly
:: Fold1 ByteString e r
-> ChunkSize
-> Handle
-> IO (Either e r)
drainHandleFallibly somefold (ChunkSize csize) handle =
fmap (bimap id fst) (Pipes.Transduce.fold1Fallibly somefold (Pipes.ByteString.hGetSome csize handle))
drainHandle
:: Fold1 ByteString Void r
-> ChunkSize
-> Handle
-> IO r
drainHandle somefold (ChunkSize csize) handle =
fmap fst (Pipes.Transduce.fold1 somefold (Pipes.ByteString.hGetSome csize handle))
{-| Maximum chunk size
-}
newtype ChunkSize = ChunkSize Int deriving (Show,Eq,Ord,Num)
chunkSize :: Int -> ChunkSize
chunkSize = ChunkSize
chunkSizeDefault :: ChunkSize
chunkSizeDefault = chunkSize defaultChunkSize