-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path2-compose.js
41 lines (40 loc) · 1.21 KB
/
2-compose.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
'use strict';
/*
2. Реализуйте композицию функций справа налево (без использования рекурсии),
которая будет подавлять ошибки, если композируемые функции будут их бросать,
то, исполнение функции завершается с `undefined`, а на ошибки можно будет
подписаться через `f.on('error', e => { ... });`.
*/
const compose = (...fns) => {
const handlers = [];
const composed = (x) => {
let value = x;
try {
for (let i = fns.length - 1; i >= 0; i--) {
value = fns[i](value);
}
} catch (err) {
for (const handler of handlers) {
handler(err);
}
return null;
}
return value;
};
composed.on = (name, handler) => {
if (name === 'error') handlers.push(handler);
};
return composed;
};
/*
const inc = (x) => ++x;
const twice = (x) => x * 2;
const cube = (x) => x ** 3;
let comp = compose(inc, twice, cube);
console.log(comp(5)); //251
comp = compose(inc, inc);
console.log(comp(7)); //9
comp = compose(inc, 7, cube);
console.log(comp(7)); //null
*/
module.exports = { compose };