Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment