-
Notifications
You must be signed in to change notification settings - Fork 0
/
compose.js
48 lines (34 loc) · 1.21 KB
/
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
42
43
44
45
46
47
48
((module) => {
'use strict';
var chainFunction = require('./chain-function.js');
var compose = module.exports = (frontend, ...backend) =>
compose.mkargs(frontend, chainFunction(...backend));
compose.serial = (fn, ...fnlist) =>
fnlist.length ? compose(fn, compose.serial(...fnlist)) : fn;
compose.serial.tree = (...fntree) =>
compose.serial(
...fntree.map(
(fntree) =>
typeof fntree === 'function' ? fntree : compose.serial.tree(...fntree)
)
);
compose.mkargs = (frontend, backend) =>
(...args) => frontend(...backend(...args));
compose.mkargs.serial = (fn, ...fnlist) =>
fnlist.length ? compose.mkargs(fn, compose.mkargs.serial(...fnlist)) : fn;
compose.mkargs.each = (fn, process) =>
compose.mkargs(fn, (...args) => args.map(process));
compose.mkargs.reverse = (fn) =>
compose.mkargs(fn, REVERSE_ARGUMENTS);
const REVERSE_ARGUMENTS = (...args) => args.reverse();
compose.if = (check, iftrue, iffalse) => {
if (typeof iffalse !== 'function') {
iffalse = DONOTHING;
}
return (...args) =>
(check(...args) ? iftrue : iffalse)(...args);
}
const DONOTHING = () => {};
compose.if.not = (check, ...args) =>
compose.if((...args) => !check(...args), ...args);
})(module);