README.md

Croma
=====

Elixir macro utilities

## `Croma.Defun`

Type specification oriented function definition
- Example 1

    ```ex
    import Croma.Defun
    defun f(a: integer, b: String.t) :: String.t do
      "#{a} #{b}"
    end
    ```
is expanded to
    ```ex
    @spec f(integer, String.t) :: String.t
    def f(a, b) do
      "#{a} #{b}"
    end
    ```
- Example 2

    ```ex
    import Croma.Defun
    defun dumbmap(as: [a], f: (a -> b)) :: [b] when a: term, b: `term do
      ([]     , _) -> []
      ([h | t], f) -> [f.(h) | dumbmap(t, f)]
    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
    ```
- Known limitations:
    - Pattern matching against function parameters should use `(param1, param2) when guards -> block` style.
    - Overloaded typespecs are not supported.