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