-
Notifications
You must be signed in to change notification settings - Fork 158
/
_.js
159 lines (128 loc) · 3.09 KB
/
_.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
function _curry(fn) {
return function(a, b) {
return arguments.length == 2 ? fn(a, b) : function(b) { return fn(a, b); };
}
}
function _curryr(fn) {
return function(a, b) {
return arguments.length == 2 ? fn(a, b) : function(b) { return fn(b, a); };
}
}
var _get = _curryr(function(obj, key) {
return obj == null ? undefined : obj[key];
});
function _filter(list, predi) {
var new_list = [];
_each(list, function(val) {
if (predi(val)) new_list.push(val);
});
return new_list;
}
function _map(list, mapper) {
var new_list = [];
_each(list, function(val, key) {
new_list.push(mapper(val, key));
});
return new_list;
}
function _is_object(obj) {
return typeof obj == 'object' && !!obj;
}
function _keys(obj) {
return _is_object(obj) ? Object.keys(obj) : [];
}
var _length = _get('length');
function _each(list, iter) {
var keys = _keys(list);
for (var i = 0, len = keys.length; i < len; i++) {
iter(list[keys[i]], keys[i]);
}
return list;
}
var _map = _curryr(_map),
_each = _curryr(_each),
_filter = _curryr(_filter);
var _pairs = _map(function (val, key) { return [key, val]; });
var slice = Array.prototype.slice;
function _rest(list, num) {
return slice.call(list, num || 1);
}
function _reduce(list, iter, memo) {
if (arguments.length == 2) {
memo = list[0];
list = _rest(list);
}
_each(list, function(val) {
memo = iter(memo, val);
});
return memo;
}
function _pipe() {
var fns = arguments;
return function(arg) {
return _reduce(fns, function(arg, fn) {
return fn(arg);
}, arg);
}
}
function _go(arg) {
var fns = _rest(arguments);
return _pipe.apply(null, fns)(arg);
}
var _values = _map(_identity);
function _identity(val) {
return val;
}
var _pluck = _curryr(function(data, key) {
return _map(data, _get(key));
});
function _negate(func) {
return function(val) {
return !func(val);
}
}
var _reject = _curryr(function(data, predi) {
return _filter(data, _negate(predi));
});
var _compact = _filter(_identity);
var _find = _curryr(function(list, predi) {
var keys = _keys(list);
for (var i = 0, len = keys.length; i < len; i++) {
var val = list[keys[i]];
if (predi(val)) return val;
}
});
var _find_index = _curryr(function(list, predi) {
var keys = _keys(list);
for (var i = 0, len = keys.length; i < len; i++) {
if (predi(list[keys[i]])) return i;
}
return -1;
});
function _some(data, predi) {
return _find_index(data, predi || _identity) != -1;
}
function _every(data, predi) {
return _find_index(data, _negate(predi || _identity)) == -1;
}
function _push(obj, key, val) {
(obj[key] = obj[key] || []).push(val);
return obj;
}
var _group_by = _curryr(function(data, iter) {
return _reduce(data, function(grouped, val) {
return _push(grouped, iter(val), val);
}, {});
});
var _inc = function(count, key) {
count[key] ? count[key]++ : count[key] = 1;
return count;
};
var _count_by = _curryr(function(data, iter) {
return _reduce(data, function(count, val) {
return _inc(count, iter(val));
}, {});
});
var _head = function(list) {
return list[0];
};