## Reader The `Reader` monad represents a computation that can read values from a shared environment, pass values from function to function, and execute sub-computations in a modified environment. It is also useful for dependency injection. **Implements:** [Monad](https://github.com/fantasyland/fantasy-land#monad) - [Reader](#reader) - [Reader(f)](#readerf) - [Reader.of(v)](#readerofv) - [Reader.toString()](#readertostring) - [Reader.map(f)](#readermapf) - [Reader.getValue()](#readergetvalue) - [Reader.ap(t)](#readerapt) - [Reader.chain(f)](#readerchainf) - [Reader.runWith(e)](#readerrunwithe) ### Reader(f) The `Reader` constructor. | Param | Type | Description | | ----- | --------------------- | --------------------------------------------------------------------------------------------------------------------------- | | f | function | A function of the form `(e -> a)` that is wrapped by the `Reader`. Nothing is executed until it is run with an environment. | ### Reader.of(v) The `Reader` constructor that populates the right portion with its argument. `of` essentially lifts a value of type `a` into a `Reader`. | Param | Type | Description | | ----- | ---------------- | --------------------------------------------------- | | v | any | Any value that needs to be lifted into the `Reader` | ### Reader.toString() Gets a stringified version of the `Reader`. ### Reader.map(f) Applies the function `f` to the right portion of the `Reader`. | Param | Type | Description | | ----- | --------------------- | ----------- | | f | function | Function | ### Reader.getValue() Gets the function within the `Reader`. ### Reader.ap(t) `ap` allows for values wrapped in a `Reader` to be applied to functions also wrapped in a `Reader`. In order to use `ap`, the `Reader` must contain a function as its value. | Param | Type | Description | | ----- | ------------------------------ | --------------------------------------- | | t | [Reader](#Reader) | A `Reader` with a function as its value | ### Reader.chain(f) Chains together many computations that return a `Reader`. | Param | Type | Description | | ----- | --------------------- | -------------------------------------- | | f | function | Function that returns another `Reader` | ### Reader.runWith(e) Since `Reader` is a lazy datatype that requires a shared environment to run, its instance provides a `runWith` method. This method takes in an environment and returns the result of the computation. | Param | Type | Description | | ----- | ---------------- | ------------------------------------------------------ | | e | any | An environment that needs to be passed to the `Reader` |