From 563435c6cd1158dfd0a3cc867e881d33bea3d8b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A7=D1=83=D0=B1=D0=BA=D0=BE=20=D0=9C=D0=B8=D1=85=D0=B0?= =?UTF-8?q?=D0=B9=D0=BB=D0=BE?= Date: Sun, 3 Dec 2023 22:51:40 +0200 Subject: [PATCH] Ik-12 Chubko All labworks from 1 to 2 --- Exercises/1-pipe.js | 12 +++++++++++- Exercises/2-compose.js | 28 +++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/Exercises/1-pipe.js b/Exercises/1-pipe.js index 14e8909..f084ad4 100644 --- a/Exercises/1-pipe.js +++ b/Exercises/1-pipe.js @@ -1,5 +1,15 @@ 'use strict'; -const pipe = (...fns) => (x) => null; +const pipe = (...fns) => x => { + + for (const fn of fns) { + if (typeof fn !== 'function') { + throw new Error('All arguments must be functions'); + } + } + + + return fns.reduce((v, fn) => fn(v), x); + }; module.exports = { pipe }; diff --git a/Exercises/2-compose.js b/Exercises/2-compose.js index 8f8b77b..23f5cef 100644 --- a/Exercises/2-compose.js +++ b/Exercises/2-compose.js @@ -1,5 +1,31 @@ 'use strict'; -const compose = (...fns) => (x) => null; +const compose = (...fns) => { + const eventHandlers = {}; + const composedFn = (x) => { + if (fns.length === 0) return x; + let result = x; + try { + for (let i = fns.length - 1; i >= 0; i--) { + result = fns[i](result); + } + } catch (error) { + if (eventHandlers.error) { + eventHandlers.error.forEach(handler => handler(error)); + } + return undefined; + } + return result; + }; + + composedFn.on = (eventType, handler) => { + if (!eventHandlers[eventType]) { + eventHandlers[eventType] = []; + } + eventHandlers[eventType].push(handler); + }; + + return composedFn; +}; module.exports = { compose };