The io-streams package

[Tags: bsd3, library]


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.


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 :: 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] >>= (*10) >>= Streams.toList

Stream composition leaves the original stream accessible:

ghci> input <- Streams.fromByteString "long string"
ghci> wrapped <- Streams.takeBytes 4 input
ghci> wrapped
Just "long"
ghci> wrapped
ghci> 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:

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.
Allowed newest versions of the process, test-framework, and text libraries.
Fixed build error when compiled against attoparsec-0.10.0.x.
Added System.IO.Streams.Concurrent.makeChanPipe, to create a simple concurrent pipe between an InputStream/OutputStream pair.
Added System.IO.Streams.Network.socketToStreamsWithBufferSize, allowing control over the size of the receive buffers used when reading from sockets.
Fixed an inconsistent version upper bound in the test suite.
Fixed a typo in the tutorial.
A couple of Haddock markup fixes.
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.
Fixed a bug in which "takeBytes 0" was erroneously requesting input from the wrapped stream.
Fixed a compile error on GHC 7.0.x.
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.)
Added System.IO.Streams.Combinators.ignoreEof.
Fixed some haddock markup.


Dependenciesattoparsec (==0.10.*), base (==4.*), blaze-builder (>=0.3.1 && <0.4), bytestring (>=0.9 && <0.11), network (>=2.3 && <2.5), primitive (>=0.2 && <0.6), process (>=1 && <1.3), text (>=0.10 && <1.1), time (>=1.2 && <1.5), transformers (>=0.2 && <0.4), vector (>=0.7 && <0.11), zlib-bindings (==0.1.*)
MaintainerGregory Collins <>
CategoryData, Network, IO-Streams
Bug tracker
Source repositoryhead: git clone
Upload dateWed Jan 8 13:21:22 UTC 2014
Uploaded byGregoryCollins
DistributionsDebian:, Fedora:, NixOS:
Downloads8570 total (1070 in last 30 days)




nointeractivetestsDo not run interactive testsDisabled

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


Maintainers' corner

For package maintainers and hackage trustees