README.md

# Monk

This is copied from the moduledocs. Better documentation to come.

Monk is your everyday `:ok | :error` monad.

### Basic usage

The monk macro allows you to pipe functions that accept a mere value, and
returns wrapped values like `{ok:, val}` or `{:error, val}`.

If a function returns `{:error, reason}`, the subsequent functions in the pipe
will *not* be called and the result of the whole expression will be the
`{:error, _}` tuple.

Some functions don't return any data, just `:ok`. The value `:ok` (the single
atom) will be passed along as-is to the next function in the pipe.

Of course, you need to `use Monk` to be able to call the macro.

Two syntaxes are supported :

    result = monk data |> map |> reduce

    monk do
      some |> nice |> piping
    end

### Capturing errors

If you except an error from a function, you can catch the error and continue
through the pipe with the ok/1 function. The next function will receive the
`{:error, reason}` tuple as it's first argument. Here, `report_error` receives
any value that is returned by `do_things`

    monk bad_data |> ok(do_things) |> report_error

This could be read as the following :

    {:ok, d} = bad_data()
    {:ok, {:error, e}} = ok(do_things(d))
    report_error({:error, e})