| Copyright | (c) Dong Han 2018~2019 |
|---|---|
| License | BSD |
| Maintainer | winterland1989@gmail.com |
| Stability | experimental |
| Portability | non-portable |
| Safe Haskell | None |
| Language | Haskell2010 |
Z.IO.StdStream
Description
This module provides stdin/stderr/stdout reading and writings. Usually you don't have to use stderr or stderrBuf directly, Logger provides more logging utilities through stderr. While stdinBuf and stdoutBuf is useful when you write interactive programs, Buffered module provide many reading and writing operations. Example:
import Control.Concurrent.MVar
import Z.IO.LowResTimer
import Z.IO.Buffered
import Z.IO.StdStream
import qualified Z.Data.Vector as V
import qualified Z.Data.Builder as B
main = do
-- read by 'n'
b1 <- readLineStd
-- read whatever user input in 3s, otherwise get Nothing
b2 <- timeoutLowRes 30 $ withMVar stdinBuf readBuffer
...
putStd "hello world!"
-- Raw mode
setStdinTTYMode UV_TTY_MODE_RAW
forever $ do
withMVar stdinBuf $ i -> withMVar stdoutBuf $ o -> do
bs <- readBuffer i
let Just key = V.headMaybe bs
writeBuilder o (B.hex key)
flushBuffer o
Synopsis
- data StdStream
- isStdStreamTTY :: StdStream -> Bool
- data UVTTYMode where
- pattern UV_TTY_MODE_NORMAL :: UVTTYMode
- pattern UV_TTY_MODE_RAW :: UVTTYMode
- setStdinTTYMode :: UVTTYMode -> IO ()
- getStdoutWinSize :: HasCallStack => IO (CInt, CInt)
- stdin :: StdStream
- stdout :: StdStream
- stderr :: StdStream
- stdinBuf :: MVar (BufferedInput StdStream)
- stdoutBuf :: MVar (BufferedOutput StdStream)
- stderrBuf :: MVar (BufferedOutput StdStream)
- printStd :: HasCallStack => ToText a => a -> IO ()
- readLineStd :: HasCallStack => IO Bytes
- putStd :: HasCallStack => Builder a -> IO ()
- putLineStd :: HasCallStack => Builder a -> IO ()
Standard input & output streams
Standard input and output streams
We support both regular file and TTY based streams, when initialized
uv_guess_handle is called to decide which type of devices are connected
to standard streams.
Note StdStream is not thread safe, you shouldn't use them without lock.
For the same reason you shouldn't use stderr directly, use Logger module instead.
isStdStreamTTY :: StdStream -> Bool Source #
Terminal mode.
When in UV_TTY_MODE_RAW mode, input is always available character-by-character,
not including modifiers. Additionally, all special processing of characters by the terminal is disabled,
including echoing input characters. Note that CTRL+C will no longer cause a SIGINT when in this mode.
Bundled Patterns
| pattern UV_TTY_MODE_NORMAL :: UVTTYMode | |
| pattern UV_TTY_MODE_RAW :: UVTTYMode |
Instances
setStdinTTYMode :: UVTTYMode -> IO () Source #
Change terminal's mode if stdin is connected to a terminal.
getStdoutWinSize :: HasCallStack => IO (CInt, CInt) Source #
Get terminal's output window size in (width, height) format, return (-1, -1) if stdout is a file.
stdinBuf :: MVar (BufferedInput StdStream) Source #
A global buffered stdin stream protected by MVar.
utils
printStd :: HasCallStack => ToText a => a -> IO () Source #
print a ToText and flush to stdout.
readLineStd :: HasCallStack => IO Bytes Source #
read a line from stdin
putStd :: HasCallStack => Builder a -> IO () Source #
print a Builder and flush to stdout.
putLineStd :: HasCallStack => Builder a -> IO () Source #
print a Builder and flush to stdout, with a linefeed.