Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
curried
defmodule Curried do
defmacro defc({name, _, args}, [do: body]) do
curried_args = Enum.map(Enum.with_index(args), fn({_, index}) ->
Enum.take(args, index + 1)
end)
for a <- curried_args do
if a == Enum.at(curried_args, Enum.count(curried_args) - 1) do
quote do
def unquote(name)(unquote_splicing(a)) do
unquote(body)
end
end
else
quote do
def unquote(name)(unquote_splicing(a)) do
fn(next) -> unquote(name)(unquote_splicing(a), next) end
end
end
end
end
end
end
defmodule CurriedTest do
use ExUnit.Case, async: true
defmodule CurriedExample do
import Curried
defc foobar(one, two, three) do
one + two + three
end
end
test "curries" do
assert CurriedExample.foobar(1).(2).(3) == 6
assert CurriedExample.foobar(1, 2).(3) == 6
assert CurriedExample.foobar(1, 2, 3) == 6
end
end
@CMCDragonkai

This comment has been minimized.

Copy link

@CMCDragonkai CMCDragonkai commented Dec 9, 2014

Very Cool. Just wish that this was part of Elixir standard.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment