Basically, a Reader
is just a wrapper for a function type.
It is quite handy in that it solves the problem to manually having to
thread a single configuration parameter to many functions.
It is often viewed as a way to do dependency injection in FP.
Reader env value
represents a computation waiting for an environment
value to produce its result.
run : Reader env value -> env -> value
Run the reader, providing it, at last, its environment.
reader : value -> Reader env value
Construct a Reader that will produce the value provided, no matter the environment.
ask : Reader env env
Fetch the value of the environment.
asks : (env -> value) -> Reader env value
Embed a function in a Reader
local : (env -> env) -> Reader env a -> Reader env a
Locally modify the environment for the next Reader action.
map : (a -> b) -> Reader env a -> Reader env b
Apply a function to the resulting value of the Reader.
map2 : (a -> b -> c) -> Reader env a -> Reader env b -> Reader env c
map3 : (a -> b -> c -> d) -> Reader env a -> Reader env b -> Reader env c -> Reader env d
map4 : (a -> b -> c -> d -> e) -> Reader env a -> Reader env b -> Reader env c -> Reader env d -> Reader env e
map5 : (a -> b -> c -> d -> e -> f) -> Reader env a -> Reader env b -> Reader env c -> Reader env d -> Reader env e -> Reader env f
andMap : Reader env a -> Reader env (a -> b) -> Reader env b
Apply a function wrapped in a Reader to a value wrapped in a Reader. This is particularly useful for transforming a succession of resulting values with a single function.
map (\x y z -> ( x, y, z )) (reader 'x')
|> andMap (reader 42)
|> andMap (reader "fourty two")
== reader ( 'x', 42, "fourty two" )
andThen : (a -> Reader env b) -> Reader env a -> Reader env b
Chain a Reader with a computation producing a Reader
join : Reader env (Reader env a) -> Reader env a
Discard one level of Reader