Yank Down

Have you ever been unsure what value to pass first in a curried function?
const divide = numerator => denominator => numerator/denominator;
and ended up getting it wrong?
const needToBeDividedBy3 = [1,3,4,5,2];
const wrongAnswer = needToBeDivided.map(divide(3));
Enter yankDown, the titular function of this module.
import { yankDown } from 'yank-down';
const flippedDivide = yankDown(divide)(1);
const correctAnswer = needToBeDivided.map(flippedDivide(3));
AMAZING!!!
Multi-Parameter Functions
Yank Down will even work with multi-parameter functions.
const factoryFactory =
(factoryName, factoryConfig = {}) =>
(objProps = {}) =>
{ ...objProps, factoryConfig, type: factoryName }
;
const flippedFF = yankDown(factoryFactory)(1);
SO CONVENIENT
Arbitrary Curry Depth
As you would expect, yankDown can work with curried functions of arbitrary depth
const makeArray = one => two => three => [one, two, three];
console.log(makeArray(1)(2)(3));
const yankedMakeArray = yankDown(makeArray)(1);
console.log(yankedMakeArray(1)(2)(3));
JUST WOW.
Yank supports binding syntax.
also, yankDown is exported as yank
import { yank } from 'yank-down';
yank(makeArray)(1);
yank.bind(makeArray)(1);
makeArray::yank(1);
yank-down also has 2 other utility functions
collect
collect
is a function that creates a depth
deep curried thunk that collects arguments and then either returns them or passes them to a passed callback cb
.
collect(depth, cb = false, preexistingArgsList = [])
It's really no so bad. Here's an example
import { collect } from 'yank-down';
cosnt thunk = collect(3)
expect(thunk(1)(2)(3)).to.deep.equal([[1], [2], [3]]);
const cbThunk = collect(4, console.log);
cbThunk('a', 'e')('b')('c')('d');
apply
apply
takes a list of lists of arguments like what is produced by collect
and applies it to a curried thunk, then returns the result.
apply(curriedFunc)(argsListList)
Check it out.
import { apply } from 'yank-down';
apply(makeArray)([[1], [2]]);
apply(makeArray)([['one'], ['two'], ['three']]);
makeArray::apply([['such'], ['cool']])('amaze');