Punie / elm-reader / Reader

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.

The Reader type


type Reader env value

Reader env value represents a computation waiting for an environment value to produce its result.

Construction

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.

Transformations and chaining

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