io-streams: Simple, composable, and easy-to-use stream I/O

[ bsd3, data, io-streams, library, network ] [ Propose Tags ]

Overview

The io-streams library contains simple and easy-to-use primitives for I/O using streams. Most users will want to import the top-level convenience module System.IO.Streams, which re-exports most of the library:

import           System.IO.Streams (InputStream, OutputStream)
import qualified System.IO.Streams as Streams

For first-time users, io-streams comes with an included tutorial, which can be found in the System.IO.Streams.Tutorial module.

Features

The io-streams user API has two basic types: InputStream a and OutputStream a, and three fundamental I/O primitives:

-- read an item from an input stream
Streams.System.IO.Streams.read :: System.IO.Streams.InputStream a -> IO (Maybe a)

-- push an item back to an input stream
Streams.System.IO.Streams.unRead :: a -> System.IO.Streams.InputStream a -> IO ()

-- write to an output stream
Streams.System.IO.Streams.write :: Maybe a -> System.IO.Streams.OutputStream a -> IO ()

Streams can be transformed by composition and hooked together with provided combinators:

ghci> Streams.fromList [1,2,3::Int] >>= Streams.map (*10) >>= Streams.toList
[10,20,30]

Stream composition leaves the original stream accessible:

ghci> input <- Streams.fromByteString "long string"
ghci> wrapped <- Streams.takeBytes 4 input
ghci> Streams.read wrapped
Just "long"
ghci> Streams.read wrapped
Nothing
ghci> Streams.read input
Just " string"

Simple types and operations in the IO monad mean straightforward and simple exception handling and resource cleanup using Haskell standard library facilities like Control.Exception.bracket.

io-streams comes with:

  • functions to use files, handles, concurrent channels, sockets, lists, vectors, and more as streams.

  • a variety of combinators for wrapping and transforming streams, including compression and decompression using zlib, controlling precisely how many bytes are read from or written to a stream, buffering output using bytestring builders, folds, maps, filters, zips, etc.

  • support for parsing from streams using attoparsec.

  • support for spawning processes and communicating with them using streams.

ChangeLog

1.1.4.4
Allow use of transformers 0.4.*.
1.1.4.3
Allow use of new network version 2.5.
1.1.4.2
Fixed a build error with network versions older than 2.4.
1.1.4.1
System.IO.Streams.Network: scalability improvement: buffers for socket reads are now allocated by system malloc rather than by pinned pointers in GHC (currently pinned pointer allocation takes a global lock).
1.1.4.0
Widened attoparsec and text library dependencies to allow the latest versions.
1.1.3.0
Added System.IO.Streams.ByteString.takeExactly. Widened network dependency to include 2.3. Added a NoInteractiveTests flag to selectively disable some tests for environments where spawning interactive processes is impossible.
1.1.2.2
Allowed newest versions of the process, test-framework, and text libraries.
1.1.2.1
Fixed build error when compiled against attoparsec-0.10.0.x.
1.1.2.0
Added System.IO.Streams.Concurrent.makeChanPipe, to create a simple concurrent pipe between an InputStream/OutputStream pair.
1.1.1.0
Added System.IO.Streams.Network.socketToStreamsWithBufferSize, allowing control over the size of the receive buffers used when reading from sockets.
1.1.0.3
Fixed an inconsistent version upper bound in the test suite.
1.1.0.2
Fixed a typo in the tutorial.
1.1.0.1
A couple of Haddock markup fixes.
1.1.0.0
Reworked, simplified, and streamlined the internals of the library. Exports from System.IO.Streams.Internal relying on Sources and Sinks were deleted because they are no longer necessary: Source(..), Sink(..), defaultPushback, withDefaultPushback, nullSource, nullSink, singletonSource, simpleSource, sourceToStream, sinkToStream, generatorToSource, and consumerToSink.
1.0.2.2
Fixed a bug in which "takeBytes 0" was erroneously requesting input from the wrapped stream.
1.0.2.1
Fixed a compile error on GHC 7.0.x.
1.0.2.0
Added System.IO.Streams.Process (support for communicating with system processes using streams), added new functions to System.IO.Streams.Handle for converting io-streams types to System.IO.Handles. (Now you can pass streams from this library to places that expect Handles and everything will work.)
1.0.1.0
Added System.IO.Streams.Combinators.ignoreEof.
1.0.0.1
Fixed some haddock markup.

