feat(compose): right to left support
This commit is contained in:
parent
0ec0e286ba
commit
2b91d4af99
@ -16,3 +16,15 @@ Functions may also be passed in an array:
|
|||||||
```js
|
```js
|
||||||
const f = compose([add2, mul3])
|
const f = compose([add2, mul3])
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Options can be passed as first parameters:
|
||||||
|
|
||||||
|
```js
|
||||||
|
const f = compose(
|
||||||
|
{
|
||||||
|
// compose from right to left
|
||||||
|
right: true,
|
||||||
|
},
|
||||||
|
[add2, mul3]
|
||||||
|
)
|
||||||
|
```
|
||||||
|
@ -1,9 +1,21 @@
|
|||||||
'use strict'
|
'use strict'
|
||||||
|
|
||||||
exports.compose = function compose(fns) {
|
const defaultOpts = { right: false }
|
||||||
if (!Array.isArray(fns)) {
|
|
||||||
|
exports.compose = function compose(opts, fns) {
|
||||||
|
if (Array.isArray(opts)) {
|
||||||
|
fns = opts
|
||||||
|
opts = defaultOpts
|
||||||
|
} else if (typeof opts === 'object') {
|
||||||
|
opts = Object.assign({}, defaultOpts, opts)
|
||||||
|
if (!Array.isArray(fns)) {
|
||||||
|
fns = Array.prototype.slice.call(arguments, 1)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
fns = Array.from(arguments)
|
fns = Array.from(arguments)
|
||||||
|
opts = defaultOpts
|
||||||
}
|
}
|
||||||
|
|
||||||
const n = fns.length
|
const n = fns.length
|
||||||
if (n === 0) {
|
if (n === 0) {
|
||||||
throw new TypeError('at least one function must be passed')
|
throw new TypeError('at least one function must be passed')
|
||||||
@ -11,6 +23,11 @@ exports.compose = function compose(fns) {
|
|||||||
if (n === 1) {
|
if (n === 1) {
|
||||||
return fns[0]
|
return fns[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opts.right) {
|
||||||
|
fns.reverse()
|
||||||
|
}
|
||||||
|
|
||||||
return function (value) {
|
return function (value) {
|
||||||
for (let i = 0; i < n; ++i) {
|
for (let i = 0; i < n; ++i) {
|
||||||
value = fns[i](value)
|
value = fns[i](value)
|
||||||
|
@ -18,4 +18,12 @@ describe('compose()', () => {
|
|||||||
it('accepts functions in an array', () => {
|
it('accepts functions in an array', () => {
|
||||||
expect(compose([add2, mul3])(5)).toBe(21)
|
expect(compose([add2, mul3])(5)).toBe(21)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('can apply from right to left', () => {
|
||||||
|
expect(compose({ right: true }, add2, mul3)(5)).toBe(17)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('accepts options with functions in an array', () => {
|
||||||
|
expect(compose({ right: true }, [add2, mul3])(5)).toBe(17)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user