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
- Host: GitHub
- URL: https://github.com/zhaskell/stdio
- Owner: ZHaskell
- Created: 2018-05-05T17:25:06.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2020-10-24T16:34:37.000Z (about 5 years ago)
- Last Synced: 2025-04-24T00:59:32.613Z (7 months ago)
- Topics: haskell, haskell-stdio, libuv
- Language: Haskell
- Size: 3.31 MB
- Stars: 104
- Watchers: 13
- Forks: 5
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
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**.
[](https://travis-ci.org/haskell-stdio/stdio)
[](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
```