-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathoperators.js
26 lines (25 loc) · 1.04 KB
/
operators.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
const deepEq = require("./util/deep-equal");
const { func, num, bool, arr, nonZero } = require("./lib/types");
// NOTE: Does type checking also while partially applied
module.exports = {
"+": r => num(r) && (l => num(l) + r),
"-": r => num(r) && (l => num(l) - r),
"/": r => nonZero(r) && (l => num(l) / r),
"%": r => nonZero(r) && (l => num(l) % r),
"*": r => num(r) && (l => num(l) * r),
"**": r => num(r) && (l => Math.pow(num(l), r)),
"::": r => arr(r) && (l => [l, ...r]),
"@": r => arr(r) && (l => [...arr(l), ...r]),
"<=": r => num(r) && (l => num(l) <= r),
">=": r => num(r) && (l => num(l) >= r),
"<": r => num(r) && (l => num(l) < r),
">": r => num(r) && (l => num(l) > r),
"==": r => l => deepEq(l, r),
"!=": r => l => !deepEq(l, r),
"||": r => bool(r) && (l => bool(l) || r),
"&&": r => bool(r) && (l => bool(l) && r),
"|>": r => func(r) && (l => r(l)),
"<|": r => l => func(l)(r),
">>": r => func(r) && (l => (...args) => r(func(l)(...args))),
"<<": r => func(r) && (l => (...args) => func(l)(r(...args)))
};