-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathOps.js
72 lines (51 loc) · 1.88 KB
/
Ops.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/**
* @file 蜡烛图Ops函数
* @author liuliang<[email protected]>
*/
let sum = (xs) => xs.reduce((a, b) => a + b, 0);
let min = (xs) => xs.reduce((a, b) => Math.min(a, b));
let max = (xs) => xs.reduce((a, b) => Math.max(a, b));
let minOrMax = (xs, comparator = (a, b) => a - b) => xs.reduce(function (a, b) {
return comparator(a, b) >= 0 ? b : a;
});
let sumBy = (xs, f) => xs.reduce((a, b) => a + f(b), 0);
let minBy = (xs, f) => xs.reduce((a, b) => Math.min(a, f(b)), Infinity);
let maxBy = (xs, f) => xs.reduce((a, b) => Math.max(a, f(b)), -Infinity);
let plus = ([a, b], [c, d]) => [a + c, b + d];
let minus = ([a, b], [c, d]) => [a - c, b - d];
let times = (k, [a, b]) => [k * a, k * b];
let length = ([a, b]) => Math.sqrt(a * a + b * b);
let sumVectors = (xs) => xs.reduce(plus, [0, 0]);
let average = (points) => times((1 / points.length), points.reduce(plus));
let onCircle = (r, angle) => times(r, [Math.sin(angle), -Math.cos(angle)]);
let enhance = (compute = {}, curve) => {
for (let [key, val] of Object.entries(compute)) {
curve[key] = val(curve.index, curve.item, curve.group);
}
return curve;
};
let range = (a, b, inclusive) => {
let result = [];
for (let i = a; i < b; i++) {
result.push(i);
}
if (inclusive) {
result.push(b);
}
return result;
};
let mapObject = (obj, f) => {
let result = [];
for (let k of Object.keys(obj)) {
let v = obj[k];
result.push(f(k, v));
}
return result;
};
let pairs = (obj) =>
mapObject(obj, (k, v) => [k, v]);
let id = (x) => x;
export {sum, min, max, minOrMax, sumBy, minBy, maxBy, plus, minus, times, id,
length, sumVectors, average, onCircle, enhance, range, mapObject, pairs};
export default {sum, min, max, minOrMax, sumBy, minBy, maxBy, plus, minus, times, id,
length, sumVectors, average, onCircle, enhance, range, mapObject, pairs};