stdio alternatives and similar packages
Based on the "Data" category.
Alternatively, view stdio alternatives based on common mentions on social networks and blogs.
-
lens
Lenses, Folds, and Traversals - Join us on web.libera.chat #haskell-lens -
semantic-source
Parsing, analyzing, and comparing source code across many languages -
text
Haskell library for space- and time-efficient operations over Unicode text. -
code-builder
Packages for defining APIs, running them, generating client code and documentation. -
cassava
A CSV parsing and encoding library optimized for ease of use and high performance -
compendium-client
Mu (μ) is a purely functional framework for building micro services. -
holmes
A reference library for constraint-solving with propagators and CDCL. -
primitive
This package provides various primitive memory-related operations. -
resource-pool
A high-performance striped resource pooling implementation for Haskell -
discrimination
Fast linear time sorting and discrimination for a large class of data types -
IORefCAS
A collection of different packages for CAS based data structures. -
reflection
Reifies arbitrary Haskell terms into types that can be reflected back into terms -
dependent-sum
Dependent sums and supporting typeclasses for comparing and displaying them -
dependent-map
Dependently-typed finite maps (partial dependent products) -
text-icu
This package provides the Haskell Data.Text.ICU library, for performing complex manipulation of Unicode text. -
orgmode-parse
Attoparsec parser combinators for parsing org-mode structured text! -
streaming
An optimized general monad transformer for streaming applications, with a simple prelude of functions -
scientific
Arbitrary-precision floating-point numbers represented using scientific notation
Clean code begins in your IDE with SonarLint
Do you think we are missing an alternative of stdio or a related project?
README
Haskell stdio: haskell standard input and output
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, 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, haddock.
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