hw-prim-0.6.2.18: src/HaskellWorks/Data/ByteString/Builder.hs
module HaskellWorks.Data.ByteString.Builder
( chainInterleaveIO
) where
import Data.Function
import Data.Monoid (Monoid (..))
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import qualified System.IO.Unsafe as IO
chainInterleaveIO :: [IO LBS.ByteString] -> IO LBS.ByteString
chainInterleaveIO iobs = LBS.fromChunks . ([] &) <$> go diobs
where diobs :: [IO ([BS.ByteString] -> [BS.ByteString])]
diobs = ((++) . LBS.toChunks <$>) <$> iobs
go :: [IO ([BS.ByteString] -> [BS.ByteString])] -> IO ([BS.ByteString] -> [BS.ByteString])
go (ma:mas) = do
a <- ma
as <- IO.unsafeInterleaveIO $ go mas
return (a . as)
go [] = return mempty