Implement automatic currying. 3.1.0
authorSiraaj Khandkar <siraaj@khandkar.net>
Wed, 29 Apr 2015 00:00:55 +0000 (20:00 -0400)
committerSiraaj Khandkar <siraaj@khandkar.net>
Wed, 29 Apr 2015 00:00:55 +0000 (20:00 -0400)
src/hope.app.src
src/hope_fun.erl
test/hope_fun_SUITE.erl

index 9d0ece1..f04e3ae 100644 (file)
@@ -1,7 +1,7 @@
 {application, hope,
  [
   {description, "Higher Order Programming in Erlang"},
-  {vsn, "3.0.0"},
+  {vsn, "3.1.0"},
   {registered, []},
   {applications, [
                   kernel,
index 61babe9..5ee6730 100644 (file)
@@ -2,9 +2,23 @@
 
 -export(
     [ id/1
+    , curry/1
     ]).
 
 -spec id(A) ->
     A.
 id(X) ->
     X.
+
+-spec curry(fun()) ->
+    fun().
+curry(F) ->
+    {value, {arity, Arity}} = lists:keysearch(arity, 1, erlang:fun_info(F)),
+    curry(F, [], Arity).
+
+-spec curry(fun(), list(), integer()) ->
+    fun().
+curry(F, Args, 0) ->
+    apply(F, lists:reverse(Args));
+curry(F, Args, Arity) ->
+    fun (X) -> curry(F, [X | Args], Arity - 1) end.
index d4e2281..910cc49 100644 (file)
@@ -9,6 +9,7 @@
 %% Test cases
 -export(
     [ t_id/1
+    , t_curry/1
     ]).
 
 
@@ -26,6 +27,7 @@ all() ->
 groups() ->
     Tests =
         [ t_id
+        , t_curry
         ],
     Properties = [parallel],
     [ {?GROUP, Properties, Tests}
@@ -39,3 +41,20 @@ groups() ->
 t_id(_Cfg) ->
     X = foo,
     X = hope_fun:id(X).
+
+t_curry(_Cfg) ->
+    Single = fun (X) -> X end,
+    Double = fun (X, Y) -> {X, Y} end,
+    Triple = fun (X, Y, Z) -> {X, Y, Z} end,
+
+    F = hope_fun:curry(Single),
+    a = F(a),
+
+    G1 = hope_fun:curry(Double),
+    G = G1(a),
+    {a, b} = G(b),
+
+    H1 = hope_fun:curry(Triple),
+    H2 = H1(a),
+    H  = H2(b),
+    {a, b, c} = H(c).
This page took 0.020107 seconds and 4 git commands to generate.