module Streamly.Internal.FileSystem.FileIO
(
withFile
, read
, readChunksWith
, readChunks
, readerWith
, reader
, chunkReaderWith
, chunkReaderFromToWith
, chunkReader
, putChunk
, write
, writeWith
, writeChunks
, fromBytes
, fromBytesWith
, fromChunks
, writeAppend
, writeAppendWith
, writeAppendArray
, writeAppendChunks
)
where
import Control.Monad.Catch (MonadCatch)
import Control.Monad.IO.Class (MonadIO(..))
import Data.Word (Word8)
import System.IO (Handle, IOMode(..), hClose, hSetBuffering, BufferMode(..))
import Prelude hiding (read)
import qualified Control.Monad.Catch as MC
import Streamly.Data.Fold (groupsOf, drain)
import Streamly.Internal.Data.Array.Type (Array(..))
import Streamly.Internal.Data.Fold.Type (Fold(..))
import Streamly.Data.Stream (Stream)
import Streamly.Internal.Data.Unfold.Type (Unfold(..))
import Streamly.Internal.System.IO (defaultChunkSize)
import Streamly.Internal.FileSystem.Path (Path)
import qualified Streamly.Internal.Data.Array as A
import qualified Streamly.Data.Stream as S
import qualified Streamly.Data.Unfold as UF
import qualified Streamly.Internal.Data.Unfold as UF (bracketIO)
import qualified Streamly.Internal.Data.Fold.Type as FL
(Step(..), snoc, reduce)
import qualified Streamly.Internal.FileSystem.Handle as FH
#if !defined(mingw32_HOST_OS) && !defined(__MINGW32__)
import qualified Streamly.Internal.FileSystem.Posix.File as File
#else
import qualified Streamly.Internal.FileSystem.Windows.File as File
#endif
#include "inline.hs"
{-# INLINE withFile #-}
withFile :: (MonadIO m, MonadCatch m)
=> Path -> IOMode -> (Handle -> Stream m a) -> Stream m a
withFile :: forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> IOMode -> (Handle -> Stream m a) -> Stream m a
withFile Path
file IOMode
mode = IO Handle
-> (Handle -> IO ()) -> (Handle -> Stream m a) -> Stream m a
forall (m :: * -> *) b c a.
(MonadIO m, MonadCatch m) =>
IO b -> (b -> IO c) -> (b -> Stream m a) -> Stream m a
S.bracketIO IO Handle
open Handle -> IO ()
hClose
where
open :: IO Handle
open = do
Handle
h <- Path -> IOMode -> IO Handle
File.openBinaryFile Path
file IOMode
mode
Handle -> BufferMode -> IO ()
hSetBuffering Handle
h BufferMode
NoBuffering
Handle -> IO Handle
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Handle
h
{-# INLINE usingFile #-}
usingFile :: (MonadIO m, MonadCatch m)
=> Unfold m Handle a -> Unfold m Path a
usingFile :: forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Unfold m Handle a -> Unfold m Path a
usingFile = (Path -> IO Handle)
-> (Handle -> IO ()) -> Unfold m Handle a -> Unfold m Path a
forall (m :: * -> *) a c d b.
(MonadIO m, MonadCatch m) =>
(a -> IO c) -> (c -> IO d) -> Unfold m c b -> Unfold m a b
UF.bracketIO Path -> IO Handle
open Handle -> IO ()
hClose
where
open :: Path -> IO Handle
open Path
file = do
Handle
h <- Path -> IOMode -> IO Handle
File.openBinaryFile Path
file IOMode
ReadMode
Handle -> BufferMode -> IO ()
hSetBuffering Handle
h BufferMode
NoBuffering
Handle -> IO Handle
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return Handle
h
{-# INLINE usingFile2 #-}
usingFile2 :: (MonadIO m, MonadCatch m)
=> Unfold m (x, Handle) a -> Unfold m (x, Path) a
usingFile2 :: forall (m :: * -> *) x a.
(MonadIO m, MonadCatch m) =>
Unfold m (x, Handle) a -> Unfold m (x, Path) a
usingFile2 = ((x, Path) -> IO (x, Handle))
-> ((x, Handle) -> IO ())
-> Unfold m (x, Handle) a
-> Unfold m (x, Path) a
forall (m :: * -> *) a c d b.
(MonadIO m, MonadCatch m) =>
(a -> IO c) -> (c -> IO d) -> Unfold m c b -> Unfold m a b
UF.bracketIO (x, Path) -> IO (x, Handle)
forall {a}. (a, Path) -> IO (a, Handle)
before (x, Handle) -> IO ()
forall {a}. (a, Handle) -> IO ()
after
where
before :: (a, Path) -> IO (a, Handle)
before (a
x, Path
file) = do
Handle
h <- Path -> IOMode -> IO Handle
File.openBinaryFile Path
file IOMode
ReadMode
Handle -> BufferMode -> IO ()
hSetBuffering Handle
h BufferMode
NoBuffering
(a, Handle) -> IO (a, Handle)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (a
x, Handle
h)
after :: (a, Handle) -> IO ()
after (a
_, Handle
h) = Handle -> IO ()
hClose Handle
h
{-# INLINE usingFile3 #-}
usingFile3 :: (MonadIO m, MonadCatch m)
=> Unfold m (x, y, z, Handle) a -> Unfold m (x, y, z, Path) a
usingFile3 :: forall (m :: * -> *) x y z a.
(MonadIO m, MonadCatch m) =>
Unfold m (x, y, z, Handle) a -> Unfold m (x, y, z, Path) a
usingFile3 = ((x, y, z, Path) -> IO (x, y, z, Handle))
-> ((x, y, z, Handle) -> IO ())
-> Unfold m (x, y, z, Handle) a
-> Unfold m (x, y, z, Path) a
forall (m :: * -> *) a c d b.
(MonadIO m, MonadCatch m) =>
(a -> IO c) -> (c -> IO d) -> Unfold m c b -> Unfold m a b
UF.bracketIO (x, y, z, Path) -> IO (x, y, z, Handle)
forall {a} {b} {c}. (a, b, c, Path) -> IO (a, b, c, Handle)
before (x, y, z, Handle) -> IO ()
forall {a} {b} {c}. (a, b, c, Handle) -> IO ()
after
where
before :: (a, b, c, Path) -> IO (a, b, c, Handle)
before (a
x, b
y, c
z, Path
file) = do
Handle
h <- Path -> IOMode -> IO Handle
File.openBinaryFile Path
file IOMode
ReadMode
Handle -> BufferMode -> IO ()
hSetBuffering Handle
h BufferMode
NoBuffering
(a, b, c, Handle) -> IO (a, b, c, Handle)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (a
x, b
y, c
z, Handle
h)
after :: (a, b, c, Handle) -> IO ()
after (a
_, b
_, c
_, Handle
h) = Handle -> IO ()
hClose Handle
h
{-# INLINABLE putChunk #-}
putChunk :: Path -> Array a -> IO ()
putChunk :: forall a. Path -> Array a -> IO ()
putChunk Path
file Array a
arr = Path -> IOMode -> (Handle -> IO ()) -> IO ()
forall r. Path -> IOMode -> (Handle -> IO r) -> IO r
File.withFile Path
file IOMode
WriteMode (Handle -> Array a -> IO ()
forall (m :: * -> *) a. MonadIO m => Handle -> Array a -> m ()
`FH.putChunk` Array a
arr)
{-# INLINABLE writeAppendArray #-}
writeAppendArray :: Path -> Array a -> IO ()
writeAppendArray :: forall a. Path -> Array a -> IO ()
writeAppendArray Path
file Array a
arr = Path -> IOMode -> (Handle -> IO ()) -> IO ()
forall r. Path -> IOMode -> (Handle -> IO r) -> IO r
File.withFile Path
file IOMode
AppendMode (Handle -> Array a -> IO ()
forall (m :: * -> *) a. MonadIO m => Handle -> Array a -> m ()
`FH.putChunk` Array a
arr)
{-# INLINE readChunksWith #-}
readChunksWith :: (MonadIO m, MonadCatch m)
=> Int -> Path -> Stream m (Array Word8)
readChunksWith :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Int -> Path -> Stream m (Array Word8)
readChunksWith Int
size Path
file =
Path
-> IOMode
-> (Handle -> Stream m (Array Word8))
-> Stream m (Array Word8)
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> IOMode -> (Handle -> Stream m a) -> Stream m a
withFile Path
file IOMode
ReadMode (Int -> Handle -> Stream m (Array Word8)
forall (m :: * -> *).
MonadIO m =>
Int -> Handle -> Stream m (Array Word8)
FH.readChunksWith Int
size)
{-# INLINE readChunks #-}
readChunks :: (MonadIO m, MonadCatch m)
=> Path -> Stream m (Array Word8)
readChunks :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Path -> Stream m (Array Word8)
readChunks = Int -> Path -> Stream m (Array Word8)
forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Int -> Path -> Stream m (Array Word8)
readChunksWith Int
defaultChunkSize
{-# INLINE chunkReaderWith #-}
chunkReaderWith :: (MonadIO m, MonadCatch m)
=> Unfold m (Int, Path) (Array Word8)
chunkReaderWith :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Unfold m (Int, Path) (Array Word8)
chunkReaderWith = Unfold m (Int, Handle) (Array Word8)
-> Unfold m (Int, Path) (Array Word8)
forall (m :: * -> *) x a.
(MonadIO m, MonadCatch m) =>
Unfold m (x, Handle) a -> Unfold m (x, Path) a
usingFile2 Unfold m (Int, Handle) (Array Word8)
forall (m :: * -> *).
MonadIO m =>
Unfold m (Int, Handle) (Array Word8)
FH.chunkReaderWith
{-# INLINE chunkReaderFromToWith #-}
chunkReaderFromToWith :: (MonadIO m, MonadCatch m) =>
Unfold m (Int, Int, Int, Path) (Array Word8)
chunkReaderFromToWith :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Unfold m (Int, Int, Int, Path) (Array Word8)
chunkReaderFromToWith = Unfold m (Int, Int, Int, Handle) (Array Word8)
-> Unfold m (Int, Int, Int, Path) (Array Word8)
forall (m :: * -> *) x y z a.
(MonadIO m, MonadCatch m) =>
Unfold m (x, y, z, Handle) a -> Unfold m (x, y, z, Path) a
usingFile3 Unfold m (Int, Int, Int, Handle) (Array Word8)
forall (m :: * -> *).
MonadIO m =>
Unfold m (Int, Int, Int, Handle) (Array Word8)
FH.chunkReaderFromToWith
{-# INLINE chunkReader #-}
chunkReader :: (MonadIO m, MonadCatch m) => Unfold m Path (Array Word8)
chunkReader :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Unfold m Path (Array Word8)
chunkReader = Unfold m Handle (Array Word8) -> Unfold m Path (Array Word8)
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Unfold m Handle a -> Unfold m Path a
usingFile Unfold m Handle (Array Word8)
forall (m :: * -> *). MonadIO m => Unfold m Handle (Array Word8)
FH.chunkReader
{-# INLINE readerWith #-}
readerWith :: (MonadIO m, MonadCatch m) => Unfold m (Int, Path) Word8
readerWith :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Unfold m (Int, Path) Word8
readerWith = Unfold m (Int, Handle) Word8 -> Unfold m (Int, Path) Word8
forall (m :: * -> *) x a.
(MonadIO m, MonadCatch m) =>
Unfold m (x, Handle) a -> Unfold m (x, Path) a
usingFile2 Unfold m (Int, Handle) Word8
forall (m :: * -> *). MonadIO m => Unfold m (Int, Handle) Word8
FH.readerWith
{-# INLINE reader #-}
reader :: (MonadIO m, MonadCatch m) => Unfold m Path Word8
reader :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Unfold m Path Word8
reader = Unfold m (Array Word8) Word8
-> Unfold m Path (Array Word8) -> Unfold m Path Word8
forall (m :: * -> *) b c a.
Monad m =>
Unfold m b c -> Unfold m a b -> Unfold m a c
UF.unfoldEach Unfold m (Array Word8) Word8
forall (m :: * -> *) a. (Monad m, Unbox a) => Unfold m (Array a) a
A.reader (Unfold m Handle (Array Word8) -> Unfold m Path (Array Word8)
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Unfold m Handle a -> Unfold m Path a
usingFile Unfold m Handle (Array Word8)
forall (m :: * -> *). MonadIO m => Unfold m Handle (Array Word8)
FH.chunkReader)
{-# INLINE read #-}
read :: (MonadIO m, MonadCatch m) => Path -> Stream m Word8
read :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Path -> Stream m Word8
read Path
file = Stream m (Array Word8) -> Stream m Word8
forall (m :: * -> *) a.
(Monad m, Unbox a) =>
Stream m (Array a) -> Stream m a
A.concat (Stream m (Array Word8) -> Stream m Word8)
-> Stream m (Array Word8) -> Stream m Word8
forall a b. (a -> b) -> a -> b
$ Path
-> IOMode
-> (Handle -> Stream m (Array Word8))
-> Stream m (Array Word8)
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> IOMode -> (Handle -> Stream m a) -> Stream m a
withFile Path
file IOMode
ReadMode Handle -> Stream m (Array Word8)
forall (m :: * -> *). MonadIO m => Handle -> Stream m (Array Word8)
FH.readChunks
{-# INLINE fromChunksMode #-}
fromChunksMode :: (MonadIO m, MonadCatch m)
=> IOMode -> Path -> Stream m (Array a) -> m ()
fromChunksMode :: forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
IOMode -> Path -> Stream m (Array a) -> m ()
fromChunksMode IOMode
mode Path
file Stream m (Array a)
xs = Fold m () () -> Stream m () -> m ()
forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> Stream m a -> m b
S.fold Fold m () ()
forall (m :: * -> *) a. Monad m => Fold m a ()
drain (Stream m () -> m ()) -> Stream m () -> m ()
forall a b. (a -> b) -> a -> b
$
Path -> IOMode -> (Handle -> Stream m ()) -> Stream m ()
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> IOMode -> (Handle -> Stream m a) -> Stream m a
withFile Path
file IOMode
mode (\Handle
h -> (Array a -> m ()) -> Stream m (Array a) -> Stream m ()
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Stream m a -> Stream m b
S.mapM (Handle -> Array a -> m ()
forall (m :: * -> *) a. MonadIO m => Handle -> Array a -> m ()
FH.putChunk Handle
h) Stream m (Array a)
xs)
{-# INLINE fromChunks #-}
fromChunks :: (MonadIO m, MonadCatch m)
=> Path -> Stream m (Array a) -> m ()
fromChunks :: forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> Stream m (Array a) -> m ()
fromChunks = IOMode -> Path -> Stream m (Array a) -> m ()
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
IOMode -> Path -> Stream m (Array a) -> m ()
fromChunksMode IOMode
WriteMode
{-# INLINE fromBytesWith #-}
fromBytesWith :: (MonadIO m, MonadCatch m)
=> Int -> Path -> Stream m Word8 -> m ()
fromBytesWith :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Int -> Path -> Stream m Word8 -> m ()
fromBytesWith Int
n Path
file Stream m Word8
xs = Path -> Stream m (Array Word8) -> m ()
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> Stream m (Array a) -> m ()
fromChunks Path
file (Stream m (Array Word8) -> m ()) -> Stream m (Array Word8) -> m ()
forall a b. (a -> b) -> a -> b
$ Int -> Stream m Word8 -> Stream m (Array Word8)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> Stream m a -> Stream m (Array a)
A.chunksOf' Int
n Stream m Word8
xs
{-# INLINE fromBytes #-}
fromBytes :: (MonadIO m, MonadCatch m) => Path -> Stream m Word8 -> m ()
fromBytes :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Path -> Stream m Word8 -> m ()
fromBytes = Int -> Path -> Stream m Word8 -> m ()
forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Int -> Path -> Stream m Word8 -> m ()
fromBytesWith Int
defaultChunkSize
{-# INLINE writeChunks #-}
writeChunks :: (MonadIO m, MonadCatch m)
=> Path -> Fold m (Array a) ()
writeChunks :: forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> Fold m (Array a) ()
writeChunks Path
path = ((Fold m (Array a) (), Handle)
-> Array a -> m (Step (Fold m (Array a) (), Handle) ()))
-> m (Step (Fold m (Array a) (), Handle) ())
-> ((Fold m (Array a) (), Handle) -> m ())
-> ((Fold m (Array a) (), Handle) -> m ())
-> Fold m (Array a) ()
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Fold m a b
Fold (Fold m (Array a) (), Handle)
-> Array a -> m (Step (Fold m (Array a) (), Handle) ())
forall {m :: * -> *} {a} {b} {b}.
(MonadCatch m, MonadIO m) =>
(Fold m a b, Handle) -> a -> m (Step (Fold m a b, Handle) b)
step m (Step (Fold m (Array a) (), Handle) ())
forall {a} {b}. m (Step (Fold m (Array a) (), Handle) b)
initial (Fold m (Array a) (), Handle) -> m ()
forall {m :: * -> *} {p}. Monad m => p -> m ()
extract (Fold m (Array a) (), Handle) -> m ()
forall {m :: * -> *} {a}.
MonadIO m =>
(Fold m a (), Handle) -> m ()
final
where
initial :: m (Step (Fold m (Array a) (), Handle) b)
initial = do
Handle
h <- IO Handle -> m Handle
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Path -> IOMode -> IO Handle
File.openBinaryFile Path
path IOMode
WriteMode)
IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ Handle -> BufferMode -> IO ()
hSetBuffering Handle
h BufferMode
NoBuffering
Fold m (Array a) ()
fld <- Fold m (Array a) () -> m (Fold m (Array a) ())
forall (m :: * -> *) a b. Monad m => Fold m a b -> m (Fold m a b)
FL.reduce (Handle -> Fold m (Array a) ()
forall (m :: * -> *) a. MonadIO m => Handle -> Fold m (Array a) ()
FH.writeChunks Handle
h)
m (Fold m (Array a) ()) -> m () -> m (Fold m (Array a) ())
forall (m :: * -> *) a b.
(HasCallStack, MonadCatch m) =>
m a -> m b -> m a
`MC.onException` IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Handle -> IO ()
hClose Handle
h)
Step (Fold m (Array a) (), Handle) b
-> m (Step (Fold m (Array a) (), Handle) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Fold m (Array a) (), Handle) b
-> m (Step (Fold m (Array a) (), Handle) b))
-> Step (Fold m (Array a) (), Handle) b
-> m (Step (Fold m (Array a) (), Handle) b)
forall a b. (a -> b) -> a -> b
$ (Fold m (Array a) (), Handle)
-> Step (Fold m (Array a) (), Handle) b
forall s b. s -> Step s b
FL.Partial (Fold m (Array a) ()
fld, Handle
h)
step :: (Fold m a b, Handle) -> a -> m (Step (Fold m a b, Handle) b)
step (Fold m a b
fld, Handle
h) a
x = do
Fold m a b
r <- Fold m a b -> a -> m (Fold m a b)
forall (m :: * -> *) a b.
Monad m =>
Fold m a b -> a -> m (Fold m a b)
FL.snoc Fold m a b
fld a
x m (Fold m a b) -> m () -> m (Fold m a b)
forall (m :: * -> *) a b.
(HasCallStack, MonadCatch m) =>
m a -> m b -> m a
`MC.onException` IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Handle -> IO ()
hClose Handle
h)
Step (Fold m a b, Handle) b -> m (Step (Fold m a b, Handle) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Fold m a b, Handle) b -> m (Step (Fold m a b, Handle) b))
-> Step (Fold m a b, Handle) b -> m (Step (Fold m a b, Handle) b)
forall a b. (a -> b) -> a -> b
$ (Fold m a b, Handle) -> Step (Fold m a b, Handle) b
forall s b. s -> Step s b
FL.Partial (Fold m a b
r, Handle
h)
extract :: p -> m ()
extract p
_ = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
final :: (Fold m a (), Handle) -> m ()
final (Fold s -> a -> m (Step s ())
_ m (Step s ())
initial1 s -> m ()
_ s -> m ()
final1, Handle
h) = do
IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ Handle -> IO ()
hClose Handle
h
Step s ()
res <- m (Step s ())
initial1
case Step s ()
res of
FL.Partial s
fs -> s -> m ()
final1 s
fs
FL.Done () -> () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
{-# INLINE writeWith #-}
writeWith :: (MonadIO m, MonadCatch m)
=> Int -> Path -> Fold m Word8 ()
writeWith :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Int -> Path -> Fold m Word8 ()
writeWith Int
n Path
path =
Int
-> Fold m Word8 (Array Word8)
-> Fold m (Array Word8) ()
-> Fold m Word8 ()
forall (m :: * -> *) a b c.
Monad m =>
Int -> Fold m a b -> Fold m b c -> Fold m a c
groupsOf Int
n (Int -> Fold m Word8 (Array Word8)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> Fold m a (Array a)
A.unsafeCreateOf' Int
n) (Path -> Fold m (Array Word8) ()
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> Fold m (Array a) ()
writeChunks Path
path)
{-# INLINE write #-}
write :: (MonadIO m, MonadCatch m) => Path -> Fold m Word8 ()
write :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Path -> Fold m Word8 ()
write = Int -> Path -> Fold m Word8 ()
forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Int -> Path -> Fold m Word8 ()
writeWith Int
defaultChunkSize
{-# INLINE writeAppendChunks #-}
writeAppendChunks :: (MonadIO m, MonadCatch m)
=> Path -> Stream m (Array a) -> m ()
writeAppendChunks :: forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> Stream m (Array a) -> m ()
writeAppendChunks = IOMode -> Path -> Stream m (Array a) -> m ()
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
IOMode -> Path -> Stream m (Array a) -> m ()
fromChunksMode IOMode
AppendMode
{-# INLINE writeAppendWith #-}
writeAppendWith :: (MonadIO m, MonadCatch m)
=> Int -> Path -> Stream m Word8 -> m ()
writeAppendWith :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Int -> Path -> Stream m Word8 -> m ()
writeAppendWith Int
n Path
file Stream m Word8
xs =
Path -> Stream m (Array Word8) -> m ()
forall (m :: * -> *) a.
(MonadIO m, MonadCatch m) =>
Path -> Stream m (Array a) -> m ()
writeAppendChunks Path
file (Stream m (Array Word8) -> m ()) -> Stream m (Array Word8) -> m ()
forall a b. (a -> b) -> a -> b
$ Int -> Stream m Word8 -> Stream m (Array Word8)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> Stream m a -> Stream m (Array a)
A.chunksOf' Int
n Stream m Word8
xs
{-# INLINE writeAppend #-}
writeAppend :: (MonadIO m, MonadCatch m) => Path -> Stream m Word8 -> m ()
writeAppend :: forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Path -> Stream m Word8 -> m ()
writeAppend = Int -> Path -> Stream m Word8 -> m ()
forall (m :: * -> *).
(MonadIO m, MonadCatch m) =>
Int -> Path -> Stream m Word8 -> m ()
writeAppendWith Int
defaultChunkSize