An open API service indexing awesome lists of open source software.

https://github.com/zhaskell/stdio

Haskell Standard Input and Output
https://github.com/zhaskell/stdio

haskell haskell-stdio libuv

Last synced: 7 months ago
JSON representation

Haskell Standard Input and Output

Awesome Lists containing this project

README

          

Haskell stdio: haskell standard input and output
================================================

**This project is moved to [project Z](https://github.com/haskell-Z/Z) and split into several packages**.

[![Linux Build Status](https://img.shields.io/travis/haskell-stdio/stdio/master.svg?label=Linux%20build)](https://travis-ci.org/haskell-stdio/stdio)
[![Windows Build Status](https://img.shields.io/appveyor/ci/winterland1989/stdio-7usux/master.svg?label=Windows%20build)](https://ci.appveyor.com/project/winterland1989/stdio-7usux/branch/master)

Welcome! Haskell stdio is a complete I/O toolkit powered by libuv, it features a multi-core io multiplexer and various improvements on packed data types. This project is still in infancy. Please join in!

```
__ _____ _____ __ __ ________ __ _______________ ________
/ / / / | / ___// //_// ____/ / / / / ___/_ __/ __ \/ _/ __ \
/ /_/ / /| | \__ \/ ,< / __/ / / / / \__ \ / / / / / // // / / /
/ __ / ___ |___/ / /| |/ /___/ /___/ /___ ___/ // / / /_/ // // /_/ /
/_/ /_/_/ |_/____/_/ |_/_____/_____/_____/ /____//_/ /_____/___/\____/
```

Install
-------

On windows we have bundled libuv source, so no extra steps to be taken.

On \*nix platforms, you should install libuv library first, you can use your distribution's package manager if available, for example:

```
# on debian/ubuntu, make sure to use 1.x
apt-get install libuv1-dev libuv1

# on MacOS, we recommend brew
brew install libuv

...
```

Currently **the minimum version requirement for libuv is v1.14**. If your package manager's libuv doesn't meet this requirement, you can also build libuv from source following the guide [here](https://github.com/libuv/libuv#build-instructions), e.g.

```
git clone https://github.com/libuv/libuv.git
cd libuv
git checkout tags/v1.24.0 # depend on your own need, any version >= 1.14 will work.
sh autogen.sh
./configure
make
sudo make install
```

After manually building and installing, you may need to modify your `LIBRARY_PATH/CPATH` if necessary. Now installing stdio is as easy as any other haskell packages.

```
cabal install stdio
```

Now you can fire GHCi and play around, or read the [project overview](https://haskell-stdio.github.io/stdio), [haddock](http://hackage.haskell.org/package/stdio).

Examples
--------

+ hello world

```
import Std.IO.StdStream
import qualified Std.Data.Text as T

main = do
-- read stdin and write to stdout, but with our new IO manager!
input <- readLineStd
printStd (T.validate input)
```

+ tcp echo server

```
import Std.IO.TCP
import Std.IO.Buffered
import Control.Monad

main = do
startServer defaultServerConfig
{ serverAddr = SockAddrInet 8888 inetAny
, serverWorker = echo
}
where
echo uvs = forever $ do
i <- newBufferedInput uvs 4096
o <- newBufferedOutput uvs 4096
readBuffer i >>= writeBuffer o
flushBuffer o
```

Now try `nc -v 127.0.0.1 8888`.

+ logging

```
import Std.IO.Logger
import qualified Std.Data.Builder as B
import Control.Concurrent

main = withStdLogger $ do
debug $ "hello world! PI ~=" >> B.double pi -- debug level won't be immediately flushed
forkIO $ do
fatal "fatal message will trigger a log flush"
```

+ file system operatations

```
import Std.IO.FileSystem
import Std.IO.Resource
import Std.IO.StdStream

main = do
-- create a temp directory
tempdir <- mkdtemp "temp"
let filename = "temp" <> "/test"
flags = O_RDWR .|. O_CREAT -- create if not exist
mode = DEFAULT_MODE

-- file is a 'Resource', use 'withResource' to automatically manage it
withResource (initUVFile filename flags mode) $ \ f -> do
o <- newBufferedOutput file 4096
writeBuffer o "hello world!"
flushBuffer o

stat filename >>= printStd
```