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

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

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.read :: InputStream a -> IO (Maybe a)

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

-- write to an output stream
Streams.write :: Maybe a -> 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.


[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

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
Change log changelog.md
Dependencies attoparsec (>=0.10 && <0.14), base (>=4 && <5), bytestring (>=0.9 && <0.11), bytestring-builder (>=0.10 && <0.11), network (>=2.3 && <2.7), primitive (>=0.2 && <0.7), process (>=1.1 && <1.3), text (>=0.10 && <1.3), time (>=1.2 && <1.6), transformers (>=0.2 && <0.5), vector (>=0.7 && <0.11), zlib-bindings (>=0.1 && <0.2) [details]
Tested with ghc ==7.8.4, ghc ==7.8.3, ghc ==7.6.3, ghc ==7.4.2
License BSD-3-Clause
Author
Maintainer Gregory Collins <[email protected]>
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 2015-06-09T16:06:20Z
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 101 direct, 3648 indirect [details]
Downloads 86876 total (200 in the last 30 days)
Rating 2.5 (votes: 5) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2015-06-11 [all 1 reports]

Readme for io-streams-1.3.1.0

[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.