1 |
|
2 | "use strict";
|
3 |
|
4 | var isArray = Array.isArray;
|
5 | function isObject(o) {
|
6 |
|
7 | return new Object(o) === o;
|
8 |
|
9 | }
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 |
|
25 | function isEqual(a, b) {
|
26 | var i;
|
27 |
|
28 | if (a === b) {
|
29 | return true;
|
30 | } else if (isArray(a) && isArray(b) && a.length === b.length) {
|
31 | for (i = 0; i < a.length; i++) {
|
32 | if (!isEqual(a[i], b[i])) {
|
33 | return false;
|
34 | }
|
35 | }
|
36 | return true;
|
37 | } else if (isObject(a) && isObject(b) && !isArray(a) && !isArray(b)) {
|
38 | var akeys = Object.keys(a);
|
39 | var bkeys = Object.keys(b);
|
40 | if (!isEqual(akeys, bkeys)) {
|
41 | return false;
|
42 | }
|
43 |
|
44 | for (i = 0; i < akeys.length; i++) {
|
45 | if (!isEqual(a[akeys[i]], b[akeys[i]])) {
|
46 | return false;
|
47 | }
|
48 | }
|
49 | return true;
|
50 | }
|
51 |
|
52 | return false;
|
53 | }
|
54 |
|
55 |
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 | function isApproxEqual(x, y, opts) {
|
68 | opts = opts || {};
|
69 | var fnEqual = opts.fnEqual === false ? false : true;
|
70 | var depth = opts.depth || 5;
|
71 |
|
72 |
|
73 | var state = [];
|
74 |
|
75 | function loop(a, b, n) {
|
76 |
|
77 | if (a === b) {
|
78 | return true;
|
79 | }
|
80 |
|
81 |
|
82 | if (n >= depth) {
|
83 | return true;
|
84 | }
|
85 |
|
86 | var i;
|
87 |
|
88 |
|
89 | for (i = 0; i < state.length; i++) {
|
90 | if (state[i][0] === a && state[i][1] === b) {
|
91 | return true;
|
92 | }
|
93 | }
|
94 |
|
95 |
|
96 | state.push([a, b]);
|
97 |
|
98 | if (typeof a === "function" && typeof b === "function") {
|
99 | return fnEqual;
|
100 | }
|
101 |
|
102 | if (isArray(a) && isArray(b) && a.length === b.length) {
|
103 | for (i = 0; i < a.length; i++) {
|
104 | if (!loop(a[i], b[i], n + 1)) {
|
105 | return false;
|
106 | }
|
107 | }
|
108 | return true;
|
109 | } else if (isObject(a) && isObject(b) && !isArray(a) && !isArray(b)) {
|
110 | var akeys = Object.keys(a);
|
111 | var bkeys = Object.keys(b);
|
112 | if (!loop(akeys, bkeys, n + 1)) {
|
113 | return false;
|
114 | }
|
115 |
|
116 | for (i = 0; i < akeys.length; i++) {
|
117 | if (!loop(a[akeys[i]], b[akeys[i]], n + 1)) {
|
118 | return false;
|
119 | }
|
120 | }
|
121 | return true;
|
122 | }
|
123 |
|
124 | return false;
|
125 | }
|
126 | return loop(x, y, 0);
|
127 | }
|
128 |
|
129 | function identity(x) {
|
130 | return x;
|
131 | }
|
132 |
|
133 | function pluck(arr, key) {
|
134 | return arr.map(function (e) {
|
135 | return e[key];
|
136 | });
|
137 | }
|
138 |
|
139 |
|
140 |
|
141 |
|
142 |
|
143 |
|
144 | function force(arb) {
|
145 | return (typeof arb === "function") ? arb() : arb;
|
146 | }
|
147 |
|
148 |
|
149 |
|
150 |
|
151 |
|
152 |
|
153 | function merge() {
|
154 | var res = {};
|
155 |
|
156 | for (var i = 0; i < arguments.length; i++) {
|
157 | var arg = arguments[i];
|
158 | var keys = Object.keys(arg);
|
159 | for (var j = 0; j < keys.length; j++) {
|
160 | var key = keys[j];
|
161 | res[key] = arg[key];
|
162 | }
|
163 | }
|
164 |
|
165 | return res;
|
166 | }
|
167 |
|
168 | function div2(x) {
|
169 | return Math.floor(x / 2);
|
170 | }
|
171 |
|
172 | function log2(x) {
|
173 | return Math.log(x) / Math.log(2);
|
174 | }
|
175 |
|
176 | function ilog2(x) {
|
177 | return x <= 0 ? 0 : Math.floor(log2(x));
|
178 | }
|
179 |
|
180 | function curriedN(n) {
|
181 | var n1 = n - 1;
|
182 | return function curriedNInstance(result, args) {
|
183 | if (args.length === n) {
|
184 | return result(args[n1]);
|
185 | } else {
|
186 | return result;
|
187 | }
|
188 | };
|
189 | }
|
190 |
|
191 | var curried2 = curriedN(2);
|
192 | var curried3 = curriedN(3);
|
193 |
|
194 | function charArrayToString(arr) {
|
195 | return arr.join("");
|
196 | }
|
197 |
|
198 | function stringToCharArray(str) {
|
199 | return str.split("");
|
200 | }
|
201 |
|
202 | function pairArrayToDict(arrayOfPairs) {
|
203 | var res = {};
|
204 | arrayOfPairs.forEach(function (p) {
|
205 | res[p[0]] = p[1];
|
206 | });
|
207 | return res;
|
208 | }
|
209 |
|
210 | function dictToPairArray(m) {
|
211 | var res = [];
|
212 | Object.keys(m).forEach(function (k) {
|
213 | res.push([k, m[k]]);
|
214 | });
|
215 | return res;
|
216 | }
|
217 |
|
218 | module.exports = {
|
219 | isArray: isArray,
|
220 | isObject: isObject,
|
221 | isEqual: isEqual,
|
222 | isApproxEqual: isApproxEqual,
|
223 | identity: identity,
|
224 | pluck: pluck,
|
225 | force: force,
|
226 | merge: merge,
|
227 | div2: div2,
|
228 | ilog2: ilog2,
|
229 | curried2: curried2,
|
230 | curried3: curried3,
|
231 | charArrayToString: charArrayToString,
|
232 | stringToCharArray: stringToCharArray,
|
233 | pairArrayToDict: pairArrayToDict,
|
234 | dictToPairArray: dictToPairArray,
|
235 | };
|