Curry - a Raku module for currying functions.
Curry is a Raku module for currying functions plus partially applying them.
use Curry:auth<zef:CIAvash> :all;
# Curried subs
sub f ($a, $b) is curry {
$a × $b;
}
my &pf = f 2;
say pf 3;
=output 6
sub f2 ($a, $b, :$c = 1) is curry {
[×] $a, $b, $c;
}
my &pf2 = f 2, :c(4);
say pf 3;
=output 24
sub f3 (*@a) is curry {
[×] @a;
}
my &pf3 = f 2, 3;
say pf;
=output 6
say pf(4)();
=output 24
# Curried method and attribute
my class C {
has &.f is curry is rw;
method m (Int $a, Int $b) is curry {
$a × $b;
}
}
my C $c .= new;
# Method
say $c.m(2, 3)()
=output 6
my &pm = $c.m(2, 3);
say pm;
=output 6
say pm(4)();
=output 24
# Attribute
$c.f = * + *;
say $c.f.(1, 2);
=output 3
my &pa = $c.f.(1);
say pa 2;
=output 3
# Making Curry
my &f3 = Curry[* + *];
# Or
my &f4 = make_curry * + *;
my &cgrep = Curry[&grep];
# Or better
my &cgrep2 = new_curry &grep;
# Be careful with this
make_curry &grep;
# Or
make_curryable &grep; # This changes function's signature
# Original function (before being curried)
my &lost_grep = &grep.original_function;You need to have Raku and zef, then run:
zef install --/test "Curry:auth<zef:CIAvash>"or if you have cloned the repo:
zef install .prove -ve 'raku -I.' --ext rakutestCurry role takes a function as parameter and does the Callable role
method CALL-ME(
|c
) returns MuCalls the function if all parameters are provided or returns a partially applied function
method curry(
|c
) returns Curry:DLike assuming but returns a Curry. And tries to preserve the parameters of the partial function.
method original_function() returns Code:DReturns the original function, the function that was curried
A role with a signature that captures all arguments
multi sub make_curry(
Code:D $f
) returns Curry:D is export(:all, :subs)Takes a function, gives a cloned version of it to Curry, then adds the role to the function
multi sub make_curry(
*@f where { ... }
) returns Array[Curry:D] is export(:all, :subs)Takes functions, gives a cloned version of each to Curry, then adds the role to each function
multi sub new_curry(
Code:D $f
) returns Curry:D is export(:all, :subs)Takes a function, creates a copy of it with role Curry mixed in
multi sub new_curry(
*@f where { ... }
) returns Array[Curry:D] is export(:all, :subs)Takes functions, creates a copy of each with role Curry mixed in
multi sub make_curryable(
Code:D $f
) returns Curry:D is export(:all, :subs)Takes a function and returns a curried function that does Curry::CaptureAll
multi sub make_curryable(
*@f where { ... }
) returns Array[Curry:D] is export(:all, :subs)Takes functions and returns an array of curried functions that does Curry::CaptureAll
multi sub trait_mod:<is>(
Sub:D $sub,
:$curry!
) returns Mu is export(:all, :traits)is curry trait for Sub; Makes the function a curried function that does Curry::CaptureAll
multi sub trait_mod:<is>(
Method:D $method,
:$curry!
) returns Mu is export(:all, :traits)is curry trait for Method; Makes the function a curried function that does Curry::CaptureAll
multi sub trait_mod:<is>(
Attribute:D $attribute,
:$curry!
) returns Mu is export(:all, :traits)is curry trait for Attribute; Makes the function a curried function that does Curry::CaptureAll.
If you want to be able to set the function from outside of the class, you need to make the attribute writable
with is rw. Setting the attribute with new doesn't work, only assignment works.
https://github.com/CIAvash/Curry/
https://github.com/CIAvash/Curry/issues
Siavash Askari Nasr - https://www.ciavash.name
Copyright © 2021 Siavash Askari Nasr
This file is part of Curry.
Curry is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Curry is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License along with Curry. If not, see http://www.gnu.org/licenses/.