[Skip to Readme]

Flags

Automatic Flags
NameDescriptionDefault
nointeractivetests

Do not run interactive tests

Disabled

Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 1.0.0.0, 1.0.0.1, 1.0.1.0, 1.0.2.0, 1.0.2.1, 1.0.2.2, 1.1.0.0, 1.1.0.1, 1.1.0.2, 1.1.0.3, 1.1.1.0, 1.1.2.0, 1.1.2.1, 1.1.2.2, 1.1.3.0, 1.1.4.0, 1.1.4.1, 1.1.4.2, 1.1.4.3, 1.1.4.4, 1.1.4.5, 1.1.4.6, 1.2.0.0, 1.2.0.1, 1.2.1.1, 1.2.1.2, 1.2.1.3, 1.3.0.0, 1.3.1.0, 1.3.2.0, 1.3.3.0, 1.3.3.1, 1.3.4.0, 1.3.5.0, 1.3.6.0, 1.3.6.1, 1.4.0.0, 1.4.1.0, 1.5.0.0, 1.5.0.1, 1.5.1.0, 1.5.2.0, 1.5.2.1, 1.5.2.2
Dependencies attoparsec (>=0.10 && <0.12), base (>=4 && <5), blaze-builder (>=0.3.1 && <0.4), bytestring (>=0.9 && <0.11), network (>=2.3 && <2.6), primitive (>=0.2 && <0.6), process (>=1.1 && <1.3), text (>=0.10 && <1.2), time (>=1.2 && <1.5), transformers (>=0.2 && <0.5), vector (>=0.7 && <0.11), zlib-bindings (>=0.1 && <0.2) [details]
License BSD-3-Clause
Author
Maintainer Gregory Collins <greg@gregorycollins.net>
Revised Revision 1 made by HerbertValerioRiedel at 2015-01-01T09:25:12Z
Category Data, Network, IO-Streams
Bug tracker https://github.com/snapframework/io-streams/issues
Source repo head: git clone https://github.com/snapframework/io-streams.git
Uploaded by GregoryCollins at 2014-05-23T06:03:06Z
Distributions Arch:1.5.2.2, Debian:1.5.1.0, Fedora:1.5.2.2, LTSHaskell:1.5.2.2, NixOS:1.5.2.2, Stackage:1.5.2.2
Reverse Dependencies 100 direct, 3585 indirect [details]
Downloads 84748 total (262 in the last 30 days)
Rating 2.5 (votes: 5) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Successful builds reported [all 1 reports]

Readme for io-streams-1.1.4.4

[back to package description]

The io-streams library contains simple and easy to use primitives for I/O using streams. Based on simple types with one type parameter (InputStream a and OutputStream a), io-streams provides a basic interface to side-effecting input and output in IO monad with the following features:

  • three fundamental I/O primitives that anyone can understand: read :: InputStream a -> IO (Maybe a), unRead :: a -> InputStream a -> IO (), and write :: Maybe a -> OutputStream a -> IO ().

  • simple types and side-effecting IO operations mean straightforward and simple exception handling and resource cleanup using standard Haskell facilities like bracket.

  • code to transform files, handles, and sockets to streams

  • a variety of combinators for wrapping and transforming streams, including compression and decompression using zlib, controlling precisely how many bytes are read to or written from a socket, buffering output using blaze-builder, etc.

  • support for parsing from streams using attoparsec.