Read a ByteArray consisting of one or more bytes from a file handle. If
no data is available on the handle it blocks until at least one byte becomes
available. If any data is available then it immediately returns that data
without blocking. As a result of this behavior, it may read less than or
equal to the size requested.
Modulestreamly-core-0.2.2Haskell2010
Streamly.Internal.FileSystem.Handle
The fundamental singleton IO APIs are getChunk and putChunk and the fundamental stream IO APIs built on top of those are readChunksWith and writeChunks. Rest of this module is just combinatorial programming using these.
We can achieve line buffering by folding lines in the input stream into a stream of arrays using Stream.splitOn or Fold.takeEndBy_ and similar operations. One can wrap the input stream in Maybe type and then use writeMaybesWith to achieve user controlled buffering.
- 28 values
- Packagestreamly-core-0.2.2
- Exports28
- LanguageHaskell2010
- LicenceBSD-3-Clause
- SourceHandle.hs
Setup
0 declarationsTo execute the code examples provided in this module in ghci, please run the following commands first.
:mimport qualified Streamly.Data.Array as Arrayimport qualified Streamly.FileSystem.Handle as Handle hiding (readChunks)import qualified Streamly.Data.Fold as Foldimport qualified Streamly.Data.Stream as Streamimport qualified Streamly.Data.Unfold as Unfold
For APIs that have not been released yet.
import qualified Streamly.Internal.Data.Array as Array (unsafeCreateOf)import qualified Streamly.Internal.Data.Unfold as Unfold (first)import qualified Streamly.Internal.FileSystem.Handle as Handleimport qualified Streamly.Internal.System.IO as IO (defaultChunkSize)
Singleton APIs
3 declarationsRead a ByteArray consisting of exactly the specified number of bytes
from a file handle.
Unimplemented
Write an Array to a file handle.
Streams
4 declarationsGenerate a byte stream from a file Handle.
read h = Stream.unfoldMany Array.reader $ Handle.readChunks hPre-release
readWith bufsize handle reads a byte stream from a file
handle, reads are performed in chunks of up to bufsize.
readWith size h = Stream.unfoldMany Array.reader $ Handle.readChunksWith size hPre-release
readChunksWith size handle reads a stream of arrays from the file
handle handle. The maximum size of a single array is limited to size.
The actual size read may be less than or equal to size.
readChunksWith size h = Stream.unfold Handle.chunkReaderWith (size, h)getChunks handle reads a stream of arrays from the specified file
handle. The maximum size of a single array is limited to
defaultChunkSize. The actual size read may be less than or equal to
defaultChunkSize.
readChunks = Handle.readChunksWith IO.defaultChunkSizePre-release
Unfolds
4 declarationsUnfolds a file handle into a byte stream. IO requests to the device are
performed in sizes of
Streamly.Internal.Data.Array.Type.defaultChunkSize.
reader = Unfold.many Array.reader Handle.chunkReaderUnfolds the tuple (bufsize, handle) into a byte stream, read requests
to the IO device are performed using buffers of bufsize.
readerWith = Unfold.many Array.reader Handle.chunkReaderWithUnfolds a handle into a stream of Word8 arrays. Requests to the IO
device are performed using a buffer of size
Streamly.Internal.Data.Array.Type.defaultChunkSize. The
size of arrays in the resulting stream are therefore less than or equal to
Streamly.Internal.Data.Array.Type.defaultChunkSize.
chunkReader = Unfold.first IO.defaultChunkSize Handle.chunkReaderWithUnfold the tuple (bufsize, handle) into a stream of Word8 arrays.
Read requests to the IO device are performed using a buffer of size
bufsize. The size of an array in the resulting stream is always less than
or equal to bufsize.
Folds
5 declarationsWrite a byte stream to a file handle. Accumulates the input in chunks of
up to Streamly.Internal.Data.Array.Type.defaultChunkSize before writing
to the IO device.
write = Handle.writeWith IO.defaultChunkSizewriteWith reqSize handle writes the input stream to handle.
Bytes in the input stream are collected into a buffer until we have a chunk
of reqSize and then written to the IO device.
writeWith n h = Fold.groupsOf n (Array.unsafeCreateOf n) (Handle.writeChunks h)Write a stream of arrays to a handle. Each array in the stream is written to the device as a separate IO request.
writeChunks h = Fold.drainBy (Handle.putChunk h)
writeChunksWith bufsize handle writes a stream of arrays
to handle after coalescing the adjacent arrays in chunks of bufsize.
We never split an array, if a single array is bigger than the specified size
it emitted as it is. Multiple arrays are coalesed as long as the total size
remains below the specified size.
Refolds
3 declarationsLike writeChunks but uses the experimental Refold API.
Internal
Stream writes
4 declarationsWrite a byte stream to a file handle. Accumulates the input in chunks of
up to Streamly.Internal.Data.Array.Type.defaultChunkSize before writing.
NOTE: This may perform better than the write fold, you can try this if you need some extra perf boost.
putBytes = Handle.putBytesWith IO.defaultChunkSizeputBytesWith bufsize handle stream writes stream to handle
in chunks of bufsize. A write is performed to the IO device as soon as we
collect the required input size.
putChunksWith bufsize handle stream writes a stream of arrays
to handle after coalescing the adjacent arrays in chunks of bufsize.
The chunk size is only a maximum and the actual writes could be smaller as
we do not split the arrays to fit exactly to the specified size.
Write a stream of arrays to a handle.
putChunks h = Stream.fold (Fold.drainBy (Handle.putChunk h))Random Access (Seek)
1 declarationUnlike the streaming APIs listed above, these APIs apply to devices or files that have random access or seek capability. This type of devices include disks, files, memory devices and exclude terminals, pipes, sockets and fifos.
The input to the unfold is (from, to, bufferSize, handle). It starts
reading from the offset from in the file and reads up to the offset to.
Deprecated
4 declarationsDeprecated. Please use chunkReaderWith instead.
Same as chunkReaderWith
Deprecated. Please use readerWith instead.
Same as readerWith
Deprecated. Please use writeChunksWith instead.
Same as writeChunksWith
Deprecated. Please use writeWith instead.
Same as writeWith