Z-IO: Simple and high performance IO toolkit for Haskell

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

Simple and high performance IO toolkit for Haskell, including file system, network, ipc and more!

[Skip to Readme]


Change log ChangeLog.md
Dependencies base (>=4.12 && <5.0), containers (==0.6.*), exceptions (==0.10.*), primitive (==0.7.1.*), stm (==2.5.*), time (>=1.9 && <=2.0), unix-time (>=0.4.7 && <=0.5), unordered-containers (==0.2.*), Z-Data (==0.4.*) [details]
License BSD-3-Clause
Copyright (c) Dong Han, 2017-2020 (c) Tao He, 2017-2019
Author Dong Han, Tao He
Maintainer winterland1989@gmail.com
Category Data
Home page https://github.com/haskell-Z/Z-IO
Bug tracker https://github.com/haskell-Z/Z-IO/issues
Source repo head: git clone git://github.com/haskell-Z/Z-IO.git
Uploaded by winterland at 2021-01-12T10:39:33Z



Manual Flags


Don't use pkg-config to check for library dependences(on platforms other than linux, win and osx)

Automatic Flags

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


Maintainer's Corner

For package maintainers and hackage trustees

Readme for Z-IO-

[back to package description]


Hackage Linux Build Status MacOS Build Status Windows Build Status Docker Build Status

This package is part of Z project, provides basic IO operations:


Example usage

> :set -XOverloadedStrings
> import Z.IO.Network
> import Z.IO.Resource
> import Z.IO.Buffered
> -- call getAddrInfo to perform DNS
> head <$> getAddrInfo Nothing "www.bing.com" "http"
AddrInfo {addrFlags = [AI_ADDRCONFIG,AI_V4MAPPED], addrFamily = SocketFamily 2, addrSocketType = SocketType 1, addrProtocol = ProtocolNumber 6, addrAddress =, addrCanonName = }
> import qualified Z.Data.Text as T
> -- send a simple HTTP request
> :{
let addr = ipv4 "" 80
in withResource (initTCPClient defaultTCPClientConfig{ tcpRemoteAddr = addr}) $ \ tcp -> do
    i <- newBufferedInput tcp
    o <- newBufferedOutput tcp
    writeBuffer o "GET http://www.bing.com HTTP/1.1\r\nHost: www.bing.com\r\n\r\n"
    flushBuffer o
    readBuffer i >>= pure . T.validate
"HTTP/1.1 200 OK\r\nDate: Sat, 19 Sep 2020 06:11:08 GMT\r\nContent-Length: 0\r\n\r\n"
> -- Start a TCP echo server, use @nc -v localhost 8080@ to test
> :{
startTCPServer defaultTCPServerConfig{
    tcpListenAddr = SocketAddrIPv4 ipv4Loopback 8080} $ \ tcp -> do
        i <- newBufferedInput tcp
        o <- newBufferedOutput tcp
        forever $ readBuffer i >>= writeBuffer o >> flushBuffer o

Dev guide

# get code
git clone --recursive git@github.com:haskell-Z/z-io.git
cd z-io
# build
cabal build
# test
cabal run Z-IO-Test
# install
cabal install
# generate document
cabal haddock