From c7f5fe1ef0c31a2d1c4813265456e046d69d6e6a Mon Sep 17 00:00:00 2001 From: Atticus White Date: Mon, 5 Jun 2017 19:28:41 -0400 Subject: [PATCH 1/4] conditional case support --- renderIf.js | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 51 insertions(+), 2 deletions(-) diff --git a/renderIf.js b/renderIf.js index e441480..8e17b2b 100644 --- a/renderIf.js +++ b/renderIf.js @@ -2,5 +2,54 @@ const isFunction = input => typeof input === 'function'; -export default predicate => elemOrThunk => - predicate ? (isFunction(elemOrThunk) ? elemOrThunk() : elemOrThunk) : null; +function renderIf (predicate) { + return elemOrThunk => predicate ? (isFunction(elemOrThunk) ? elemOrThunk() : elemOrThunk) : null; +} + +renderIf.if = function multiStatement (initialCondition) { + return renderIf.multi().if(initialCondition); +} + +renderIf.multi = function () { + const cases = []; + + function createCondition (priority) { + return function conditionCase (condition) { + return function conditionComponent (elemOrThunk) { + cases.push({ + priority, + condition, + elemOrThunk + }); + + return api; + } + } + } + + function evaluate() { + let sortedCases = cases.sort((a, b) => a.priority > b.priority); + + for (let i = 0; i < sortedCases.length; i++) { + if (sortedCases[i].condition) { + if (isFunction(sortedCases[i].elemOrThunk)) { + return sortedCases[i].elemOrThunk(); + } + return sortedCases[i].elemOrThunk; + } + } + + return null; + } + + const api = { + if: createCondition(0), + elseIf: createCondition(1), + else: createCondition(2), + evaluate + }; + + return api; +} + +export default renderIf; From d9782b0c48c764d932feffe145e38ab19e8e1f2f Mon Sep 17 00:00:00 2001 From: Atticus White Date: Mon, 5 Jun 2017 19:36:37 -0400 Subject: [PATCH 2/4] no condition needed for else --- renderIf.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/renderIf.js b/renderIf.js index 8e17b2b..69d25f1 100644 --- a/renderIf.js +++ b/renderIf.js @@ -27,6 +27,16 @@ renderIf.multi = function () { } } + function elseCondition (elemOrThunk) { + cases.push({ + priority: 2, + condition: true, + elemOrThunk + }); + + return api; + } + function evaluate() { let sortedCases = cases.sort((a, b) => a.priority > b.priority); @@ -45,7 +55,7 @@ renderIf.multi = function () { const api = { if: createCondition(0), elseIf: createCondition(1), - else: createCondition(2), + else: elseCondition, evaluate }; From 84d8f3021a0babfd95f2bb883d6553d20c62e71a Mon Sep 17 00:00:00 2001 From: Atticus White Date: Mon, 5 Jun 2017 20:01:15 -0400 Subject: [PATCH 3/4] switch cases --- renderIf.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/renderIf.js b/renderIf.js index 69d25f1..d889ee0 100644 --- a/renderIf.js +++ b/renderIf.js @@ -2,14 +2,72 @@ const isFunction = input => typeof input === 'function'; +function renderElemOrThunk (elemOrThunk) { + if (isFunction(elemOrThunk)) { + return elemOrThunk() + } + return elemOrThunk; +} + function renderIf (predicate) { - return elemOrThunk => predicate ? (isFunction(elemOrThunk) ? elemOrThunk() : elemOrThunk) : null; + return elemOrThunk => predicate ? renderElemOrThunk(elemOrThunk) : null; } renderIf.if = function multiStatement (initialCondition) { return renderIf.multi().if(initialCondition); } +renderIf.switch = function switchStatement (subject) { + const cases = []; + + function switchCase (value) { + return function switchComponent (elemOrThunk) { + cases.push({ + default: false, + elemOrThunk, + value + }); + + return api; + } + } + + function switchDefault (elemOrThunk) { + cases.push({ + default: true, + elemOrThunk + }); + + return api; + } + + function evaluate() { + const sortedCase = cases.sort((a, b) => a.default && !b.default); + + for (let i = 0; i < sortedCase.length; i++) { + const currentCase = sortedCase[i]; + + if (!currentCase.default) { + if (currentCase.value === subject) { + return renderElemOrThunk(currentCase.elemOrThunk); + } + } else if (currentCase.default) { + return renderElemOrThunk(currentCase.elemOrThunk); + } + } + + return null; + } + + const api = { + case: switchCase, + default: switchDefault, + evaluate + }; + + return api; +} + renderIf.multi = function () { const cases = []; From 1e9eb9bc466eaaf541a1acff47677e13b5b0aa26 Mon Sep 17 00:00:00 2001 From: Atticus White Date: Mon, 5 Jun 2017 20:01:18 -0400 Subject: [PATCH 4/4] units --- test.js | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test.js b/test.js index 769c066..a6460c8 100644 --- a/test.js +++ b/test.js @@ -37,4 +37,40 @@ describe('renderIf', () => { expect(spy).not.to.have.been.called; }); }); + + describe('if/elseIf/else', () => { + for (let i = 1; i <= 4; i++) { + let result = renderIf.if(i === 1) ( + '1' + ).elseIf(i === 2) ( + '2' + ).elseIf(i === 3) ( + '3' + ).else( + '4' + ).evaluate(); + + expect(result).to.be.equal(`${i}`); + } + }) + describe('switch', () => { + for (let i = 1; i <= 4; i++) { + let result = renderIf.switch(i) + .case(1) ( + '1' + ) + .case(2) ( + '2' + ) + .case(3) ( + '3' + ) + .default( + '4' + ) + .evaluate(); + + expect(result).to.be.eql(`${i}`); + } + }) });