streamly-bytestring
Library for streamly and bytestring interoperation.
If you are writing code from scratch, please use Streamly.Data.Array which is
a generalization of ByteString and better integrated with streamly.
This library is to enable interoperation of streamly with existing code that
uses ByteString.
The package provides APIs to interconvert between strict Bytestring and
streamly Array Word8 and between lazy Bytestring and stream of Array Word8.
The interconversion in the case of strict Bytestring and streamly Array Word8 has no overhead for GHC allocated memory. For foreign allocator allocated
memory there is a copy involved.
Usage
This is a dumb program that counts the number of bytes in a file.
import qualified Streamly.Data.Stream as S
import qualified Streamly.Data.Fold as FL
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as BSL
import qualified Streamly.External.ByteString as Strict
import qualified Streamly.External.ByteString.Lazy as Lazy
import System.IO (FilePath)
strictByteStringSize :: BS.ByteString -> IO Int
strictByteStringSize bs = S.fold FL.length $ S.unfold Strict.reader bs
lazyByteStringSize :: BSL.ByteString -> IO Int
lazyByteStringSize bsl =
S.fold (FL.foldl' (+) 0)
$ S.mapM strictByteStringSize
$ fmap Strict.fromArray
$ Lazy.toChunks bsl
fileSize :: FilePath -> IO Int
fileSize path = do
bsl <- BSL.readFile path
lazyByteStringSize bsl