Skip to content

Instantly share code, notes, and snippets.

@patrickgombert
Last active December 4, 2020 05:38
Show Gist options
  • Save patrickgombert/4737bb75d3983d2c6512 to your computer and use it in GitHub Desktop.
Save patrickgombert/4737bb75d3983d2c6512 to your computer and use it in GitHub Desktop.
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
Copy link

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