silently-1.2.5.4: README.md
[](http://hackage.haskell.org/package/silently)
[](https://stackage.org/nightly/package/silently)
[](https://www.stackage.org/package/silently)
[](https://github.com/hspec/silently/actions)
# silently
Silently is a package that allows you to run an `IO` action and
prevent it from writing to `stdout`, or any other handle, by using
`silence`. Or you can capture the output for yourself using `capture`.
For example, the program
```haskell
import System.IO.Silently
main = do
putStr "putStrLn: " >> putStrLn "puppies!"
putStr "silenced: " >> silence (putStrLn "kittens!")
putStrLn ""
(captured, result) <- capture (putStr "wookies!" >> return 123)
putStr "captured: " >> putStrLn captured
putStr "returned: " >> putStrLn (show result)
```
will print:
```
putStrLn: puppies!
silenced:
captured: wookies!
returned: 123
```
## Not thread-safe
Since all threads of a process share the standard output handles `stdout` and `stderr`,
capturing output to these handle will capture the output of __all threads__,
not just the one running the action under `capture`.
In essence, this library does not work in a situation where multiple threads are writing to the handle
whose output _produced by the given action_ we want to capture.
See:
- https://github.com/hspec/silently/issues/6
## Further limitations
Capturing/silencing might not work as expected if the action uses the FFI
or conceals output under `unsafePerformIO` or similar unsafe operations.
Examples:
- FFI: https://github.com/hspec/silently/issues/3
- `unsafePerformIO`: https://github.com/bos/filemanip/issues/22