Tests

do

This package brings monads, applicatives, functors, and do-notation to Erlang. It provides behaviours for related type classes, as well as implementations for commonly used class instances.

Installation

To install the latest version of do from hex, add do to the deps in your rebar config file:

{do, "1.2.2"}

What's in the box

By default, do provides implementations for either, list and maybe monads, as well as a range of useful functors. See do_types.hrl for type definitions.

The fmap macro

The ?fmap macro can be used to map functions over functors:

-include_lib("do/include/do.hrl").
add1(N) -> N + 1.
fmap_example() ->
{ok, 2} = ?fmap(fun add1/1, {ok, 1}),
{error, rsn} = ?fmap(fun add1/1, {error, rsn}),
[2, 3, 4] = ?fmap(fun add1/1, [1, 2, 3]),
#{a => 2} = ?fmap(fun add1/1, #{a => 1}).

The do macro

The ?do macro consecutively executes functions inside monads. The macro takes a start value (a monad), and a list of functions. The functions must each take either 0 or 1 argument(s) and must return a monad. On execution, the start value is passed to the first function in the provided list, and then piped through consecutive functions using bind.

-include_lib("do/include/do.hrl").
maybe_add1(N) when N > 2 -> {error, N};
maybe_add1(N) -> {ok, N + 1}.
do_either() ->
{error, 3} = ?do({ok, 1}, [ fun maybe_add1/1,
fun maybe_add1/1,
fun maybe_add1/1,
fun maybe_add1/1]).