import curryN from '../curry'
describe('curryN', () => {
function source(a, b, c, d) {
void d
return a * b * c
}
it('accepts an arity', () => {
const curried = curryN(3, source)
expect(curried(1)(2)(3)).toEqual(6)
expect(curried(1, 2)(3)).toEqual(6)
expect(curried(1)(2, 3)).toEqual(6)
expect(curried(1, 2, 3)).toEqual(6)
})
it.skip('can be partially applied', () => {
const curry3 = curryN(3)
const curried = curry3(source)
expect(curried.length, 3)
expect(curried(1)(2)(3)).toEqual(6)
expect(curried(1, 2)(3)).toEqual(6)
expect(curried(1)(2, 3)).toEqual(6)
expect(curried(1, 2, 3)).toEqual(6)
})
it('preserves context', () => {
const ctx = { x: 10 }
const f = function(a, b) {
return a + b * this.x
}
const g = curryN(2, f)
expect(g.call(ctx, 2, 4)).toEqual(42)
expect(g.call(ctx, 2).call(ctx, 4)).toEqual(42)
})
it('supports R.__ placeholder', () => {
const f = function() {
return Array.from(arguments)
}
const g = curryN(3, f)
const _ = '_' // R.__
expect(g(1)(2)(3)).toEqual([1, 2, 3])
expect(g(1)(2, 3)).toEqual([1, 2, 3])
expect(g(1, 2)(3)).toEqual([1, 2, 3])
expect(g(1, 2, 3)).toEqual([1, 2, 3])
expect(g(_, 2, 3)(1)).toEqual([1, 2, 3])
expect(g(1, _, 3)(2)).toEqual([1, 2, 3])
expect(g(1, 2, _)(3)).toEqual([1, 2, 3])
expect(g(1, _, _)(2)(3)).toEqual([1, 2, 3])
expect(g(_, 2, _)(1)(3)).toEqual([1, 2, 3])
expect(g(_, _, 3)(1)(2)).toEqual([1, 2, 3])
expect(g(1, _, _)(2, 3)).toEqual([1, 2, 3])
expect(g(_, 2, _)(1, 3)).toEqual([1, 2, 3])
expect(g(_, _, 3)(1, 2)).toEqual([1, 2, 3])
expect(g(1, _, _)(_, 3)(2)).toEqual([1, 2, 3])
expect(g(_, 2, _)(_, 3)(1)).toEqual([1, 2, 3])
expect(g(_, _, 3)(_, 2)(1)).toEqual([1, 2, 3])
expect(g(_, _, _)(_, _)(_)(1, 2, 3)).toEqual([1, 2, 3])
expect(g(_, _, _)(1, _, _)(_, _)(2, _)(_)(3)).toEqual([1, 2, 3])
})
it('supports @@functional/placeholder', () => {
const f = function() {
return Array.from(arguments)
}
const g = curryN(3, f)
const _ = '_' //{'@@functional/placeholder': true, 'x': Math.random()}
expect(g(1)(2)(3)).toEqual([1, 2, 3])
expect(g(1)(2, 3)).toEqual([1, 2, 3])
expect(g(1, 2)(3)).toEqual([1, 2, 3])
expect(g(1, 2, 3)).toEqual([1, 2, 3])
expect(g(_, 2, 3)(1)).toEqual([1, 2, 3])
expect(g(1, _, 3)(2)).toEqual([1, 2, 3])
expect(g(1, 2, _)(3)).toEqual([1, 2, 3])
expect(g(1, _, _)(2)(3)).toEqual([1, 2, 3])
expect(g(_, 2, _)(1)(3)).toEqual([1, 2, 3])
expect(g(_, _, 3)(1)(2)).toEqual([1, 2, 3])
expect(g(1, _, _)(2, 3)).toEqual([1, 2, 3])
expect(g(_, 2, _)(1, 3)).toEqual([1, 2, 3])
expect(g(_, _, 3)(1, 2)).toEqual([1, 2, 3])
expect(g(1, _, _)(_, 3)(2)).toEqual([1, 2, 3])
expect(g(_, 2, _)(_, 3)(1)).toEqual([1, 2, 3])
expect(g(_, _, 3)(_, 2)(1)).toEqual([1, 2, 3])
expect(g(_, _, _)(_, _)(_)(1, 2, 3)).toEqual([1, 2, 3])
expect(g(_, _, _)(1, _, _)(_, _)(2, _)(_)(3)).toEqual([1, 2, 3])
})
it('forwards extra arguments', () => {
const f = function() {
return Array.from(arguments)
}
const g = curryN(3, f)
expect(g(1, 2, 3)).toEqual([1, 2, 3])
expect(g(1, 2, 3, 4)).toEqual([1, 2, 3, 4])
expect(g(1, 2)(3, 4)).toEqual([1, 2, 3, 4])
expect(g(1)(2, 3, 4)).toEqual([1, 2, 3, 4])
expect(g(1)(2)(3, 4)).toEqual([1, 2, 3, 4])
})
})