-
Notifications
You must be signed in to change notification settings - Fork 31
Expand file tree
/
Copy pathutil.js
More file actions
85 lines (78 loc) · 1.8 KB
/
util.js
File metadata and controls
85 lines (78 loc) · 1.8 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
const map = callback => {
return function* (iter) {
for (const item of iter) {
yield callback(item);
}
};
};
const filter = callback => {
return function* (iter) {
for (const item of iter) {
if (callback(item)) yield item;
}
};
};
const take = n => {
return function* (iter) {
let i = 0;
for (const item of iter) {
if (i >= n) return;
yield item;
i += 1;
}
};
};
const pipe =
(...fns) =>
iter =>
fns.reduce((result, fn) => fn(result), iter);
const _groupBy = (iter, fn) => {
const result = {};
if (!iter[Symbol.iterator]) {
iter[Symbol.iterator] = function* () {
for (const key of Object.keys(iter)) yield iter[key];
};
}
for (const item of iter) {
const key = fn(item);
const values = result[key];
result[key] = values ? [...values, item] : [item];
}
return result;
};
const shallowEqual = (a, b) => {
for (const key of Object.keys(a)) {
if (a[key] !== b[key]) return false;
}
return true;
};
const unique = (arr, callback, isSorted) => {
const uniqueSet = new Set([]);
const newArr = [...arr];
uniqueSet.add(newArr.shift());
for (const item of newArr) {
const transformed = callback ? callback(item) : item;
const isObject = transformed !== null && typeof transformed === 'object';
if (isObject) {
let included = false;
for (const value of uniqueSet.values()) {
if (shallowEqual(value, transformed)) included = true;
}
if (!included) uniqueSet.add(transformed);
} else {
if (!uniqueSet.has(transformed)) uniqueSet.add(transformed);
}
}
const result = Array.from(uniqueSet);
if (isSorted === false) result.sort((a, b) => a - b);
return result;
};
module.exports = {
map,
filter,
take,
pipe,
_groupBy,
unique,
shallowEqual,
};