Croma

Elixir macro utilities.

Build StatusHex.pmHex.pmGithub IssuesPending Pull-Requests

Usage

Defining functions

Croma.Defpt.defpt

Unit-testable defp that is simply converted to

Croma.Defun

Type specification oriented function definition

is expanded to ex @spec f(integer, String.t) :: String.t def f(a, b) do "#{a} #{b}" end

is expanded to ex @spec dumbmap([a], (a -> b)) :: [b] when a: term, b: term def dumbmap(as, f) def dumbmap([], _) do [] end def dumbmap([h | t], f) do [f.(h) | dumbmap(t, f)] end

Croma.Monad

An interface definition of the monad typeclass. Modules that use Croma.Monad must implement the following interface:

By using the concrete implementations of the above interface, Croma.Monad provides the default implementations of the following functions:

Note that the order of parameters in map/ap is different from that of Haskell counterparts, in order to leverage Elixir's pipe operator |>.

Croma.Monad also provides bind-less syntax similar to the Haskell's do-notation. For example,

MonadImpl.m do
x <- mx
y <- my
pure f(x, y)
end

is converted to

MonadImpl.bind(mx, fn x ->
MonadImpl.bind(my, fn y ->
MonadImpl.pure f(x, y)
end)
end)

Croma.Result

Corma.Result.t(a) is defined as @type t(a) :: {:ok, a} | {:error, any}. The module implements Croma.Monad interface.