diff --git a/Exercises/1-pipe.js b/Exercises/1-pipe.js index d09882a..f849ff7 100644 --- a/Exercises/1-pipe.js +++ b/Exercises/1-pipe.js @@ -1,5 +1,9 @@ 'use strict'; -const pipe = (...fns) => x => null; +const pipe = (...fns) => { + const isValid = fns.every(fn => typeof fn === 'function'); + if (!isValid) throw new Error('invalid args'); + return x => fns.reduce((res, fn) => fn(res), x); +}; module.exports = { pipe }; diff --git a/Exercises/2-compose.js b/Exercises/2-compose.js index 368e521..24a317c 100644 --- a/Exercises/2-compose.js +++ b/Exercises/2-compose.js @@ -1,5 +1,25 @@ 'use strict'; -const compose = (...fns) => x => null; +const compose = (...fns) => { + const events = new Map(); + const outputFn = x => + fns.reduceRight((arg, fn, i, arr) => { + try { + return fn(arg); + } catch (e) { + arr.length = 0; + return outputFn.emit('error', e); + } + }, x); + outputFn.emit = (event, ...args) => { + const handlers = events.get(event); + if (handlers) handlers.forEach(fn => fn(...args)); + }; + outputFn.on = (event, handler) => { + const existsEvent = events.get(event); + existsEvent ? existsEvent.push(handler) : events.set(event, [handler]); + }; + return outputFn; +}; module.exports = { compose };