Currying made simple.
– and we really mean simple:
import {curry, _} from '@thisables/curry';
// Got a simple function?
const plus = (
(a, b, c) => a + b + c
)::curry();
plus(1, 2, 3); //» 6
plus(1)(2, 3); //» 6
plus(1, 2)(3); //» 6
plus(1)(2)(3); //» 6
// Got a monster function?
const {open} = require('fs');
const newScript = open::curry(_, 'w', 0755, _);
newScript('do-wonders.sh', (error, file) => {
// The `file` is ready.
});
npm install @thisables/curry
The function curry
is invoked using the function bind syntax and returns a curried function.
const add = (a, b) => a + b;
const curriedAdd = add::curry();
curriedAdd(1)(2); //» 3
A placeholder _
is a special value, which you import from 'curry-this'
.
Placeholders are replaced from left to right, the next call after a placeholder is passed replaces the previous placeholders one by one.
const foo = (a, b, c, d) => [a, b, c, d];
const curriedFoo = foo::curry(_, _, _, 4);
curriedFoo(1)(2)(3); //» [1, 2, 3, 4]
If you pass a placeholder to curry
the length of the function is ignored instead the initial call of curry
defines the length of the curried function.
const foo = (...values) => values;
const curriedFoo = foo::curry(_, _, _);
curriedFoo(1)(2)(3); //» [1, 2, 3]
The curried function has a fixed arity. Additional arguments aren't passed.
const foo = (...values) => values;
const curriedFoo = foo::curry(_, _, _);
curriedFoo(1)(2)(3, 5, 6, 7); //» [1, 2, 3]
You can still use curry
without the experimental syntax
const add = (a, b) => a + b;
const curriedAdd = curry.call(add);
curriedAdd(1)(2); //» 3
Or with placeholders
const foo = (...values) => values;
const curriedFoo = curry.call(foo, _, _, _);
curriedFoo(1)(2)(3); //» [1, 2, 3]
Parameters
fn | the function to curry |
---|---|
args | curried arguments or placeholders |
Returns
A curried function.
If you’re wondering what the ::
thing means, you’d better read this excellent overview by @jussi-kalliokoski or have a look at the function bind syntax proposal.
stoeffel | tomekwi |