From 8e19d06f53c2c97f4043bbb2ce671ce8af7c36b7 Mon Sep 17 00:00:00 2001 From: Brent Van Minnen Date: Tue, 17 Nov 2015 18:49:33 -0800 Subject: [PATCH 1/4] composition can be seeded with multiple arguments --- src/utils/compose.js | 4 +++- test/utils/compose.spec.js | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/utils/compose.js b/src/utils/compose.js index c930a9af8e..8bb0164b8e 100644 --- a/src/utils/compose.js +++ b/src/utils/compose.js @@ -6,5 +6,7 @@ * left. For example, compose(f, g, h) is identical to arg => f(g(h(arg))). */ export default function compose(...funcs) { - return arg => funcs.reduceRight((composed, f) => f(composed), arg) + return (...args) => funcs.slice(0, -1).reduceRight((composed, f) => + f(composed), funcs[funcs.length - 1](...args) + ) } diff --git a/test/utils/compose.spec.js b/test/utils/compose.spec.js index b8de61fddf..09258c0f26 100644 --- a/test/utils/compose.spec.js +++ b/test/utils/compose.spec.js @@ -21,5 +21,11 @@ describe('Utils', () => { expect(compose(b, c, a)(final)('')).toBe('bca') expect(compose(c, a, b)(final)('')).toBe('cab') }) + + it('can be seeded with multiple arguments', () => { + const square = x => x * x + const add = (x, y) => x + y + expect(compose(square, add)(1, 2)).toBe(9) + }) }) }) From 306094df6ba9136bcba4b8dd6b577b5b3e8ddff5 Mon Sep 17 00:00:00 2001 From: Brent Van Minnen Date: Wed, 18 Nov 2015 21:11:49 -0800 Subject: [PATCH 2/4] handle compose with no functions --- src/utils/compose.js | 8 +++++--- test/utils/compose.spec.js | 6 ++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/utils/compose.js b/src/utils/compose.js index 8bb0164b8e..cc4edefb01 100644 --- a/src/utils/compose.js +++ b/src/utils/compose.js @@ -6,7 +6,9 @@ * left. For example, compose(f, g, h) is identical to arg => f(g(h(arg))). */ export default function compose(...funcs) { - return (...args) => funcs.slice(0, -1).reduceRight((composed, f) => - f(composed), funcs[funcs.length - 1](...args) - ) + return (...args) => { + return funcs.length ? + funcs.slice(0, -1).reduceRight((composed, f) => f(composed), funcs[funcs.length - 1](...args)) : + args[0] + } } diff --git a/test/utils/compose.spec.js b/test/utils/compose.spec.js index 09258c0f26..99b4eb4edf 100644 --- a/test/utils/compose.spec.js +++ b/test/utils/compose.spec.js @@ -27,5 +27,11 @@ describe('Utils', () => { const add = (x, y) => x + y expect(compose(square, add)(1, 2)).toBe(9) }) + + it('returns the first given argument if given no functions', () => { + expect(compose()(1, 2)).toBe(1) + expect(compose()(3)).toBe(3) + expect(compose()()).toBe(undefined) + }) }) }) From 01216891ff2a5c829cb72326734ae152fa8ac01b Mon Sep 17 00:00:00 2001 From: Brent Van Minnen Date: Wed, 25 Nov 2015 19:48:10 -0800 Subject: [PATCH 3/4] more verbose, but easier to follow --- src/utils/compose.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/utils/compose.js b/src/utils/compose.js index cc4edefb01..13915a4a99 100644 --- a/src/utils/compose.js +++ b/src/utils/compose.js @@ -7,8 +7,14 @@ */ export default function compose(...funcs) { return (...args) => { - return funcs.length ? - funcs.slice(0, -1).reduceRight((composed, f) => f(composed), funcs[funcs.length - 1](...args)) : - args[0] + if (funcs.length === 0) { + // We weren't given any functions, just return the first passed in arg. + return args[0]; + } + + const last = funcs[funcs.length - 1]; + const rest = funcs.slice(0, -1); + + return rest.reduceRight((composed, f) => f(composed), last(...args)); } } From 422c37ac74434b6436f166f13cf254999932bbb9 Mon Sep 17 00:00:00 2001 From: Brent Van Minnen Date: Fri, 27 Nov 2015 13:08:19 -0800 Subject: [PATCH 4/4] remove semicolons --- src/utils/compose.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/utils/compose.js b/src/utils/compose.js index 13915a4a99..1a0e3e2284 100644 --- a/src/utils/compose.js +++ b/src/utils/compose.js @@ -9,12 +9,12 @@ export default function compose(...funcs) { return (...args) => { if (funcs.length === 0) { // We weren't given any functions, just return the first passed in arg. - return args[0]; + return args[0] } - const last = funcs[funcs.length - 1]; - const rest = funcs.slice(0, -1); + const last = funcs[funcs.length - 1] + const rest = funcs.slice(0, -1) - return rest.reduceRight((composed, f) => f(composed), last(...args)); + return rest.reduceRight((composed, f) => f(composed), last(...args)) } }