each-0.1.0.0: README.md
# each
Inspired by [the Scala library of the same name](https://github.com/ThoughtWorksInc/each),
each is a Template Haskell library that transforms expressions containing
invocations of impure subexpressions into calls to `fmap`, `<*>`, `join`,
etc. Just mark your impure subexpressions with `bind` or `~!` and they will be
called appropriately, as in this small demo:
ghci> $(each [| "Hello, " ++ (~! getLine) |])
World <--[keyboard input]
"Hello, World"
In this case, the code is translated into `fmap ((++) "Hello, ") getLine`
We currently have support for
* Normal function application like `f x y`
* Infix operator application like `x + y`, including sections like `(+ y)`
* Type signatures like `x :: t`
Support for more constructs is coming.
## More demos
A more detailed demo:
ghci> :{
| $(each [|
| "Hey it works"
| ++ show (length $
| "something"
| ++ (~! readFile "/etc/issue")
| ++ (~! readFile "/etc/issue.net"))
| |])
| :}
"Hey it works64"
Nested binds also work as expected.
ghci> prompt str = putStrLn str *> getLine
ghci> $(each [| "Nah just " ++ (~! prompt ("What's " ++ bind getLine ++ "?")) |])
something <--[keyboard input]
What's something?
nothing <--[keyboard input]
"Nah just nothing"