occam-nominal 1.0.347 → 1.0.349

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,6 +15,9 @@ _export(exports, {
15
15
  get backwardsEvery () {
16
16
  return backwardsEvery;
17
17
  },
18
+ get backwardsForEach () {
19
+ return backwardsForEach;
20
+ },
18
21
  get each () {
19
22
  return each;
20
23
  },
@@ -36,6 +39,9 @@ _export(exports, {
36
39
  get forwardsEvery () {
37
40
  return forwardsEvery;
38
41
  },
42
+ get forwardsForEach () {
43
+ return forwardsForEach;
44
+ },
39
45
  get match () {
40
46
  return match;
41
47
  },
@@ -53,15 +59,13 @@ _export(exports, {
53
59
  }
54
60
  });
55
61
  const _necessary = require("necessary");
56
- const _occamlanguages = require("occam-languages");
57
- const { forEach: asynchronousForEach, forwardsForEach: asynchronousForwardsForEach, backwardsForEach: asynchronousBackwardsForEach } = _necessary.asynchronousUtilities;
58
- const { match, filter, reduce, forEach, resolve } = _occamlanguages.continuationUtilities;
62
+ const { filter: arrayFilter } = _necessary.arrayUtilities, { forEach: asynchronousForEach, forwardsForEach: asynchronousForwardsForEach, backwardsForEach: asynchronousBackwardsForEach } = _necessary.asynchronousUtilities;
59
63
  function one(array, callback, ...callerArguments) {
60
64
  let success = false;
61
65
  const continuation = callerArguments.pop();
62
66
  let context = callerArguments.pop();
63
67
  const callerContext = context; ///
64
- asynchronousForEach(array, (element, next, done)=>{
68
+ return asynchronousForEach(array, (element, next, done)=>{
65
69
  return callback(element, ...callerArguments, callerContext, (...callbackArguments)=>{
66
70
  const passed = callbackArguments.shift();
67
71
  if (passed) {
@@ -86,7 +90,7 @@ function some(array, callback, ...callerArguments) {
86
90
  const continuation = callerArguments.pop();
87
91
  let context = callerArguments.pop();
88
92
  const callerContext = context; ///
89
- asynchronousForEach(array, (element, next, done)=>{
93
+ return asynchronousForEach(array, (element, next, done)=>{
90
94
  return callback(element, ...callerArguments, callerContext, (...callbackArguments)=>{
91
95
  success = callbackArguments.shift();
92
96
  if (success) {
@@ -105,7 +109,7 @@ function each(array, callback, ...callerArguments) {
105
109
  const continuation = callerArguments.pop();
106
110
  let context = callerArguments.pop();
107
111
  const callerContext = context; ///
108
- asynchronousForEach(array, (element, next, done)=>{
112
+ return asynchronousForEach(array, (element, next, done)=>{
109
113
  return callback(element, ...callerArguments, context, (...callbackArguments)=>{
110
114
  success = callbackArguments.shift();
111
115
  if (!success) {
@@ -125,7 +129,7 @@ function every(array, callback, ...callerArguments) {
125
129
  const continuation = callerArguments.pop();
126
130
  let context = callerArguments.pop();
127
131
  const callerContext = context; ///
128
- asynchronousForEach(array, (element, next, done)=>{
132
+ return asynchronousForEach(array, (element, next, done)=>{
129
133
  return callback(element, ...callerArguments, context, (...callbackArguments)=>{
130
134
  success = callbackArguments.shift();
131
135
  if (!success) {
@@ -140,25 +144,30 @@ function every(array, callback, ...callerArguments) {
140
144
  return continuation(success, context);
141
145
  });
142
146
  }
143
- function extract(array, callback, ...callerArguments) {
144
- let deletedElement = undefined; ///
145
- const continuation = callerArguments.pop(), context = callerArguments.pop();
146
- let index = -1;
147
- return some(array, (element, ...calleeArguments)=>{
148
- index++;
149
- const continuation = calleeArguments.pop();
150
- let context = calleeArguments.pop();
151
- return callback(element, ...calleeArguments, context, (...callbackArguments)=>{
152
- const success = callbackArguments.shift();
153
- if (success) {
154
- const start = index, deleteCount = 1;
155
- deletedElement = array.splice(start, deleteCount).pop(); ///
156
- context = callbackArguments.shift();
157
- }
158
- return continuation(success, context);
147
+ function reduce(array, initialValue, callback, ...callerArguments) {
148
+ let value = initialValue; ///
149
+ const continuation = callerArguments.pop();
150
+ let context = callerArguments.pop();
151
+ return asynchronousForEach(array, (element, next, done)=>{
152
+ return callback(value, element, ...callerArguments, context, (...callbackArguments)=>{
153
+ value = callbackArguments.shift();
154
+ context = callbackArguments.shift();
155
+ next();
159
156
  });
160
- }, ...callerArguments, context, (success, context)=>{
161
- return continuation(deletedElement, context);
157
+ }, ()=>{
158
+ return continuation(value, context);
159
+ });
160
+ }
161
+ function forEach(array, callback, ...callerArguments) {
162
+ const continuation = callerArguments.pop();
163
+ let context = callerArguments.pop();
164
+ return asynchronousForEach(array, (element, next, done)=>{
165
+ return callback(element, ...callerArguments, context, (...callbackArguments)=>{
166
+ context = callbackArguments.shift();
167
+ next();
168
+ });
169
+ }, ()=>{
170
+ return continuation(context);
162
171
  });
163
172
  }
164
173
  function forwardsEvery(array, callback, ...callerArguments) {
@@ -166,7 +175,7 @@ function forwardsEvery(array, callback, ...callerArguments) {
166
175
  const continuation = callerArguments.pop();
167
176
  let context = callerArguments.pop();
168
177
  const callerContext = context; ///
169
- asynchronousForwardsForEach(array, (element, next, done)=>{
178
+ return asynchronousForwardsForEach(array, (element, next, done)=>{
170
179
  return callback(element, ...callerArguments, context, (...callbackArguments)=>{
171
180
  success = callbackArguments.shift();
172
181
  if (!success) {
@@ -186,7 +195,7 @@ function backwardsEvery(array, callback, ...callerArguments) {
186
195
  const continuation = callerArguments.pop();
187
196
  let context = callerArguments.pop();
188
197
  const callerContext = context; ///
189
- asynchronousBackwardsForEach(array, (element, next, done)=>{
198
+ return asynchronousBackwardsForEach(array, (element, next, done)=>{
190
199
  return callback(element, ...callerArguments, context, (...callbackArguments)=>{
191
200
  success = callbackArguments.shift();
192
201
  if (!success) {
@@ -201,6 +210,142 @@ function backwardsEvery(array, callback, ...callerArguments) {
201
210
  return continuation(success, context);
202
211
  });
203
212
  }
213
+ function forwardsForEach(array, callback, ...callerArguments) {
214
+ const continuation = callerArguments.pop();
215
+ let context = callerArguments.pop();
216
+ return asynchronousForwardsForEach(array, (element, next, done)=>{
217
+ return callback(element, ...callerArguments, context, (...callbackArguments)=>{
218
+ context = callbackArguments.shift();
219
+ next();
220
+ });
221
+ }, ()=>{
222
+ return continuation(context);
223
+ });
224
+ }
225
+ function backwardsForEach(array, callback, ...callerArguments) {
226
+ const continuation = callerArguments.pop();
227
+ let context = callerArguments.pop();
228
+ return asynchronousBackwardsForEach(array, (element, next, done)=>{
229
+ return callback(element, ...callerArguments, context, (...callbackArguments)=>{
230
+ context = callbackArguments.shift();
231
+ next();
232
+ });
233
+ }, ()=>{
234
+ return continuation(context);
235
+ });
236
+ }
237
+ function match(arrayA, arrayB, callback, ...callerArguments) {
238
+ const continuation = callerArguments.pop(), context = callerArguments.pop();
239
+ const arrayALength = arrayA.length, arrayBLength = arrayB.length;
240
+ if (arrayALength !== arrayBLength) {
241
+ const matches = false;
242
+ return continuation(matches, context);
243
+ }
244
+ let index = -1;
245
+ return every(arrayA, (elementA, ...calleeArguments)=>{
246
+ index++;
247
+ const elementB = arrayB[index];
248
+ const continuation = calleeArguments.pop();
249
+ let context = calleeArguments.pop();
250
+ return callback(elementA, elementB, ...calleeArguments, context, (...callbackArguments)=>{
251
+ const success = callbackArguments.shift();
252
+ context = callbackArguments.shift();
253
+ return continuation(success, context);
254
+ });
255
+ }, ...callerArguments, context, (success, context)=>{
256
+ const matches = success; ///
257
+ return continuation(matches, context);
258
+ });
259
+ }
260
+ function filter(array, callback, ...callerArguments) {
261
+ const deletedElements = [];
262
+ const continuation = callerArguments.pop(), context = callerArguments.pop();
263
+ let index = array.length;
264
+ return backwardsForEach(array, (element, ...calleeArguments)=>{
265
+ index--;
266
+ const continuation = calleeArguments.pop();
267
+ let context = calleeArguments.pop();
268
+ return callback(element, ...calleeArguments, context, (...callbackArguments)=>{
269
+ const success = callbackArguments.shift();
270
+ if (!success) {
271
+ const start = index, deleteCount = 1, deletedElement = array.splice(start, deleteCount).pop(); ///
272
+ deletedElements.unshift(deletedElement); ///
273
+ }
274
+ context = callbackArguments.shift();
275
+ return continuation(context);
276
+ });
277
+ }, ...callerArguments, context, (context)=>{
278
+ return continuation(deletedElements, context);
279
+ });
280
+ }
281
+ function extract(array, callback, ...callerArguments) {
282
+ let deletedElement = undefined; ///
283
+ const continuation = callerArguments.pop(), context = callerArguments.pop();
284
+ let index = -1;
285
+ return some(array, (element, ...calleeArguments)=>{
286
+ index++;
287
+ const continuation = calleeArguments.pop();
288
+ let context = calleeArguments.pop();
289
+ return callback(element, ...calleeArguments, context, (...callbackArguments)=>{
290
+ const success = callbackArguments.shift();
291
+ if (success) {
292
+ const start = index, deleteCount = 1;
293
+ deletedElement = array.splice(start, deleteCount).pop(); ///
294
+ context = callbackArguments.shift();
295
+ }
296
+ return continuation(success, context);
297
+ });
298
+ }, ...callerArguments, context, (success, context)=>{
299
+ return continuation(deletedElement, context);
300
+ });
301
+ }
302
+ function resolve(arrayA, arrayB, callback, ...callerArguments) {
303
+ arrayA = [
304
+ ...arrayA
305
+ ];
306
+ const continuation = callerArguments.pop();
307
+ let context = callerArguments.pop();
308
+ function nextPass() {
309
+ const arrayALength = arrayA.length;
310
+ if (arrayALength === 0) {
311
+ const success = true; ///
312
+ return continuation(success, context);
313
+ }
314
+ let success = false;
315
+ let count = -1;
316
+ function nextElement() {
317
+ count++;
318
+ const terminate = count === arrayALength;
319
+ if (terminate) {
320
+ if (!success) {
321
+ const success = false; ///
322
+ return continuation(success, context);
323
+ }
324
+ arrayFilter(arrayA, (elementA)=>{
325
+ const arrayBIncludesElementA = arrayB.includes(elementA);
326
+ if (!arrayBIncludesElementA) {
327
+ return true;
328
+ }
329
+ });
330
+ nextPass();
331
+ } else {
332
+ const index = count, elementA = arrayA[index];
333
+ return callback(elementA, ...callerArguments, context, (...callbackArguments)=>{
334
+ const passed = callbackArguments.shift();
335
+ context = callbackArguments.shift();
336
+ if (passed) {
337
+ const elementB = elementA; ///
338
+ arrayB.push(elementB);
339
+ success = true;
340
+ }
341
+ nextElement();
342
+ });
343
+ }
344
+ }
345
+ nextElement();
346
+ }
347
+ nextPass();
348
+ }
204
349
  function all(callbacks, ...callerArguemnts) {
205
350
  return every(callbacks, (callback, ...callbackArguments)=>{
206
351
  return callback(...callbackArguments);
@@ -212,4 +357,4 @@ function exists(callbacks, ...callerArguemnts) {
212
357
  }, ...callerArguemnts);
213
358
  }
214
359
 
215
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhc3luY2hyb25vdXNVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5pbXBvcnQgeyBjb250aW51YXRpb25VdGlsaXRpZXMgfSBmcm9tIFwib2NjYW0tbGFuZ3VhZ2VzXCI7XG5cbmNvbnN0IHsgZm9yRWFjaDogYXN5bmNocm9ub3VzRm9yRWFjaCxcbiAgICAgICAgZm9yd2FyZHNGb3JFYWNoOiBhc3luY2hyb25vdXNGb3J3YXJkc0ZvckVhY2gsXG4gICAgICAgIGJhY2t3YXJkc0ZvckVhY2g6IGFzeW5jaHJvbm91c0JhY2t3YXJkc0ZvckVhY2ggfSA9IGFzeW5jaHJvbm91c1V0aWxpdGllcztcblxuZXhwb3J0IGNvbnN0IHsgbWF0Y2gsIGZpbHRlciwgcmVkdWNlLCBmb3JFYWNoLCByZXNvbHZlIH0gPSBjb250aW51YXRpb25VdGlsaXRpZXM7XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmUoYXJyYXksIGNhbGxiYWNrLCAuLi5jYWxsZXJBcmd1bWVudHMpIHtcbiAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgY29uc3QgY2FsbGVyQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICBhc3luY2hyb25vdXNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5jYWxsZXJBcmd1bWVudHMsIGNhbGxlckNvbnRleHQsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgY29uc3QgcGFzc2VkID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTtcblxuICAgICAgICAgIGNvbnRleHQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnRleHQgPSBjYWxsZXJDb250ZXh0OyAgLy8vXG5cbiAgICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCBjb250ZXh0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb21lKGFycmF5LCBjYWxsYmFjaywgLi4uY2FsbGVyQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBjb250ZXh0ID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGNvbnN0IGNhbGxlckNvbnRleHQgPSBjb250ZXh0OyAgLy8vXG5cbiAgYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uY2FsbGVyQXJndW1lbnRzLCBjYWxsZXJDb250ZXh0LCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIHN1Y2Nlc3MgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICBjb250ZXh0ID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5jYWxsZXJBcmd1bWVudHMpIHtcbiAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgY29uc3QgY2FsbGVyQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICBhc3luY2hyb25vdXNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5jYWxsZXJBcmd1bWVudHMsIGNvbnRleHQsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgc3VjY2VzcyA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICBjb250ZXh0ID0gY2FsbGVyQ29udGV4dDsgIC8vL1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uY2FsbGVyQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgY29uc3QgY2FsbGVyQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICBhc3luY2hyb25vdXNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5jYWxsZXJBcmd1bWVudHMsIGNvbnRleHQsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgc3VjY2VzcyA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICBjb250ZXh0ID0gY2FsbGVyQ29udGV4dDsgIC8vL1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3QoYXJyYXksIGNhbGxiYWNrLCAuLi5jYWxsZXJBcmd1bWVudHMpIHtcbiAgbGV0IGRlbGV0ZWRFbGVtZW50ID0gdW5kZWZpbmVkOyAvLy9cblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCksXG4gICAgICAgIGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGluZGV4ID0gLTE7XG5cbiAgcmV0dXJuIHNvbWUoYXJyYXksIChlbGVtZW50LCAuLi5jYWxsZWVBcmd1bWVudHMpID0+IHtcbiAgICBpbmRleCsrO1xuXG4gICAgY29uc3QgY29udGludWF0aW9uID0gY2FsbGVlQXJndW1lbnRzLnBvcCgpO1xuXG4gICAgbGV0IGNvbnRleHQgPSBjYWxsZWVBcmd1bWVudHMucG9wKCk7XG5cbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uY2FsbGVlQXJndW1lbnRzLCBjb250ZXh0LCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4LCAgLy8vXG4gICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMTtcblxuICAgICAgICBkZWxldGVkRWxlbWVudCA9IGFycmF5LnNwbGljZShzdGFydCwgZGVsZXRlQ291bnQpLnBvcCgpIC8vL1xuXG4gICAgICAgIGNvbnRleHQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICAgIH0pO1xuICB9LCAuLi5jYWxsZXJBcmd1bWVudHMsIGNvbnRleHQsIChzdWNjZXNzLCBjb250ZXh0KSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihkZWxldGVkRWxlbWVudCwgY29udGV4dCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yd2FyZHNFdmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmNhbGxlckFyZ3VtZW50cykge1xuICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBjb250ZXh0ID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGNvbnN0IGNhbGxlckNvbnRleHQgPSBjb250ZXh0OyAgLy8vXG5cbiAgYXN5bmNocm9ub3VzRm9yd2FyZHNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5jYWxsZXJBcmd1bWVudHMsIGNvbnRleHQsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgc3VjY2VzcyA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICBjb250ZXh0ID0gY2FsbGVyQ29udGV4dDsgIC8vL1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uY2FsbGVyQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgY29uc3QgY2FsbGVyQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICBhc3luY2hyb25vdXNCYWNrd2FyZHNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5jYWxsZXJBcmd1bWVudHMsIGNvbnRleHQsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgc3VjY2VzcyA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICBjb250ZXh0ID0gY2FsbGVyQ29udGV4dDsgIC8vL1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFsbChjYWxsYmFja3MsIC4uLmNhbGxlckFyZ3VlbW50cykge1xuICByZXR1cm4gZXZlcnkoY2FsbGJhY2tzLCAoY2FsbGJhY2ssIC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKC4uLmNhbGxiYWNrQXJndW1lbnRzKTtcbiAgfSwgLi4uY2FsbGVyQXJndWVtbnRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4aXN0cyhjYWxsYmFja3MsIC4uLmNhbGxlckFyZ3VlbW50cykge1xuICByZXR1cm4gc29tZShjYWxsYmFja3MsIChjYWxsYmFjaywgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICB9LCAuLi5jYWxsZXJBcmd1ZW1udHMpO1xufVxuIl0sIm5hbWVzIjpbImFsbCIsImJhY2t3YXJkc0V2ZXJ5IiwiZWFjaCIsImV2ZXJ5IiwiZXhpc3RzIiwiZXh0cmFjdCIsImZpbHRlciIsImZvckVhY2giLCJmb3J3YXJkc0V2ZXJ5IiwibWF0Y2giLCJvbmUiLCJyZWR1Y2UiLCJyZXNvbHZlIiwic29tZSIsImFzeW5jaHJvbm91c0ZvckVhY2giLCJmb3J3YXJkc0ZvckVhY2giLCJhc3luY2hyb25vdXNGb3J3YXJkc0ZvckVhY2giLCJiYWNrd2FyZHNGb3JFYWNoIiwiYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaCIsImFzeW5jaHJvbm91c1V0aWxpdGllcyIsImNvbnRpbnVhdGlvblV0aWxpdGllcyIsImFycmF5IiwiY2FsbGJhY2siLCJjYWxsZXJBcmd1bWVudHMiLCJzdWNjZXNzIiwiY29udGludWF0aW9uIiwicG9wIiwiY29udGV4dCIsImNhbGxlckNvbnRleHQiLCJlbGVtZW50IiwibmV4dCIsImRvbmUiLCJjYWxsYmFja0FyZ3VtZW50cyIsInBhc3NlZCIsInNoaWZ0IiwiZGVsZXRlZEVsZW1lbnQiLCJ1bmRlZmluZWQiLCJpbmRleCIsImNhbGxlZUFyZ3VtZW50cyIsInN0YXJ0IiwiZGVsZXRlQ291bnQiLCJzcGxpY2UiLCJjYWxsYmFja3MiLCJjYWxsZXJBcmd1ZW1udHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQXFPZ0JBO2VBQUFBOztRQTlCQUM7ZUFBQUE7O1FBNUhBQztlQUFBQTs7UUE4QkFDO2VBQUFBOztRQWtJQUM7ZUFBQUE7O1FBcEdBQztlQUFBQTs7UUE5SE1DO2VBQUFBOztRQUFnQkM7ZUFBQUE7O1FBZ0t0QkM7ZUFBQUE7O1FBaEtEQztlQUFBQTs7UUFFQ0M7ZUFBQUE7O1FBRmNDO2VBQUFBOztRQUFpQkM7ZUFBQUE7O1FBc0MvQkM7ZUFBQUE7OzsyQkE3Q3NCO2dDQUNBO0FBRXRDLE1BQU0sRUFBRU4sU0FBU08sbUJBQW1CLEVBQzVCQyxpQkFBaUJDLDJCQUEyQixFQUM1Q0Msa0JBQWtCQyw0QkFBNEIsRUFBRSxHQUFHQyxnQ0FBcUI7QUFFekUsTUFBTSxFQUFFVixLQUFLLEVBQUVILE1BQU0sRUFBRUssTUFBTSxFQUFFSixPQUFPLEVBQUVLLE9BQU8sRUFBRSxHQUFHUSxxQ0FBcUI7QUFFekUsU0FBU1YsSUFBSVcsS0FBSyxFQUFFQyxRQUFRLEVBQUUsR0FBR0MsZUFBZTtJQUNyRCxJQUFJQyxVQUFVO0lBRWQsTUFBTUMsZUFBZUYsZ0JBQWdCRyxHQUFHO0lBRXhDLElBQUlDLFVBQVVKLGdCQUFnQkcsR0FBRztJQUVqQyxNQUFNRSxnQkFBZ0JELFNBQVUsR0FBRztJQUVuQ2Isb0JBQW9CTyxPQUFPLENBQUNRLFNBQVNDLE1BQU1DO1FBQ3pDLE9BQU9ULFNBQVNPLFlBQVlOLGlCQUFpQkssZUFBZSxDQUFDLEdBQUdJO1lBQzlELE1BQU1DLFNBQVNELGtCQUFrQkUsS0FBSztZQUV0QyxJQUFJRCxRQUFRO2dCQUNWLElBQUksQ0FBQ1QsU0FBUztvQkFDWkEs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
360
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvY29udGludWF0aW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcywgYXN5bmNocm9ub3VzVXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5jb25zdCB7IGZpbHRlcjogYXJyYXlGaWx0ZXIgfSA9IGFycmF5VXRpbGl0aWVzLFxuICAgICAgeyBmb3JFYWNoOiBhc3luY2hyb25vdXNGb3JFYWNoLFxuICAgICAgICBmb3J3YXJkc0ZvckVhY2g6IGFzeW5jaHJvbm91c0ZvcndhcmRzRm9yRWFjaCxcbiAgICAgICAgYmFja3dhcmRzRm9yRWFjaDogYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaCB9ID0gYXN5bmNocm9ub3VzVXRpbGl0aWVzO1xuXG5leHBvcnQgZnVuY3Rpb24gb25lKGFycmF5LCBjYWxsYmFjaywgLi4uY2FsbGVyQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBjb250ZXh0ID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGNvbnN0IGNhbGxlckNvbnRleHQgPSBjb250ZXh0OyAgLy8vXG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmNhbGxlckFyZ3VtZW50cywgY2FsbGVyQ29udGV4dCwgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb25zdCBwYXNzZWQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xuXG4gICAgICAgICAgY29udGV4dCA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3VjY2VzcyA9IGZhbHNlO1xuXG4gICAgICAgICAgY29udGV4dCA9IGNhbGxlckNvbnRleHQ7ICAvLy9cblxuICAgICAgICAgIGRvbmUoKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvbWUoYXJyYXksIGNhbGxiYWNrLCAuLi5jYWxsZXJBcmd1bWVudHMpIHtcbiAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgY29uc3QgY2FsbGVyQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uY2FsbGVyQXJndW1lbnRzLCBjYWxsZXJDb250ZXh0LCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIHN1Y2Nlc3MgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICBjb250ZXh0ID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5jYWxsZXJBcmd1bWVudHMpIHtcbiAgbGV0IHN1Y2Nlc3MgPSBmYWxzZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgY29uc3QgY2FsbGVyQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uY2FsbGVyQXJndW1lbnRzLCBjb250ZXh0LCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIHN1Y2Nlc3MgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgY29udGV4dCA9IGNhbGxlckNvbnRleHQ7ICAvLy9cblxuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0ID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCBjb250ZXh0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBldmVyeShhcnJheSwgY2FsbGJhY2ssIC4uLmNhbGxlckFyZ3VtZW50cykge1xuICBsZXQgc3VjY2VzcyA9IHRydWU7XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBjb250ZXh0ID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGNvbnN0IGNhbGxlckNvbnRleHQgPSBjb250ZXh0OyAgLy8vXG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmNhbGxlckFyZ3VtZW50cywgY29udGV4dCwgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBzdWNjZXNzID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgIGNvbnRleHQgPSBjYWxsZXJDb250ZXh0OyAgLy8vXG5cbiAgICAgICAgZG9uZSgpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29udGV4dCA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIG5leHQoKTtcbiAgICB9KTtcbiAgfSwgKCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgY29udGV4dCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKGFycmF5LCBpbml0aWFsVmFsdWUsIGNhbGxiYWNrLCAuLi5jYWxsZXJBcmd1bWVudHMpIHtcbiAgbGV0IHZhbHVlID0gaW5pdGlhbFZhbHVlOyAvLy9cblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKHZhbHVlLCBlbGVtZW50LCAuLi5jYWxsZXJBcmd1bWVudHMsIGNvbnRleHQsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgdmFsdWUgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBjb250ZXh0ID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbih2YWx1ZSwgY29udGV4dCk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9yRWFjaChhcnJheSwgY2FsbGJhY2ssIC4uLmNhbGxlckFyZ3VtZW50cykge1xuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgcmV0dXJuIGFzeW5jaHJvbm91c0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmNhbGxlckFyZ3VtZW50cywgY29udGV4dCwgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb250ZXh0ID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb250ZXh0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uY2FsbGVyQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgY29uc3QgY2FsbGVyQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICByZXR1cm4gYXN5bmNocm9ub3VzRm9yd2FyZHNGb3JFYWNoKGFycmF5LCAoZWxlbWVudCwgbmV4dCwgZG9uZSkgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5jYWxsZXJBcmd1bWVudHMsIGNvbnRleHQsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgc3VjY2VzcyA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICBjb250ZXh0ID0gY2FsbGVyQ29udGV4dDsgIC8vL1xuXG4gICAgICAgIGRvbmUoKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhY2t3YXJkc0V2ZXJ5KGFycmF5LCBjYWxsYmFjaywgLi4uY2FsbGVyQXJndW1lbnRzKSB7XG4gIGxldCBzdWNjZXNzID0gdHJ1ZTtcblxuICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgbGV0IGNvbnRleHQgPSBjYWxsZXJBcmd1bWVudHMucG9wKCk7XG5cbiAgY29uc3QgY2FsbGVyQ29udGV4dCA9IGNvbnRleHQ7ICAvLy9cblxuICByZXR1cm4gYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uY2FsbGVyQXJndW1lbnRzLCBjb250ZXh0LCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIHN1Y2Nlc3MgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgY29udGV4dCA9IGNhbGxlckNvbnRleHQ7ICAvLy9cblxuICAgICAgICBkb25lKCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0ID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCBjb250ZXh0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkc0ZvckVhY2goYXJyYXksIGNhbGxiYWNrLCAuLi5jYWxsZXJBcmd1bWVudHMpIHtcbiAgY29uc3QgY29udGludWF0aW9uID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBjb250ZXh0ID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIHJldHVybiBhc3luY2hyb25vdXNGb3J3YXJkc0ZvckVhY2goYXJyYXksIChlbGVtZW50LCBuZXh0LCBkb25lKSA9PiB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmNhbGxlckFyZ3VtZW50cywgY29udGV4dCwgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb250ZXh0ID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgbmV4dCgpO1xuICAgIH0pO1xuICB9LCAoKSA9PiB7XG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb250ZXh0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiYWNrd2FyZHNGb3JFYWNoKGFycmF5LCBjYWxsYmFjaywgLi4uY2FsbGVyQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGNhbGxlckFyZ3VtZW50cy5wb3AoKTtcblxuICBsZXQgY29udGV4dCA9IGNhbGxlckFyZ3VtZW50cy5wb3AoKTtcblxuICByZXR1cm4gYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIG5leHQsIGRvbmUpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudCwgLi4uY2FsbGVyQXJndW1lbnRzLCBjb250ZXh0LCAoLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICAgIGNvbnRleHQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICBuZXh0KCk7XG4gICAgfSk7XG4gIH0sICgpID0+IHtcbiAgICByZXR1cm4gY29udGludWF0aW9uKGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoKGFycmF5QSwgYXJyYXlCLCBjYWxsYmFjaywgLi4uY2FsbGVyQXJndW1lbnRzKSB7XG4gIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGNhbGxlckFyZ3VtZW50cy5wb3AoKSxcbiAgICAgICAgY29udGV4dCA9IGNhbGxlckFyZ3VtZW50cy5wb3AoKTtcblxuICBjb25zdCBhcnJheUFMZW5ndGggPSBhcnJheUEubGVuZ3RoLFxuICAgICAgICBhcnJheUJMZW5ndGggPSBhcnJheUIubGVuZ3RoO1xuXG4gIGlmIChhcnJheUFMZW5ndGggIT09IGFycmF5Qkxlbmd0aCkge1xuICAgIGNvbnN0IG1hdGNoZXMgPSBmYWxzZTtcblxuICAgIHJldHVybiBjb250aW51YXRpb24obWF0Y2hlcywgY29udGV4dCk7XG4gIH1cblxuICBsZXQgaW5kZXggPSAtMTtcblxuICByZXR1cm4gZXZlcnkoYXJyYXlBLCAoZWxlbWVudEEsIC4uLmNhbGxlZUFyZ3VtZW50cykgPT4ge1xuICAgIGluZGV4Kys7XG5cbiAgICBjb25zdCBlbGVtZW50QiA9IGFycmF5QltpbmRleF07XG5cbiAgICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZWVBcmd1bWVudHMucG9wKCk7XG5cbiAgICBsZXQgY29udGV4dCA9IGNhbGxlZUFyZ3VtZW50cy5wb3AoKTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50QSwgZWxlbWVudEIsIC4uLmNhbGxlZUFyZ3VtZW50cywgY29udGV4dCwgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgY29udGV4dCA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIHJldHVybiBjb250aW51YXRpb24oc3VjY2VzcywgY29udGV4dCk7XG4gICAgfSk7XG4gIH0sIC4uLmNhbGxlckFyZ3VtZW50cywgY29udGV4dCwgKHN1Y2Nlc3MsIGNvbnRleHQpID0+IHtcbiAgICBjb25zdCBtYXRjaGVzID0gc3VjY2VzczsgIC8vL1xuXG4gICAgcmV0dXJuIGNvbnRpbnVhdGlvbihtYXRjaGVzLCBjb250ZXh0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXIoYXJyYXksIGNhbGxiYWNrLCAuLi5jYWxsZXJBcmd1bWVudHMpIHtcbiAgY29uc3QgZGVsZXRlZEVsZW1lbnRzID0gW107XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBjb250ZXh0ID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBpbmRleCA9IGFycmF5Lmxlbmd0aDtcblxuICByZXR1cm4gYmFja3dhcmRzRm9yRWFjaChhcnJheSwgKGVsZW1lbnQsIC4uLmNhbGxlZUFyZ3VtZW50cykgPT4ge1xuICAgIGluZGV4LS07XG5cbiAgICBjb25zdCBjb250aW51YXRpb24gPSBjYWxsZWVBcmd1bWVudHMucG9wKCk7XG5cbiAgICBsZXQgY29udGV4dCA9IGNhbGxlZUFyZ3VtZW50cy5wb3AoKTtcblxuICAgIHJldHVybiBjYWxsYmFjayhlbGVtZW50LCAuLi5jYWxsZWVBcmd1bWVudHMsIGNvbnRleHQsICguLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IGNhbGxiYWNrQXJndW1lbnRzLnNoaWZ0KCk7XG5cbiAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICBjb25zdCBzdGFydCA9IGluZGV4LCAgLy8vXG4gICAgICAgICAgICAgIGRlbGV0ZUNvdW50ID0gMSxcbiAgICAgICAgICAgICAgZGVsZXRlZEVsZW1lbnQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KS5wb3AoKTsgIC8vL1xuXG4gICAgICAgIGRlbGV0ZWRFbGVtZW50cy51bnNoaWZ0KGRlbGV0ZWRFbGVtZW50KTsgIC8vL1xuICAgICAgfVxuXG4gICAgICBjb250ZXh0ID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihjb250ZXh0KTtcbiAgICB9KTtcbiAgfSwgLi4uY2FsbGVyQXJndW1lbnRzLCBjb250ZXh0LCAoY29udGV4dCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oZGVsZXRlZEVsZW1lbnRzLCBjb250ZXh0KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0KGFycmF5LCBjYWxsYmFjaywgLi4uY2FsbGVyQXJndW1lbnRzKSB7XG4gIGxldCBkZWxldGVkRWxlbWVudCA9IHVuZGVmaW5lZDsgLy8vXG5cbiAgY29uc3QgY29udGludWF0aW9uID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpLFxuICAgICAgICBjb250ZXh0ID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBpbmRleCA9IC0xO1xuXG4gIHJldHVybiBzb21lKGFycmF5LCAoZWxlbWVudCwgLi4uY2FsbGVlQXJndW1lbnRzKSA9PiB7XG4gICAgaW5kZXgrKztcblxuICAgIGNvbnN0IGNvbnRpbnVhdGlvbiA9IGNhbGxlZUFyZ3VtZW50cy5wb3AoKTtcblxuICAgIGxldCBjb250ZXh0ID0gY2FsbGVlQXJndW1lbnRzLnBvcCgpO1xuXG4gICAgcmV0dXJuIGNhbGxiYWNrKGVsZW1lbnQsIC4uLmNhbGxlZUFyZ3VtZW50cywgY29udGV4dCwgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBpbmRleCwgIC8vL1xuICAgICAgICAgICAgICBkZWxldGVDb3VudCA9IDE7XG5cbiAgICAgICAgZGVsZXRlZEVsZW1lbnQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KS5wb3AoKSAvLy9cblxuICAgICAgICBjb250ZXh0ID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbihzdWNjZXNzLCBjb250ZXh0KTtcbiAgICB9KTtcbiAgfSwgLi4uY2FsbGVyQXJndW1lbnRzLCBjb250ZXh0LCAoc3VjY2VzcywgY29udGV4dCkgPT4ge1xuICAgIHJldHVybiBjb250aW51YXRpb24oZGVsZXRlZEVsZW1lbnQsIGNvbnRleHQpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmUoYXJyYXlBLCBhcnJheUIsIGNhbGxiYWNrLCAuLi5jYWxsZXJBcmd1bWVudHMpIHtcbiAgYXJyYXlBID0gWyAgLy8vXG4gICAgLi4uYXJyYXlBXG4gIF07XG5cbiAgY29uc3QgY29udGludWF0aW9uID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGxldCBjb250ZXh0ID0gY2FsbGVyQXJndW1lbnRzLnBvcCgpO1xuXG4gIGZ1bmN0aW9uIG5leHRQYXNzKCkge1xuICAgIGNvbnN0IGFycmF5QUxlbmd0aCA9IGFycmF5QS5sZW5ndGg7XG5cbiAgICBpZiAoYXJyYXlBTGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBzdWNjZXNzID0gdHJ1ZTsgIC8vL1xuXG4gICAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICAgIH1cblxuICAgIGxldCBzdWNjZXNzID0gZmFsc2U7XG5cbiAgICBsZXQgY291bnQgPSAtMTtcblxuICAgIGZ1bmN0aW9uIG5leHRFbGVtZW50KCkge1xuICAgICAgY291bnQrKztcblxuICAgICAgY29uc3QgdGVybWluYXRlID0gKGNvdW50ID09PSBhcnJheUFMZW5ndGgpO1xuXG4gICAgICBpZiAodGVybWluYXRlKSB7XG4gICAgICAgIGlmICghc3VjY2Vzcykge1xuICAgICAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBmYWxzZTsgLy8vXG5cbiAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uKHN1Y2Nlc3MsIGNvbnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXJyYXlGaWx0ZXIoYXJyYXlBLCAoZWxlbWVudEEpID0+IHtcbiAgICAgICAgICBjb25zdCBhcnJheUJJbmNsdWRlc0VsZW1lbnRBID0gYXJyYXlCLmluY2x1ZGVzKGVsZW1lbnRBKTtcblxuICAgICAgICAgIGlmICghYXJyYXlCSW5jbHVkZXNFbGVtZW50QSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXh0UGFzcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBjb3VudCwgIC8vL1xuICAgICAgICAgIGVsZW1lbnRBID0gYXJyYXlBW2luZGV4XTtcblxuICAgICAgICByZXR1cm4gY2FsbGJhY2soZWxlbWVudEEsIC4uLmNhbGxlckFyZ3VtZW50cywgY29udGV4dCwgKC4uLmNhbGxiYWNrQXJndW1lbnRzKSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFzc2VkID0gY2FsbGJhY2tBcmd1bWVudHMuc2hpZnQoKTtcblxuICAgICAgICAgIGNvbnRleHQgPSBjYWxsYmFja0FyZ3VtZW50cy5zaGlmdCgpO1xuXG4gICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudEIgPSBlbGVtZW50QTsgIC8vL1xuXG4gICAgICAgICAgICBhcnJheUIucHVzaChlbGVtZW50Qik7XG5cbiAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIG5leHRFbGVtZW50KCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5leHRFbGVtZW50KCk7XG4gIH1cblxuICBuZXh0UGFzcygpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWxsKGNhbGxiYWNrcywgLi4uY2FsbGVyQXJndWVtbnRzKSB7XG4gIHJldHVybiBldmVyeShjYWxsYmFja3MsIChjYWxsYmFjaywgLi4uY2FsbGJhY2tBcmd1bWVudHMpID0+IHtcbiAgICByZXR1cm4gY2FsbGJhY2soLi4uY2FsbGJhY2tBcmd1bWVudHMpO1xuICB9LCAuLi5jYWxsZXJBcmd1ZW1udHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhpc3RzKGNhbGxiYWNrcywgLi4uY2FsbGVyQXJndWVtbnRzKSB7XG4gIHJldHVybiBzb21lKGNhbGxiYWNrcywgKGNhbGxiYWNrLCAuLi5jYWxsYmFja0FyZ3VtZW50cykgPT4ge1xuICAgIHJldHVybiBjYWxsYmFjayguLi5jYWxsYmFja0FyZ3VtZW50cyk7XG4gIH0sIC4uLmNhbGxlckFyZ3VlbW50cyk7XG59XG4iXSwibmFtZXMiOlsiYWxsIiwiYmFja3dhcmRzRXZlcnkiLCJiYWNrd2FyZHNGb3JFYWNoIiwiZWFjaCIsImV2ZXJ5IiwiZXhpc3RzIiwiZXh0cmFjdCIsImZpbHRlciIsImZvckVhY2giLCJmb3J3YXJkc0V2ZXJ5IiwiZm9yd2FyZHNGb3JFYWNoIiwibWF0Y2giLCJvbmUiLCJyZWR1Y2UiLCJyZXNvbHZlIiwic29tZSIsImFycmF5RmlsdGVyIiwiYXJyYXlVdGlsaXRpZXMiLCJhc3luY2hyb25vdXNGb3JFYWNoIiwiYXN5bmNocm9ub3VzRm9yd2FyZHNGb3JFYWNoIiwiYXN5bmNocm9ub3VzQmFja3dhcmRzRm9yRWFjaCIsImFzeW5jaHJvbm91c1V0aWxpdGllcyIsImFycmF5IiwiY2FsbGJhY2siLCJjYWxsZXJBcmd1bWVudHMiLCJzdWNjZXNzIiwiY29udGludWF0aW9uIiwicG9wIiwiY29udGV4dCIsImNhbGxlckNvbnRleHQiLCJlbGVtZW50IiwibmV4dCIsImRvbmUiLCJjYWxsYmFja0FyZ3VtZW50cyIsInBhc3NlZCIsInNoaWZ0IiwiaW5pdGlhbFZhbHVlIiwidmFsdWUiLCJhcnJheUEiLCJhcnJheUIiLCJhcnJheUFMZW5ndGgiLCJsZW5ndGgiLCJhcnJheUJMZW5ndGgiLCJtYXRjaGVzIiwiaW5kZXgiLCJlbGVtZW50QSIsImNhbGxlZUFyZ3VtZW50cyIsImVsZW1lbnRCIiwiZGVsZXRlZEVsZW1lbnRzIiwic3RhcnQiLCJkZWxldGVDb3VudCIsImRlbGV0ZWRFbGVtZW50Iiwic3BsaWNlIiwidW5zaGlmdCIsInVuZGVmaW5lZCIsIm5leHRQYXNzIiwiY291bnQiLCJuZXh0RWxlbWVudCIsInRlcm1pbmF0ZSIsImFycmF5QkluY2x1ZGVzRWxlbWVudEEiLCJpbmNsdWRlcyIsInB1c2giLCJjYWxsYmFja3MiLCJjYWxsZXJBcmd1ZW1udHMiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQXViZ0JBO2VBQUFBOztRQWhQQUM7ZUFBQUE7O1FBOENBQztlQUFBQTs7UUE1S0FDO2VBQUFBOztRQThCQUM7ZUFBQUE7O1FBc1ZBQztlQUFBQTs7UUEvR0FDO2VBQUFBOztRQW5DQUM7ZUFBQUE7O1FBbEpBQztlQUFBQTs7UUFnQkFDO2VBQUFBOztRQTREQUM7ZUFBQUE7O1FBZ0NBQztlQUFBQTs7UUE1UEFDO2VBQUFBOztRQTRIQUM7ZUFBQUE7O1FBMk9BQztlQUFBQTs7UUFuVUFDO2VBQUFBOzs7MkJBM0NzQztBQUV0RCxNQUFNLEVBQUVSLFFBQVFTLFdBQVcsRUFBRSxHQUFHQyx5QkFBYyxFQUN4QyxFQUFFVCxTQUFTVSxtQkFBbUIsRUFDNUJSLGlCQUFpQlMsMkJBQTJCLEVBQzVDakIsa0JBQWtCa0IsNEJBQTRCLEVBQUUsR0FBR0MsZ0NBQXFCO0FBRXpFLFNBQVNULElBQUlVLEtBQUssRUFBRUMsUUFBUSxFQUFFLEdBQUdDLGVBQWU7SUFDckQsSUFBSUMsVUFBVTtJQUVkLE1BQU1DLGVBQWVGLGdCQUFnQkcsR0FBRztJQUV4QyxJQUFJQyxVQUFVSixnQkFBZ0JHLEdBQUc7SUFFakMsTUFBTUUsZ0JBQWdCRCxTQUFVLEdBQUc7SUFFbkMsT0FBT1Ysb0JBQW9CSSxPQUFPLENBQUNRLFNBQVNDLE1BQU1DO1FB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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-nominal",
3
3
  "author": "James Smith",
4
- "version": "1.0.347",
4
+ "version": "1.0.349",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-nominal",
7
7
  "description": "Occam's Nominal language.",
@@ -11,9 +11,9 @@
11
11
  },
12
12
  "dependencies": {
13
13
  "necessary": "^17.5.5",
14
- "occam-furtle": "^3.0.413",
14
+ "occam-furtle": "^3.0.415",
15
15
  "occam-grammar-utilities": "^8.1.19",
16
- "occam-languages": "^2.2.14",
16
+ "occam-languages": "^2.2.17",
17
17
  "occam-query": "^4.1.200"
18
18
  },
19
19
  "devDependencies": {
@@ -1,14 +1,12 @@
1
1
  "use strict";
2
2
 
3
- import { asynchronousUtilities } from "necessary";
4
- import { continuationUtilities } from "occam-languages";
3
+ import { arrayUtilities, asynchronousUtilities } from "necessary";
5
4
 
6
- const { forEach: asynchronousForEach,
5
+ const { filter: arrayFilter } = arrayUtilities,
6
+ { forEach: asynchronousForEach,
7
7
  forwardsForEach: asynchronousForwardsForEach,
8
8
  backwardsForEach: asynchronousBackwardsForEach } = asynchronousUtilities;
9
9
 
10
- export const { match, filter, reduce, forEach, resolve } = continuationUtilities;
11
-
12
10
  export function one(array, callback, ...callerArguments) {
13
11
  let success = false;
14
12
 
@@ -18,7 +16,7 @@ export function one(array, callback, ...callerArguments) {
18
16
 
19
17
  const callerContext = context; ///
20
18
 
21
- asynchronousForEach(array, (element, next, done) => {
19
+ return asynchronousForEach(array, (element, next, done) => {
22
20
  return callback(element, ...callerArguments, callerContext, (...callbackArguments) => {
23
21
  const passed = callbackArguments.shift();
24
22
 
@@ -54,7 +52,7 @@ export function some(array, callback, ...callerArguments) {
54
52
 
55
53
  const callerContext = context; ///
56
54
 
57
- asynchronousForEach(array, (element, next, done) => {
55
+ return asynchronousForEach(array, (element, next, done) => {
58
56
  return callback(element, ...callerArguments, callerContext, (...callbackArguments) => {
59
57
  success = callbackArguments.shift();
60
58
 
@@ -82,7 +80,7 @@ export function each(array, callback, ...callerArguments) {
82
80
 
83
81
  const callerContext = context; ///
84
82
 
85
- asynchronousForEach(array, (element, next, done) => {
83
+ return asynchronousForEach(array, (element, next, done) => {
86
84
  return callback(element, ...callerArguments, context, (...callbackArguments) => {
87
85
  success = callbackArguments.shift();
88
86
 
@@ -112,7 +110,7 @@ export function every(array, callback, ...callerArguments) {
112
110
 
113
111
  const callerContext = context; ///
114
112
 
115
- asynchronousForEach(array, (element, next, done) => {
113
+ return asynchronousForEach(array, (element, next, done) => {
116
114
  return callback(element, ...callerArguments, context, (...callbackArguments) => {
117
115
  success = callbackArguments.shift();
118
116
 
@@ -133,37 +131,39 @@ export function every(array, callback, ...callerArguments) {
133
131
  });
134
132
  }
135
133
 
136
- export function extract(array, callback, ...callerArguments) {
137
- let deletedElement = undefined; ///
138
-
139
- const continuation = callerArguments.pop(),
140
- context = callerArguments.pop();
134
+ export function reduce(array, initialValue, callback, ...callerArguments) {
135
+ let value = initialValue; ///
141
136
 
142
- let index = -1;
137
+ const continuation = callerArguments.pop();
143
138
 
144
- return some(array, (element, ...calleeArguments) => {
145
- index++;
139
+ let context = callerArguments.pop();
146
140
 
147
- const continuation = calleeArguments.pop();
141
+ return asynchronousForEach(array, (element, next, done) => {
142
+ return callback(value, element, ...callerArguments, context, (...callbackArguments) => {
143
+ value = callbackArguments.shift();
148
144
 
149
- let context = calleeArguments.pop();
145
+ context = callbackArguments.shift();
150
146
 
151
- return callback(element, ...calleeArguments, context, (...callbackArguments) => {
152
- const success = callbackArguments.shift();
147
+ next();
148
+ });
149
+ }, () => {
150
+ return continuation(value, context);
151
+ });
152
+ }
153
153
 
154
- if (success) {
155
- const start = index, ///
156
- deleteCount = 1;
154
+ export function forEach(array, callback, ...callerArguments) {
155
+ const continuation = callerArguments.pop();
157
156
 
158
- deletedElement = array.splice(start, deleteCount).pop() ///
157
+ let context = callerArguments.pop();
159
158
 
160
- context = callbackArguments.shift();
161
- }
159
+ return asynchronousForEach(array, (element, next, done) => {
160
+ return callback(element, ...callerArguments, context, (...callbackArguments) => {
161
+ context = callbackArguments.shift();
162
162
 
163
- return continuation(success, context);
163
+ next();
164
164
  });
165
- }, ...callerArguments, context, (success, context) => {
166
- return continuation(deletedElement, context);
165
+ }, () => {
166
+ return continuation(context);
167
167
  });
168
168
  }
169
169
 
@@ -176,7 +176,7 @@ export function forwardsEvery(array, callback, ...callerArguments) {
176
176
 
177
177
  const callerContext = context; ///
178
178
 
179
- asynchronousForwardsForEach(array, (element, next, done) => {
179
+ return asynchronousForwardsForEach(array, (element, next, done) => {
180
180
  return callback(element, ...callerArguments, context, (...callbackArguments) => {
181
181
  success = callbackArguments.shift();
182
182
 
@@ -206,7 +206,7 @@ export function backwardsEvery(array, callback, ...callerArguments) {
206
206
 
207
207
  const callerContext = context; ///
208
208
 
209
- asynchronousBackwardsForEach(array, (element, next, done) => {
209
+ return asynchronousBackwardsForEach(array, (element, next, done) => {
210
210
  return callback(element, ...callerArguments, context, (...callbackArguments) => {
211
211
  success = callbackArguments.shift();
212
212
 
@@ -227,6 +227,216 @@ export function backwardsEvery(array, callback, ...callerArguments) {
227
227
  });
228
228
  }
229
229
 
230
+ export function forwardsForEach(array, callback, ...callerArguments) {
231
+ const continuation = callerArguments.pop();
232
+
233
+ let context = callerArguments.pop();
234
+
235
+ return asynchronousForwardsForEach(array, (element, next, done) => {
236
+ return callback(element, ...callerArguments, context, (...callbackArguments) => {
237
+ context = callbackArguments.shift();
238
+
239
+ next();
240
+ });
241
+ }, () => {
242
+ return continuation(context);
243
+ });
244
+ }
245
+
246
+ export function backwardsForEach(array, callback, ...callerArguments) {
247
+ const continuation = callerArguments.pop();
248
+
249
+ let context = callerArguments.pop();
250
+
251
+ return asynchronousBackwardsForEach(array, (element, next, done) => {
252
+ return callback(element, ...callerArguments, context, (...callbackArguments) => {
253
+ context = callbackArguments.shift();
254
+
255
+ next();
256
+ });
257
+ }, () => {
258
+ return continuation(context);
259
+ });
260
+ }
261
+
262
+ export function match(arrayA, arrayB, callback, ...callerArguments) {
263
+ const continuation = callerArguments.pop(),
264
+ context = callerArguments.pop();
265
+
266
+ const arrayALength = arrayA.length,
267
+ arrayBLength = arrayB.length;
268
+
269
+ if (arrayALength !== arrayBLength) {
270
+ const matches = false;
271
+
272
+ return continuation(matches, context);
273
+ }
274
+
275
+ let index = -1;
276
+
277
+ return every(arrayA, (elementA, ...calleeArguments) => {
278
+ index++;
279
+
280
+ const elementB = arrayB[index];
281
+
282
+ const continuation = calleeArguments.pop();
283
+
284
+ let context = calleeArguments.pop();
285
+
286
+ return callback(elementA, elementB, ...calleeArguments, context, (...callbackArguments) => {
287
+ const success = callbackArguments.shift();
288
+
289
+ context = callbackArguments.shift();
290
+
291
+ return continuation(success, context);
292
+ });
293
+ }, ...callerArguments, context, (success, context) => {
294
+ const matches = success; ///
295
+
296
+ return continuation(matches, context);
297
+ });
298
+ }
299
+
300
+ export function filter(array, callback, ...callerArguments) {
301
+ const deletedElements = [];
302
+
303
+ const continuation = callerArguments.pop(),
304
+ context = callerArguments.pop();
305
+
306
+ let index = array.length;
307
+
308
+ return backwardsForEach(array, (element, ...calleeArguments) => {
309
+ index--;
310
+
311
+ const continuation = calleeArguments.pop();
312
+
313
+ let context = calleeArguments.pop();
314
+
315
+ return callback(element, ...calleeArguments, context, (...callbackArguments) => {
316
+ const success = callbackArguments.shift();
317
+
318
+ if (!success) {
319
+ const start = index, ///
320
+ deleteCount = 1,
321
+ deletedElement = array.splice(start, deleteCount).pop(); ///
322
+
323
+ deletedElements.unshift(deletedElement); ///
324
+ }
325
+
326
+ context = callbackArguments.shift();
327
+
328
+ return continuation(context);
329
+ });
330
+ }, ...callerArguments, context, (context) => {
331
+ return continuation(deletedElements, context);
332
+ });
333
+ }
334
+
335
+ export function extract(array, callback, ...callerArguments) {
336
+ let deletedElement = undefined; ///
337
+
338
+ const continuation = callerArguments.pop(),
339
+ context = callerArguments.pop();
340
+
341
+ let index = -1;
342
+
343
+ return some(array, (element, ...calleeArguments) => {
344
+ index++;
345
+
346
+ const continuation = calleeArguments.pop();
347
+
348
+ let context = calleeArguments.pop();
349
+
350
+ return callback(element, ...calleeArguments, context, (...callbackArguments) => {
351
+ const success = callbackArguments.shift();
352
+
353
+ if (success) {
354
+ const start = index, ///
355
+ deleteCount = 1;
356
+
357
+ deletedElement = array.splice(start, deleteCount).pop() ///
358
+
359
+ context = callbackArguments.shift();
360
+ }
361
+
362
+ return continuation(success, context);
363
+ });
364
+ }, ...callerArguments, context, (success, context) => {
365
+ return continuation(deletedElement, context);
366
+ });
367
+ }
368
+
369
+ export function resolve(arrayA, arrayB, callback, ...callerArguments) {
370
+ arrayA = [ ///
371
+ ...arrayA
372
+ ];
373
+
374
+ const continuation = callerArguments.pop();
375
+
376
+ let context = callerArguments.pop();
377
+
378
+ function nextPass() {
379
+ const arrayALength = arrayA.length;
380
+
381
+ if (arrayALength === 0) {
382
+ const success = true; ///
383
+
384
+ return continuation(success, context);
385
+ }
386
+
387
+ let success = false;
388
+
389
+ let count = -1;
390
+
391
+ function nextElement() {
392
+ count++;
393
+
394
+ const terminate = (count === arrayALength);
395
+
396
+ if (terminate) {
397
+ if (!success) {
398
+ const success = false; ///
399
+
400
+ return continuation(success, context);
401
+ }
402
+
403
+ arrayFilter(arrayA, (elementA) => {
404
+ const arrayBIncludesElementA = arrayB.includes(elementA);
405
+
406
+ if (!arrayBIncludesElementA) {
407
+ return true;
408
+ }
409
+ });
410
+
411
+ nextPass();
412
+ } else {
413
+ const index = count, ///
414
+ elementA = arrayA[index];
415
+
416
+ return callback(elementA, ...callerArguments, context, (...callbackArguments) => {
417
+ const passed = callbackArguments.shift();
418
+
419
+ context = callbackArguments.shift();
420
+
421
+ if (passed) {
422
+ const elementB = elementA; ///
423
+
424
+ arrayB.push(elementB);
425
+
426
+ success = true;
427
+ }
428
+
429
+ nextElement();
430
+ });
431
+ }
432
+ }
433
+
434
+ nextElement();
435
+ }
436
+
437
+ nextPass();
438
+ }
439
+
230
440
  export function all(callbacks, ...callerArguemnts) {
231
441
  return every(callbacks, (callback, ...callbackArguments) => {
232
442
  return callback(...callbackArguments);