UNPKG

50.5 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", { value: true });
4var branchingFactor = 32;
5var branchBits = 5;
6var mask = 31;
7function isSetoid(a) {
8 return a && typeof a["fantasy-land/equals"] === "function";
9}
10function elementEquals(a, b) {
11 if (a === b) {
12 return true;
13 } else if (isSetoid(a)) {
14 return a["fantasy-land/equals"](b);
15 } else {
16 return false;
17 }
18}
19function createPath(depth, value) {
20 var current = value;
21 for (var i = 0; i < depth; ++i) {
22 current = new Node(undefined, [current]);
23 }
24 return current;
25}
26function copyArray(source) {
27 var array = [];
28 for (var i = 0; i < source.length; ++i) {
29 array[i] = source[i];
30 }
31 return array;
32}
33function pushElements(source, target, offset, amount) {
34 for (var i = offset; i < offset + amount; ++i) {
35 target.push(source[i]);
36 }
37}
38function copyIndices(source, sourceStart, target, targetStart, length) {
39 for (var i = 0; i < length; ++i) {
40 target[targetStart + i] = source[sourceStart + i];
41 }
42}
43function arrayPrepend(value, array) {
44 var newLength = array.length + 1;
45 var result = new Array(newLength);
46 result[0] = value;
47 for (var i = 1; i < newLength; ++i) {
48 result[i] = array[i - 1];
49 }
50 return result;
51}
52function reverseArray(array) {
53 return array.slice().reverse();
54}
55function arrayFirst(array) {
56 return array[0];
57}
58function arrayLast(array) {
59 return array[array.length - 1];
60}
61var pathResult = { path: 0, index: 0, updatedOffset: 0 };
62function getPath(index, offset, depth, sizes) {
63 if (sizes === undefined && offset !== 0) {
64 pathResult.updatedOffset = 0;
65 index = handleOffset(depth, offset, index);
66 }
67 var path = index >> depth * branchBits & mask;
68 if (sizes !== undefined) {
69 while (sizes[path] <= index) {
70 path++;
71 }
72 var traversed = path === 0 ? 0 : sizes[path - 1];
73 index -= traversed;
74 pathResult.updatedOffset = offset;
75 }
76 pathResult.path = path;
77 pathResult.index = index;
78 return pathResult;
79}
80function updateNode(node, depth, index, offset, value) {
81 var _a = getPath(index, offset, depth, node.sizes),
82 path = _a.path,
83 newIndex = _a.index,
84 updatedOffset = _a.updatedOffset;
85 var array = copyArray(node.array);
86 array[path] = depth > 0 ? updateNode(array[path], depth - 1, newIndex, updatedOffset, value) : value;
87 return new Node(node.sizes, array);
88}
89var Node = /*#__PURE__*/function () {
90 function Node(sizes, array) {
91 this.sizes = sizes;
92 this.array = array;
93 }
94 return Node;
95}();
96exports.Node = Node;
97function cloneNode(_a) {
98 var sizes = _a.sizes,
99 array = _a.array;
100 return new Node(sizes === undefined ? undefined : copyArray(sizes), copyArray(array));
101}
102var emptyAffix = [0];
103var affixBits = 6;
104var affixMask = 63;
105function getSuffixSize(l) {
106 return l.bits & affixMask;
107}
108function getPrefixSize(l) {
109 return l.bits >> affixBits & affixMask;
110}
111function getDepth(l) {
112 return l.bits >> affixBits * 2;
113}
114function setPrefix(size, bits) {
115 return size << affixBits | bits & ~(affixMask << affixBits);
116}
117function setSuffix(size, bits) {
118 return size | bits & ~affixMask;
119}
120function setDepth(depth, bits) {
121 return depth << affixBits * 2 | bits & (affixMask | affixMask << affixBits);
122}
123function incrementPrefix(bits) {
124 return bits + (1 << affixBits);
125}
126function incrementSuffix(bits) {
127 return bits + 1;
128}
129function incrementDepth(bits) {
130 return bits + (1 << affixBits * 2);
131}
132function decrementDepth(bits) {
133 return bits - (1 << affixBits * 2);
134}
135var List = /*#__PURE__*/function () {
136 function List(bits, offset, length, prefix, root, suffix) {
137 this.bits = bits;
138 this.offset = offset;
139 this.length = length;
140 this.prefix = prefix;
141 this.root = root;
142 this.suffix = suffix;
143 }
144 List.prototype[Symbol.iterator] = function () {
145 return new ListIterator(this);
146 };
147 return List;
148}();
149exports.List = List;
150function cloneList(l) {
151 return new List(l.bits, l.offset, l.length, l.prefix, l.root, l.suffix);
152}
153var ListIterator = /*#__PURE__*/function () {
154 function ListIterator(l) {
155 this.l = l;
156 this.result = { done: false, value: undefined };
157 this.idx = -1;
158 this.prefixSize = getPrefixSize(l);
159 this.middleSize = l.length - getSuffixSize(l);
160 if (l.root !== undefined) {
161 var depth = getDepth(l);
162 this.stack = new Array(depth + 1);
163 this.indices = new Array(depth + 1);
164 var currentNode = l.root.array;
165 for (var i = depth; 0 <= i; --i) {
166 this.stack[i] = currentNode;
167 this.indices[i] = 0;
168 currentNode = currentNode[0].array;
169 }
170 this.indices[0] = -1;
171 }
172 }
173 ListIterator.prototype.nextInTree = function () {
174 var i = 0;
175 while (++this.indices[i] === this.stack[i].length) {
176 this.indices[i] = 0;
177 ++i;
178 }
179 for (; 0 < i; --i) {
180 this.stack[i - 1] = this.stack[i][this.indices[i]].array;
181 }
182 };
183 ListIterator.prototype.next = function () {
184 var newVal;
185 var idx = ++this.idx;
186 if (idx < this.prefixSize) {
187 newVal = this.l.prefix[this.prefixSize - idx - 1];
188 } else if (idx < this.middleSize) {
189 this.nextInTree();
190 newVal = this.stack[0][this.indices[0]];
191 } else if (idx < this.l.length) {
192 newVal = this.l.suffix[idx - this.middleSize];
193 } else {
194 this.result.done = true;
195 }
196 this.result.value = newVal;
197 return this.result;
198 };
199 return ListIterator;
200}();
201function emptyPushable() {
202 return new List(0, 0, 0, [], undefined, []);
203}
204function push(value, l) {
205 var suffixSize = getSuffixSize(l);
206 if (l.length === 0) {
207 l.bits = setPrefix(1, l.bits);
208 l.prefix = [value];
209 } else if (suffixSize < 32) {
210 l.bits = incrementSuffix(l.bits);
211 l.suffix.push(value);
212 } else if (l.root === undefined) {
213 l.root = new Node(undefined, l.suffix);
214 l.suffix = [value];
215 l.bits = setSuffix(1, l.bits);
216 } else {
217 var newNode = new Node(undefined, l.suffix);
218 var index = l.length - 1 - 32 + 1;
219 var current = l.root;
220 var depth = getDepth(l);
221 l.suffix = [value];
222 l.bits = setSuffix(1, l.bits);
223 if (index - 1 < Math.pow(branchingFactor, depth + 1)) {
224 for (; depth >= 0; --depth) {
225 var path = index >> depth * branchBits & mask;
226 if (path < current.array.length) {
227 current = current.array[path];
228 } else {
229 current.array.push(createPath(depth - 1, newNode));
230 break;
231 }
232 }
233 } else {
234 l.bits = incrementDepth(l.bits);
235 l.root = new Node(undefined, [l.root, createPath(depth, newNode)]);
236 }
237 }
238 l.length++;
239 return l;
240}
241function list() {
242 var elements = [];
243 for (var _i = 0; _i < arguments.length; _i++) {
244 elements[_i] = arguments[_i];
245 }
246 var l = emptyPushable();
247 for (var _a = 0, elements_1 = elements; _a < elements_1.length; _a++) {
248 var element = elements_1[_a];
249 push(element, l);
250 }
251 return l;
252}
253exports.list = list;
254function empty() {
255 return new List(0, 0, 0, emptyAffix, undefined, emptyAffix);
256}
257exports.empty = empty;
258function of(a) {
259 return list(a);
260}
261exports.of = of;
262function pair(first, second) {
263 return new List(2, 0, 2, emptyAffix, undefined, [first, second]);
264}
265exports.pair = pair;
266function from(sequence) {
267 var l = emptyPushable();
268 if (sequence.length > 0 && (sequence[0] !== undefined || 0 in sequence)) {
269 for (var i = 0; i < sequence.length; ++i) {
270 push(sequence[i], l);
271 }
272 } else if (Symbol.iterator in sequence) {
273 var iterator = sequence[Symbol.iterator]();
274 var cur = void 0;
275 while (!(cur = iterator.next()).done) {
276 push(cur.value, l);
277 }
278 }
279 return l;
280}
281exports.from = from;
282function range(start, end) {
283 var list = emptyPushable();
284 for (var i = start; i < end; ++i) {
285 push(i, list);
286 }
287 return list;
288}
289exports.range = range;
290function repeat(value, times) {
291 var l = emptyPushable();
292 while (--times >= 0) {
293 push(value, l);
294 }
295 return l;
296}
297exports.repeat = repeat;
298function times(func, times) {
299 var l = emptyPushable();
300 for (var i = 0; i < times; i++) {
301 push(func(i), l);
302 }
303 return l;
304}
305exports.times = times;
306function nodeNthDense(node, depth, index) {
307 var current = node;
308 for (; depth >= 0; --depth) {
309 current = current.array[index >> depth * branchBits & mask];
310 }
311 return current;
312}
313function handleOffset(depth, offset, index) {
314 index += offset;
315 for (; depth >= 0; --depth) {
316 index = index - (offset & mask << depth * branchBits);
317 if ((index >> depth * branchBits & mask) !== 0) {
318 break;
319 }
320 }
321 return index;
322}
323function nodeNth(node, depth, offset, index) {
324 var path;
325 var current = node;
326 while (current.sizes !== undefined) {
327 path = index >> depth * branchBits & mask;
328 while (current.sizes[path] <= index) {
329 path++;
330 }
331 if (path !== 0) {
332 index -= current.sizes[path - 1];
333 offset = 0;
334 }
335 depth--;
336 current = current.array[path];
337 }
338 return nodeNthDense(current, depth, offset === 0 ? index : handleOffset(depth, offset, index));
339}
340function nth(index, l) {
341 if (index < 0 || l.length <= index) {
342 return undefined;
343 }
344 var prefixSize = getPrefixSize(l);
345 var suffixSize = getSuffixSize(l);
346 if (index < prefixSize) {
347 return l.prefix[prefixSize - index - 1];
348 } else if (index >= l.length - suffixSize) {
349 return l.suffix[index - (l.length - suffixSize)];
350 }
351 var offset = l.offset;
352 var depth = getDepth(l);
353 return l.root.sizes === undefined ? nodeNthDense(l.root, depth, offset === 0 ? index - prefixSize : handleOffset(depth, offset, index - prefixSize)) : nodeNth(l.root, depth, offset, index - prefixSize);
354}
355exports.nth = nth;
356function setSizes(node, height) {
357 var sum = 0;
358 var sizeTable = [];
359 for (var i = 0; i < node.array.length; ++i) {
360 sum += sizeOfSubtree(node.array[i], height - 1);
361 sizeTable[i] = sum;
362 }
363 node.sizes = sizeTable;
364 return node;
365}
366function sizeOfSubtree(node, height) {
367 if (height !== 0) {
368 if (node.sizes !== undefined) {
369 return arrayLast(node.sizes);
370 } else {
371 var lastSize = sizeOfSubtree(arrayLast(node.array), height - 1);
372 return (node.array.length - 1 << height * branchBits) + lastSize;
373 }
374 } else {
375 return node.array.length;
376 }
377}
378function affixPush(a, array, length) {
379 if (array.length === length) {
380 array.push(a);
381 return array;
382 } else {
383 var newArray = [];
384 copyIndices(array, 0, newArray, 0, length);
385 newArray.push(a);
386 return newArray;
387 }
388}
389function prepend(value, l) {
390 var prefixSize = getPrefixSize(l);
391 if (prefixSize < 32) {
392 return new List(incrementPrefix(l.bits), l.offset, l.length + 1, affixPush(value, l.prefix, prefixSize), l.root, l.suffix);
393 } else {
394 var newList = cloneList(l);
395 prependNodeToTree(newList, reverseArray(l.prefix));
396 var newPrefix = [value];
397 newList.prefix = newPrefix;
398 newList.length++;
399 newList.bits = setPrefix(1, newList.bits);
400 return newList;
401 }
402}
403exports.prepend = prepend;
404function copyLeft(l, k) {
405 var currentNode = cloneNode(l.root);
406 l.root = currentNode;
407 for (var i = 1; i < k; ++i) {
408 var index = 0;
409 if (currentNode.sizes !== undefined) {
410 for (var i_1 = 0; i_1 < currentNode.sizes.length; ++i_1) {
411 currentNode.sizes[i_1] += 32;
412 }
413 }
414 var newNode = cloneNode(currentNode.array[index]);
415 currentNode.array[index] = newNode;
416 currentNode = newNode;
417 }
418 return currentNode;
419}
420function nodePrepend(value, size, node) {
421 var array = arrayPrepend(value, node.array);
422 var sizes = undefined;
423 if (node.sizes !== undefined) {
424 sizes = new Array(node.sizes.length + 1);
425 sizes[0] = size;
426 for (var i = 0; i < node.sizes.length; ++i) {
427 sizes[i + 1] = node.sizes[i] + size;
428 }
429 }
430 return new Node(sizes, array);
431}
432function prependTopTree(l, depth, node) {
433 var newOffset;
434 if (l.root.array.length < branchingFactor) {
435 newOffset = Math.pow(32, depth) - 32;
436 l.root = new Node(undefined, arrayPrepend(createPath(depth - 1, node), l.root.array));
437 } else {
438 l.bits = incrementDepth(l.bits);
439 var sizes = l.root.sizes === undefined ? undefined : [32, arrayLast(l.root.sizes) + 32];
440 newOffset = depth === 0 ? 0 : Math.pow(32, depth + 1) - 32;
441 l.root = new Node(sizes, [createPath(depth, node), l.root]);
442 }
443 return newOffset;
444}
445function prependNodeToTree(l, array) {
446 if (l.root === undefined) {
447 if (getSuffixSize(l) === 0) {
448 l.bits = setSuffix(array.length, l.bits);
449 l.suffix = array;
450 } else {
451 l.root = new Node(undefined, array);
452 }
453 return l;
454 } else {
455 var node = new Node(undefined, array);
456 var depth = getDepth(l);
457 var newOffset_1 = 0;
458 if (l.root.sizes === undefined) {
459 if (l.offset !== 0) {
460 newOffset_1 = l.offset - branchingFactor;
461 l.root = prependDense(l.root, depth, l.offset, node);
462 } else {
463 newOffset_1 = prependTopTree(l, depth, node);
464 }
465 } else {
466 var copyableCount = 0;
467 var nodesTraversed = 0;
468 var currentNode = l.root;
469 while (currentNode.sizes !== undefined && nodesTraversed < depth) {
470 ++nodesTraversed;
471 if (currentNode.array.length < 32) {
472 copyableCount = nodesTraversed;
473 }
474 currentNode = currentNode.array[0];
475 }
476 if (l.offset !== 0) {
477 var copiedNode = copyLeft(l, nodesTraversed);
478 for (var i = 0; i < copiedNode.sizes.length; ++i) {
479 copiedNode.sizes[i] += branchingFactor;
480 }
481 copiedNode.array[0] = prependDense(copiedNode.array[0], depth - nodesTraversed, l.offset, node);
482 l.offset = l.offset - branchingFactor;
483 return l;
484 } else {
485 if (copyableCount === 0) {
486 l.offset = prependTopTree(l, depth, node);
487 } else {
488 var parent_1;
489 var prependableNode = void 0;
490 if (copyableCount > 1) {
491 parent_1 = copyLeft(l, copyableCount - 1);
492 prependableNode = parent_1.array[0];
493 } else {
494 parent_1 = undefined;
495 prependableNode = l.root;
496 }
497 var path = createPath(depth - copyableCount, node);
498 l.offset = Math.pow(32, depth - copyableCount + 1) - 32;
499 var prepended = nodePrepend(path, 32, prependableNode);
500 if (parent_1 === undefined) {
501 l.root = prepended;
502 } else {
503 parent_1.array[0] = prepended;
504 }
505 }
506 return l;
507 }
508 }
509 l.offset = newOffset_1;
510 return l;
511 }
512}
513function prependDense(node, depth, offset, value) {
514 var curOffset = offset >> depth * branchBits & mask;
515 var path = (offset - 1 >> depth * branchBits & mask) - curOffset;
516 if (path < 0) {
517 return new Node(undefined, arrayPrepend(createPath(depth - 1, value), node.array));
518 } else {
519 var array = copyArray(node.array);
520 array[0] = prependDense(array[0], depth - 1, offset, value);
521 return new Node(undefined, array);
522 }
523}
524function append(value, l) {
525 var suffixSize = getSuffixSize(l);
526 if (suffixSize < 32) {
527 return new List(incrementSuffix(l.bits), l.offset, l.length + 1, l.prefix, l.root, affixPush(value, l.suffix, suffixSize));
528 }
529 var newSuffix = [value];
530 var newList = cloneList(l);
531 appendNodeToTree(newList, l.suffix);
532 newList.suffix = newSuffix;
533 newList.length++;
534 newList.bits = setSuffix(1, newList.bits);
535 return newList;
536}
537exports.append = append;
538function length(l) {
539 return l.length;
540}
541exports.length = length;
542function first(l) {
543 var prefixSize = getPrefixSize(l);
544 return prefixSize !== 0 ? l.prefix[prefixSize - 1] : l.length !== 0 ? l.suffix[0] : undefined;
545}
546exports.first = first;
547function last(l) {
548 var suffixSize = getSuffixSize(l);
549 return suffixSize !== 0 ? l.suffix[suffixSize - 1] : l.length !== 0 ? l.prefix[0] : undefined;
550}
551exports.last = last;
552function mapArray(f, array) {
553 var result = new Array(array.length);
554 for (var i = 0; i < array.length; ++i) {
555 result[i] = f(array[i]);
556 }
557 return result;
558}
559function mapNode(f, node, depth) {
560 if (depth !== 0) {
561 var array = node.array;
562 var result = new Array(array.length);
563 for (var i = 0; i < array.length; ++i) {
564 result[i] = mapNode(f, array[i], depth - 1);
565 }
566 return new Node(node.sizes, result);
567 } else {
568 return new Node(undefined, mapArray(f, node.array));
569 }
570}
571function mapPrefix(f, prefix, length) {
572 var newPrefix = new Array(length);
573 for (var i = length - 1; 0 <= i; --i) {
574 newPrefix[i] = f(prefix[i]);
575 }
576 return newPrefix;
577}
578function mapAffix(f, suffix, length) {
579 var newSuffix = new Array(length);
580 for (var i = 0; i < length; ++i) {
581 newSuffix[i] = f(suffix[i]);
582 }
583 return newSuffix;
584}
585function map(f, l) {
586 return new List(l.bits, l.offset, l.length, mapPrefix(f, l.prefix, getPrefixSize(l)), l.root === undefined ? undefined : mapNode(f, l.root, getDepth(l)), mapAffix(f, l.suffix, getSuffixSize(l)));
587}
588exports.map = map;
589function pluck(key, l) {
590 return map(function (a) {
591 return a[key];
592 }, l);
593}
594exports.pluck = pluck;
595function foldlSuffix(f, acc, array, length) {
596 for (var i = 0; i < length; ++i) {
597 acc = f(acc, array[i]);
598 }
599 return acc;
600}
601function foldlPrefix(f, acc, array, length) {
602 for (var i = length - 1; 0 <= i; --i) {
603 acc = f(acc, array[i]);
604 }
605 return acc;
606}
607function foldlNode(f, acc, node, depth) {
608 var array = node.array;
609 if (depth === 0) {
610 return foldlSuffix(f, acc, array, array.length);
611 }
612 for (var i = 0; i < array.length; ++i) {
613 acc = foldlNode(f, acc, array[i], depth - 1);
614 }
615 return acc;
616}
617function foldl(f, initial, l) {
618 var suffixSize = getSuffixSize(l);
619 var prefixSize = getPrefixSize(l);
620 initial = foldlPrefix(f, initial, l.prefix, prefixSize);
621 if (l.root !== undefined) {
622 initial = foldlNode(f, initial, l.root, getDepth(l));
623 }
624 return foldlSuffix(f, initial, l.suffix, suffixSize);
625}
626exports.foldl = foldl;
627exports.reduce = foldl;
628function traverse(of, f, l) {
629 return foldr(function (a, fl) {
630 return fl["fantasy-land/ap"](f(a)["fantasy-land/map"](function (a) {
631 return function (l) {
632 return prepend(a, l);
633 };
634 }));
635 }, of["fantasy-land/of"](empty()), l);
636}
637exports.traverse = traverse;
638function sequence(ofObj, l) {
639 return traverse(ofObj, function (a) {
640 return a;
641 }, l);
642}
643exports.sequence = sequence;
644function scan(f, initial, l) {
645 return foldl(function (l2, a) {
646 return push(f(last(l2), a), l2);
647 }, push(initial, emptyPushable()), l);
648}
649exports.scan = scan;
650function forEach(callback, l) {
651 foldl(function (_, element) {
652 return callback(element);
653 }, undefined, l);
654}
655exports.forEach = forEach;
656function filter(predicate, l) {
657 return foldl(function (acc, a) {
658 return predicate(a) ? push(a, acc) : acc;
659 }, emptyPushable(), l);
660}
661exports.filter = filter;
662function reject(predicate, l) {
663 return foldl(function (acc, a) {
664 return predicate(a) ? acc : push(a, acc);
665 }, emptyPushable(), l);
666}
667exports.reject = reject;
668function partition(predicate, l) {
669 return foldl(function (arr, a) {
670 return predicate(a) ? push(a, arr[0]) : push(a, arr[1]), arr;
671 }, [emptyPushable(), emptyPushable()], l);
672}
673exports.partition = partition;
674function join(separator, l) {
675 return foldl(function (a, b) {
676 return a.length === 0 ? b : a + separator + b;
677 }, "", l);
678}
679exports.join = join;
680function foldrSuffix(f, initial, array, length) {
681 var acc = initial;
682 for (var i = length - 1; 0 <= i; --i) {
683 acc = f(array[i], acc);
684 }
685 return acc;
686}
687function foldrPrefix(f, initial, array, length) {
688 var acc = initial;
689 for (var i = 0; i < length; ++i) {
690 acc = f(array[i], acc);
691 }
692 return acc;
693}
694function foldrNode(f, initial, _a, depth) {
695 var array = _a.array;
696 if (depth === 0) {
697 return foldrSuffix(f, initial, array, array.length);
698 }
699 var acc = initial;
700 for (var i = array.length - 1; 0 <= i; --i) {
701 acc = foldrNode(f, acc, array[i], depth - 1);
702 }
703 return acc;
704}
705function foldr(f, initial, l) {
706 var suffixSize = getSuffixSize(l);
707 var prefixSize = getPrefixSize(l);
708 var acc = foldrSuffix(f, initial, l.suffix, suffixSize);
709 if (l.root !== undefined) {
710 acc = foldrNode(f, acc, l.root, getDepth(l));
711 }
712 return foldrPrefix(f, acc, l.prefix, prefixSize);
713}
714exports.foldr = foldr;
715exports.reduceRight = foldr;
716function ap(listF, l) {
717 return flatten(map(function (f) {
718 return map(f, l);
719 }, listF));
720}
721exports.ap = ap;
722function flatten(nested) {
723 return foldl(concat, empty(), nested);
724}
725exports.flatten = flatten;
726function flatMap(f, l) {
727 return flatten(map(f, l));
728}
729exports.flatMap = flatMap;
730exports.chain = flatMap;
731function foldlArrayCb(cb, state, array, from, to) {
732 for (var i = from; i < to && cb(array[i], state); ++i) {}
733 return i === to;
734}
735function foldrArrayCb(cb, state, array, from, to) {
736 for (var i = from - 1; to <= i && cb(array[i], state); --i) {}
737 return i === to - 1;
738}
739function foldlNodeCb(cb, state, node, depth) {
740 var array = node.array;
741 if (depth === 0) {
742 return foldlArrayCb(cb, state, array, 0, array.length);
743 }
744 var to = array.length;
745 for (var i = 0; i < to; ++i) {
746 if (!foldlNodeCb(cb, state, array[i], depth - 1)) {
747 return false;
748 }
749 }
750 return true;
751}
752function foldlCb(cb, state, l) {
753 var prefixSize = getPrefixSize(l);
754 if (!foldrArrayCb(cb, state, l.prefix, prefixSize, 0) || l.root !== undefined && !foldlNodeCb(cb, state, l.root, getDepth(l))) {
755 return state;
756 }
757 var suffixSize = getSuffixSize(l);
758 foldlArrayCb(cb, state, l.suffix, 0, suffixSize);
759 return state;
760}
761function foldrNodeCb(cb, state, node, depth) {
762 var array = node.array;
763 if (depth === 0) {
764 return foldrArrayCb(cb, state, array, array.length, 0);
765 }
766 for (var i = array.length - 1; 0 <= i; --i) {
767 if (!foldrNodeCb(cb, state, array[i], depth - 1)) {
768 return false;
769 }
770 }
771 return true;
772}
773function foldrCb(cb, state, l) {
774 var suffixSize = getSuffixSize(l);
775 var prefixSize = getPrefixSize(l);
776 if (!foldrArrayCb(cb, state, l.suffix, suffixSize, 0) || l.root !== undefined && !foldrNodeCb(cb, state, l.root, getDepth(l))) {
777 return state;
778 }
779 var prefix = l.prefix;
780 foldlArrayCb(cb, state, l.prefix, prefix.length - prefixSize, prefix.length);
781 return state;
782}
783function everyCb(value, state) {
784 return state.result = state.predicate(value);
785}
786function every(predicate, l) {
787 return foldlCb(everyCb, { predicate: predicate, result: true }, l).result;
788}
789exports.every = every;
790exports.all = every;
791function someCb(value, state) {
792 return !(state.result = state.predicate(value));
793}
794function some(predicate, l) {
795 return foldlCb(someCb, { predicate: predicate, result: false }, l).result;
796}
797exports.some = some;
798exports.any = some;
799function none(predicate, l) {
800 return !some(predicate, l);
801}
802exports.none = none;
803function findCb(value, state) {
804 if (state.predicate(value)) {
805 state.result = value;
806 return false;
807 } else {
808 return true;
809 }
810}
811function find(predicate, l) {
812 return foldlCb(findCb, { predicate: predicate, result: undefined }, l).result;
813}
814exports.find = find;
815function findLast(predicate, l) {
816 return foldrCb(findCb, { predicate: predicate, result: undefined }, l).result;
817}
818exports.findLast = findLast;
819function indexOfCb(value, state) {
820 ++state.index;
821 return !(state.found = elementEquals(value, state.element));
822}
823function indexOf(element, l) {
824 var state = { element: element, found: false, index: -1 };
825 foldlCb(indexOfCb, state, l);
826 return state.found ? state.index : -1;
827}
828exports.indexOf = indexOf;
829function lastIndexOf(element, l) {
830 var state = { element: element, found: false, index: 0 };
831 foldrCb(indexOfCb, state, l);
832 return state.found ? l.length - state.index : -1;
833}
834exports.lastIndexOf = lastIndexOf;
835function findIndexCb(value, state) {
836 ++state.index;
837 return !(state.found = state.predicate(value));
838}
839function findIndex(predicate, l) {
840 var _a = foldlCb(findIndexCb, { predicate: predicate, found: false, index: -1 }, l),
841 found = _a.found,
842 index = _a.index;
843 return found ? index : -1;
844}
845exports.findIndex = findIndex;
846var containsState = {
847 element: undefined,
848 result: false
849};
850function containsCb(value, state) {
851 return !(state.result = value === state.element);
852}
853function includes(element, l) {
854 containsState.element = element;
855 containsState.result = false;
856 return foldlCb(containsCb, containsState, l).result;
857}
858exports.includes = includes;
859exports.contains = includes;
860function equalsCb(value2, state) {
861 var value = state.iterator.next().value;
862 return state.equals = state.f(value, value2);
863}
864function equals(l1, l2) {
865 return equalsWith(elementEquals, l1, l2);
866}
867exports.equals = equals;
868function equalsWith(f, l1, l2) {
869 if (l1 === l2) {
870 return true;
871 } else if (l1.length !== l2.length) {
872 return false;
873 } else {
874 var s = { iterator: l2[Symbol.iterator](), equals: true, f: f };
875 return foldlCb(equalsCb, s, l1).equals;
876 }
877}
878exports.equalsWith = equalsWith;
879var eMax = 2;
880function createConcatPlan(array) {
881 var sizes = [];
882 var sum = 0;
883 for (var i_2 = 0; i_2 < array.length; ++i_2) {
884 sum += array[i_2].array.length;
885 sizes[i_2] = array[i_2].array.length;
886 }
887 var optimalLength = Math.ceil(sum / branchingFactor);
888 var n = array.length;
889 var i = 0;
890 if (optimalLength + eMax >= n) {
891 return undefined;
892 }
893 while (optimalLength + eMax < n) {
894 while (sizes[i] > branchingFactor - eMax / 2) {
895 ++i;
896 }
897 var remaining = sizes[i];
898 do {
899 var size = Math.min(remaining + sizes[i + 1], branchingFactor);
900 sizes[i] = size;
901 remaining = remaining - (size - sizes[i + 1]);
902 ++i;
903 } while (remaining > 0);
904 for (var j = i; j <= n - 1; ++j) {
905 sizes[j] = sizes[j + 1];
906 }
907 --i;
908 --n;
909 }
910 sizes.length = n;
911 return sizes;
912}
913function concatNodeMerge(left, center, right) {
914 var array = [];
915 if (left !== undefined) {
916 for (var i = 0; i < left.array.length - 1; ++i) {
917 array.push(left.array[i]);
918 }
919 }
920 for (var i = 0; i < center.array.length; ++i) {
921 array.push(center.array[i]);
922 }
923 if (right !== undefined) {
924 for (var i = 1; i < right.array.length; ++i) {
925 array.push(right.array[i]);
926 }
927 }
928 return array;
929}
930function executeConcatPlan(merged, plan, height) {
931 var result = [];
932 var sourceIdx = 0;
933 var offset = 0;
934 for (var _i = 0, plan_1 = plan; _i < plan_1.length; _i++) {
935 var toMove = plan_1[_i];
936 var source = merged[sourceIdx].array;
937 if (toMove === source.length && offset === 0) {
938 result.push(merged[sourceIdx]);
939 ++sourceIdx;
940 } else {
941 var node = new Node(undefined, []);
942 while (toMove > 0) {
943 var available = source.length - offset;
944 var itemsToCopy = Math.min(toMove, available);
945 pushElements(source, node.array, offset, itemsToCopy);
946 if (toMove >= available) {
947 ++sourceIdx;
948 source = merged[sourceIdx].array;
949 offset = 0;
950 } else {
951 offset += itemsToCopy;
952 }
953 toMove -= itemsToCopy;
954 }
955 if (height > 1) {
956 setSizes(node, height - 1);
957 }
958 result.push(node);
959 }
960 }
961 return result;
962}
963function rebalance(left, center, right, height, top) {
964 var merged = concatNodeMerge(left, center, right);
965 var plan = createConcatPlan(merged);
966 var balanced = plan !== undefined ? executeConcatPlan(merged, plan, height) : merged;
967 if (balanced.length <= branchingFactor) {
968 if (top === true) {
969 return new Node(undefined, balanced);
970 } else {
971 return new Node(undefined, [setSizes(new Node(undefined, balanced), height)]);
972 }
973 } else {
974 return new Node(undefined, [setSizes(new Node(undefined, balanced.slice(0, branchingFactor)), height), setSizes(new Node(undefined, balanced.slice(branchingFactor)), height)]);
975 }
976}
977function concatSubTree(left, lDepth, right, rDepth, isTop) {
978 if (lDepth > rDepth) {
979 var c = concatSubTree(arrayLast(left.array), lDepth - 1, right, rDepth, false);
980 return rebalance(left, c, undefined, lDepth, isTop);
981 } else if (lDepth < rDepth) {
982 var c = concatSubTree(left, lDepth, arrayFirst(right.array), rDepth - 1, false);
983 return rebalance(undefined, c, right, rDepth, isTop);
984 } else if (lDepth === 0) {
985 return new Node(undefined, [left, right]);
986 } else {
987 var c = concatSubTree(arrayLast(left.array), lDepth - 1, arrayFirst(right.array), rDepth - 1, false);
988 return rebalance(left, c, right, lDepth, isTop);
989 }
990}
991function getHeight(node) {
992 if (node.array[0] instanceof Node) {
993 return 1 + getHeight(node.array[0]);
994 } else {
995 return 0;
996 }
997}
998function appendNodeToTree(l, array) {
999 if (l.root === undefined) {
1000 if (getPrefixSize(l) === 0) {
1001 l.bits = setPrefix(array.length, l.bits);
1002 l.prefix = reverseArray(array);
1003 } else {
1004 l.root = new Node(undefined, array);
1005 }
1006 return l;
1007 }
1008 var depth = getDepth(l);
1009 var index = handleOffset(depth, l.offset, l.length - 1 - getPrefixSize(l));
1010 var nodesToCopy = 0;
1011 var nodesVisited = 0;
1012 var shift = depth * 5;
1013 var currentNode = l.root;
1014 if (Math.pow(32, depth + 1) < index) {
1015 shift = 0;
1016 nodesVisited = depth;
1017 }
1018 while (shift > 5) {
1019 var childIndex = void 0;
1020 if (currentNode.sizes === undefined) {
1021 childIndex = index >> shift & mask;
1022 index &= ~(mask << shift);
1023 } else {
1024 childIndex = currentNode.array.length - 1;
1025 index -= currentNode.sizes[childIndex - 1];
1026 }
1027 nodesVisited++;
1028 if (childIndex < mask) {
1029 nodesToCopy = nodesVisited;
1030 }
1031 currentNode = currentNode.array[childIndex];
1032 if (currentNode === undefined) {
1033 nodesToCopy = nodesVisited;
1034 shift = 5;
1035 }
1036 shift -= 5;
1037 }
1038 if (shift !== 0) {
1039 nodesVisited++;
1040 if (currentNode.array.length < branchingFactor) {
1041 nodesToCopy = nodesVisited;
1042 }
1043 }
1044 var node = new Node(undefined, array);
1045 if (nodesToCopy === 0) {
1046 var newPath = nodesVisited === 0 ? node : createPath(nodesVisited, node);
1047 var newRoot = new Node(undefined, [l.root, newPath]);
1048 l.root = newRoot;
1049 l.bits = incrementDepth(l.bits);
1050 } else {
1051 var copiedNode = copyFirstK(l, nodesToCopy, array.length);
1052 copiedNode.array.push(createPath(depth - nodesToCopy, node));
1053 }
1054 return l;
1055}
1056function copyFirstK(newList, k, leafSize) {
1057 var currentNode = cloneNode(newList.root);
1058 newList.root = currentNode;
1059 for (var i = 1; i < k; ++i) {
1060 var index = currentNode.array.length - 1;
1061 if (currentNode.sizes !== undefined) {
1062 currentNode.sizes[index] += leafSize;
1063 }
1064 var newNode = cloneNode(currentNode.array[index]);
1065 currentNode.array[index] = newNode;
1066 currentNode = newNode;
1067 }
1068 if (currentNode.sizes !== undefined) {
1069 currentNode.sizes.push(arrayLast(currentNode.sizes) + leafSize);
1070 }
1071 return currentNode;
1072}
1073var concatBuffer = /*#__PURE__*/new Array(3);
1074function concatAffixes(left, right) {
1075 var nr = 0;
1076 var arrIdx = 0;
1077 var i = 0;
1078 var length = getSuffixSize(left);
1079 concatBuffer[nr] = [];
1080 for (i = 0; i < length; ++i) {
1081 concatBuffer[nr][arrIdx++] = left.suffix[i];
1082 }
1083 length = getPrefixSize(right);
1084 for (i = 0; i < length; ++i) {
1085 if (arrIdx === 32) {
1086 arrIdx = 0;
1087 ++nr;
1088 concatBuffer[nr] = [];
1089 }
1090 concatBuffer[nr][arrIdx++] = right.prefix[length - 1 - i];
1091 }
1092 length = getSuffixSize(right);
1093 for (i = 0; i < length; ++i) {
1094 if (arrIdx === 32) {
1095 arrIdx = 0;
1096 ++nr;
1097 concatBuffer[nr] = [];
1098 }
1099 concatBuffer[nr][arrIdx++] = right.suffix[i];
1100 }
1101 return nr;
1102}
1103function concat(left, right) {
1104 if (left.length === 0) {
1105 return right;
1106 } else if (right.length === 0) {
1107 return left;
1108 }
1109 var newSize = left.length + right.length;
1110 var rightSuffixSize = getSuffixSize(right);
1111 var newList = cloneList(left);
1112 if (right.root === undefined) {
1113 var nrOfAffixes = concatAffixes(left, right);
1114 for (var i = 0; i < nrOfAffixes; ++i) {
1115 newList = appendNodeToTree(newList, concatBuffer[i]);
1116 newList.length += concatBuffer[i].length;
1117 concatBuffer[i] = undefined;
1118 }
1119 newList.length = newSize;
1120 newList.suffix = concatBuffer[nrOfAffixes];
1121 newList.bits = setSuffix(concatBuffer[nrOfAffixes].length, newList.bits);
1122 concatBuffer[nrOfAffixes] = undefined;
1123 return newList;
1124 } else {
1125 var leftSuffixSize = getSuffixSize(left);
1126 if (leftSuffixSize > 0) {
1127 newList = appendNodeToTree(newList, left.suffix.slice(0, leftSuffixSize));
1128 newList.length += leftSuffixSize;
1129 }
1130 newList = appendNodeToTree(newList, right.prefix.slice(0, getPrefixSize(right)).reverse());
1131 var newNode = concatSubTree(newList.root, getDepth(newList), right.root, getDepth(right), true);
1132 var newDepth = getHeight(newNode);
1133 setSizes(newNode, newDepth);
1134 newList.root = newNode;
1135 newList.offset &= ~(mask << getDepth(left) * branchBits);
1136 newList.length = newSize;
1137 newList.bits = setSuffix(rightSuffixSize, setDepth(newDepth, newList.bits));
1138 newList.suffix = right.suffix;
1139 return newList;
1140 }
1141}
1142exports.concat = concat;
1143function update(index, a, l) {
1144 if (index < 0 || l.length <= index) {
1145 return l;
1146 }
1147 var prefixSize = getPrefixSize(l);
1148 var suffixSize = getSuffixSize(l);
1149 var newList = cloneList(l);
1150 if (index < prefixSize) {
1151 var newPrefix = copyArray(newList.prefix);
1152 newPrefix[newPrefix.length - index - 1] = a;
1153 newList.prefix = newPrefix;
1154 } else if (index >= l.length - suffixSize) {
1155 var newSuffix = copyArray(newList.suffix);
1156 newSuffix[index - (l.length - suffixSize)] = a;
1157 newList.suffix = newSuffix;
1158 } else {
1159 newList.root = updateNode(l.root, getDepth(l), index - prefixSize, l.offset, a);
1160 }
1161 return newList;
1162}
1163exports.update = update;
1164function adjust(index, f, l) {
1165 if (index < 0 || l.length <= index) {
1166 return l;
1167 }
1168 return update(index, f(nth(index, l)), l);
1169}
1170exports.adjust = adjust;
1171var newAffix;
1172function sliceNode(node, index, depth, pathLeft, pathRight, childLeft, childRight) {
1173 var array = node.array.slice(pathLeft, pathRight + 1);
1174 if (childLeft !== undefined) {
1175 array[0] = childLeft;
1176 }
1177 if (childRight !== undefined) {
1178 array[array.length - 1] = childRight;
1179 }
1180 var sizes = node.sizes;
1181 if (sizes !== undefined) {
1182 sizes = sizes.slice(pathLeft, pathRight + 1);
1183 var slicedOffLeft = pathLeft !== 0 ? node.sizes[pathLeft - 1] : 0;
1184 if (childLeft !== undefined) {
1185 if (childLeft.sizes !== undefined) {
1186 var oldChild = node.array[pathLeft];
1187 slicedOffLeft += arrayLast(oldChild.sizes) - arrayLast(childLeft.sizes);
1188 } else {
1189 slicedOffLeft += (index - slicedOffLeft & ~31) + 32;
1190 }
1191 }
1192 for (var i = 0; i < sizes.length; ++i) {
1193 sizes[i] -= slicedOffLeft;
1194 }
1195 if (childRight !== undefined) {
1196 var slicedOffRight = sizeOfSubtree(node.array[pathRight], depth - 1) - sizeOfSubtree(childRight, depth - 1);
1197 sizes[sizes.length - 1] -= slicedOffRight;
1198 }
1199 }
1200 return new Node(sizes, array);
1201}
1202var newOffset = 0;
1203function sliceLeft(tree, depth, index, offset, top) {
1204 var _a = getPath(index, offset, depth, tree.sizes),
1205 path = _a.path,
1206 newIndex = _a.index,
1207 updatedOffset = _a.updatedOffset;
1208 if (depth === 0) {
1209 newAffix = tree.array.slice(path).reverse();
1210 return undefined;
1211 } else {
1212 var child = sliceLeft(tree.array[path], depth - 1, newIndex, updatedOffset, false);
1213 if (child === undefined) {
1214 ++path;
1215 if (path === tree.array.length) {
1216 return undefined;
1217 }
1218 }
1219 if (tree.sizes === undefined && top === false) {
1220 newOffset |= 32 - (tree.array.length - path) << depth * branchBits;
1221 }
1222 return sliceNode(tree, index, depth, path, tree.array.length - 1, child, undefined);
1223 }
1224}
1225function sliceRight(node, depth, index, offset) {
1226 var _a = getPath(index, offset, depth, node.sizes),
1227 path = _a.path,
1228 newIndex = _a.index;
1229 if (depth === 0) {
1230 newAffix = node.array.slice(0, path + 1);
1231 return undefined;
1232 } else {
1233 var child = sliceRight(node.array[path], depth - 1, newIndex, path === 0 ? offset : 0);
1234 if (child === undefined) {
1235 --path;
1236 if (path === -1) {
1237 return undefined;
1238 }
1239 }
1240 var array = node.array.slice(0, path + 1);
1241 if (child !== undefined) {
1242 array[array.length - 1] = child;
1243 }
1244 var sizes = node.sizes;
1245 if (sizes !== undefined) {
1246 sizes = sizes.slice(0, path + 1);
1247 if (child !== undefined) {
1248 var slicedOff = sizeOfSubtree(node.array[path], depth - 1) - sizeOfSubtree(child, depth - 1);
1249 sizes[sizes.length - 1] -= slicedOff;
1250 }
1251 }
1252 return new Node(sizes, array);
1253 }
1254}
1255function sliceTreeList(from, to, tree, depth, offset, l) {
1256 var sizes = tree.sizes;
1257 var _a = getPath(from, offset, depth, sizes),
1258 pathLeft = _a.path,
1259 newFrom = _a.index;
1260 var _b = getPath(to, offset, depth, sizes),
1261 pathRight = _b.path,
1262 newTo = _b.index;
1263 if (depth === 0) {
1264 l.prefix = emptyAffix;
1265 l.suffix = tree.array.slice(pathLeft, pathRight + 1);
1266 l.root = undefined;
1267 l.bits = setSuffix(pathRight - pathLeft + 1, 0);
1268 return l;
1269 } else if (pathLeft === pathRight) {
1270 l.bits = decrementDepth(l.bits);
1271 return sliceTreeList(newFrom, newTo, tree.array[pathLeft], depth - 1, pathLeft === 0 ? offset : 0, l);
1272 } else {
1273 var childRight = sliceRight(tree.array[pathRight], depth - 1, newTo, 0);
1274 l.bits = setSuffix(newAffix.length, l.bits);
1275 l.suffix = newAffix;
1276 if (childRight === undefined) {
1277 --pathRight;
1278 }
1279 newOffset = 0;
1280 var childLeft = sliceLeft(tree.array[pathLeft], depth - 1, newFrom, pathLeft === 0 ? offset : 0, pathLeft === pathRight);
1281 l.offset = newOffset;
1282 l.bits = setPrefix(newAffix.length, l.bits);
1283 l.prefix = newAffix;
1284 if (childLeft === undefined) {
1285 ++pathLeft;
1286 }
1287 if (pathLeft >= pathRight) {
1288 if (pathLeft > pathRight) {
1289 l.bits = setDepth(0, l.bits);
1290 l.root = undefined;
1291 } else {
1292 l.bits = decrementDepth(l.bits);
1293 var newRoot = childRight !== undefined ? childRight : childLeft !== undefined ? childLeft : tree.array[pathLeft];
1294 l.root = new Node(newRoot.sizes, newRoot.array);
1295 }
1296 } else {
1297 l.root = sliceNode(tree, from, depth, pathLeft, pathRight, childLeft, childRight);
1298 }
1299 return l;
1300 }
1301}
1302function slice(from, to, l) {
1303 var bits = l.bits,
1304 length = l.length;
1305 to = Math.min(length, to);
1306 if (from < 0) {
1307 from = length + from;
1308 }
1309 if (to < 0) {
1310 to = length + to;
1311 }
1312 if (to <= from || to <= 0 || length <= from) {
1313 return empty();
1314 }
1315 if (from <= 0 && length <= to) {
1316 return l;
1317 }
1318 var newLength = to - from;
1319 var prefixSize = getPrefixSize(l);
1320 var suffixSize = getSuffixSize(l);
1321 if (to <= prefixSize) {
1322 return new List(setPrefix(newLength, 0), 0, newLength, l.prefix.slice(prefixSize - to, prefixSize - from), undefined, emptyAffix);
1323 }
1324 var suffixStart = length - suffixSize;
1325 if (suffixStart <= from) {
1326 return new List(setSuffix(newLength, 0), 0, newLength, emptyAffix, undefined, l.suffix.slice(from - suffixStart, to - suffixStart));
1327 }
1328 var newList = cloneList(l);
1329 newList.length = newLength;
1330 if (prefixSize <= from && to <= suffixStart) {
1331 sliceTreeList(from - prefixSize + l.offset, to - prefixSize + l.offset - 1, l.root, getDepth(l), l.offset, newList);
1332 return newList;
1333 }
1334 if (0 < from) {
1335 if (from < prefixSize) {
1336 newList.prefix = l.prefix.slice(0, prefixSize - from);
1337 bits = setPrefix(prefixSize - from, bits);
1338 } else {
1339 newOffset = 0;
1340 newList.root = sliceLeft(newList.root, getDepth(l), from - prefixSize, l.offset, true);
1341 newList.offset = newOffset;
1342 if (newList.root === undefined) {
1343 bits = setDepth(0, bits);
1344 }
1345 bits = setPrefix(newAffix.length, bits);
1346 prefixSize = newAffix.length;
1347 newList.prefix = newAffix;
1348 }
1349 }
1350 if (to < length) {
1351 if (length - to < suffixSize) {
1352 bits = setSuffix(suffixSize - (length - to), bits);
1353 newList.suffix = l.suffix.slice(0, suffixSize - (length - to));
1354 } else {
1355 newList.root = sliceRight(newList.root, getDepth(l), to - prefixSize - 1, newList.offset);
1356 if (newList.root === undefined) {
1357 bits = setDepth(0, bits);
1358 newList.offset = 0;
1359 }
1360 bits = setSuffix(newAffix.length, bits);
1361 newList.suffix = newAffix;
1362 }
1363 }
1364 newList.bits = bits;
1365 return newList;
1366}
1367exports.slice = slice;
1368function take(n, l) {
1369 return slice(0, n, l);
1370}
1371exports.take = take;
1372function findNotIndexCb(value, state) {
1373 if (state.predicate(value)) {
1374 ++state.index;
1375 return true;
1376 } else {
1377 return false;
1378 }
1379}
1380function takeWhile(predicate, l) {
1381 var index = foldlCb(findNotIndexCb, { predicate: predicate, index: 0 }, l).index;
1382 return slice(0, index, l);
1383}
1384exports.takeWhile = takeWhile;
1385function takeLastWhile(predicate, l) {
1386 var index = foldrCb(findNotIndexCb, { predicate: predicate, index: 0 }, l).index;
1387 return slice(l.length - index, l.length, l);
1388}
1389exports.takeLastWhile = takeLastWhile;
1390function dropWhile(predicate, l) {
1391 var index = foldlCb(findNotIndexCb, { predicate: predicate, index: 0 }, l).index;
1392 return slice(index, l.length, l);
1393}
1394exports.dropWhile = dropWhile;
1395function dropRepeats(l) {
1396 return dropRepeatsWith(elementEquals, l);
1397}
1398exports.dropRepeats = dropRepeats;
1399function dropRepeatsWith(predicate, l) {
1400 return foldl(function (acc, a) {
1401 return acc.length !== 0 && predicate(last(acc), a) ? acc : push(a, acc);
1402 }, emptyPushable(), l);
1403}
1404exports.dropRepeatsWith = dropRepeatsWith;
1405function takeLast(n, l) {
1406 return slice(l.length - n, l.length, l);
1407}
1408exports.takeLast = takeLast;
1409function splitAt(index, l) {
1410 return [slice(0, index, l), slice(index, l.length, l)];
1411}
1412exports.splitAt = splitAt;
1413function splitWhen(predicate, l) {
1414 var idx = findIndex(predicate, l);
1415 return idx === -1 ? [l, empty()] : splitAt(idx, l);
1416}
1417exports.splitWhen = splitWhen;
1418function splitEvery(size, l) {
1419 var _a = foldl(function (_a, elm) {
1420 var l2 = _a.l2,
1421 buffer = _a.buffer;
1422 push(elm, buffer);
1423 if (buffer.length === size) {
1424 return { l2: push(buffer, l2), buffer: emptyPushable() };
1425 } else {
1426 return { l2: l2, buffer: buffer };
1427 }
1428 }, { l2: emptyPushable(), buffer: emptyPushable() }, l),
1429 l2 = _a.l2,
1430 buffer = _a.buffer;
1431 return buffer.length === 0 ? l2 : push(buffer, l2);
1432}
1433exports.splitEvery = splitEvery;
1434function remove(from, amount, l) {
1435 return concat(slice(0, from, l), slice(from + amount, l.length, l));
1436}
1437exports.remove = remove;
1438function drop(n, l) {
1439 return slice(n, l.length, l);
1440}
1441exports.drop = drop;
1442function dropLast(n, l) {
1443 return slice(0, l.length - n, l);
1444}
1445exports.dropLast = dropLast;
1446function pop(l) {
1447 return slice(0, -1, l);
1448}
1449exports.pop = pop;
1450exports.init = pop;
1451function tail(l) {
1452 return slice(1, l.length, l);
1453}
1454exports.tail = tail;
1455function arrayPush(array, a) {
1456 array.push(a);
1457 return array;
1458}
1459function toArray(l) {
1460 return foldl(arrayPush, [], l);
1461}
1462exports.toArray = toArray;
1463function insert(index, element, l) {
1464 return concat(append(element, slice(0, index, l)), slice(index, l.length, l));
1465}
1466exports.insert = insert;
1467function insertAll(index, elements, l) {
1468 return concat(concat(slice(0, index, l), elements), slice(index, l.length, l));
1469}
1470exports.insertAll = insertAll;
1471function reverse(l) {
1472 return foldl(function (newL, element) {
1473 return prepend(element, newL);
1474 }, empty(), l);
1475}
1476exports.reverse = reverse;
1477function isList(l) {
1478 return typeof l === "object" && Array.isArray(l.suffix);
1479}
1480exports.isList = isList;
1481function zip(as, bs) {
1482 return zipWith(function (a, b) {
1483 return [a, b];
1484 }, as, bs);
1485}
1486exports.zip = zip;
1487function zipWith(f, as, bs) {
1488 var swapped = bs.length < as.length;
1489 var iterator = (swapped ? as : bs)[Symbol.iterator]();
1490 return map(function (a) {
1491 var b = iterator.next().value;
1492 return swapped ? f(b, a) : f(a, b);
1493 }, swapped ? bs : as);
1494}
1495exports.zipWith = zipWith;
1496function isPrimitive(value) {
1497 return typeof value === "number" || typeof value === "string";
1498}
1499function comparePrimitive(a, b) {
1500 return a === b ? 0 : a < b ? -1 : 1;
1501}
1502var ord = "fantasy-land/lte";
1503function compareOrd(a, b) {
1504 return a[ord](b) ? b[ord](a) ? 0 : -1 : 1;
1505}
1506function sort(l) {
1507 if (l.length === 0) {
1508 return l;
1509 } else if (isPrimitive(first(l))) {
1510 return from(toArray(l).sort(comparePrimitive));
1511 } else {
1512 return sortWith(compareOrd, l);
1513 }
1514}
1515exports.sort = sort;
1516function sortWith(comparator, l) {
1517 var arr = [];
1518 var i = 0;
1519 forEach(function (elm) {
1520 return arr.push({ idx: i++, elm: elm });
1521 }, l);
1522 arr.sort(function (_a, _b) {
1523 var a = _a.elm,
1524 i = _a.idx;
1525 var b = _b.elm,
1526 j = _b.idx;
1527 var c = comparator(a, b);
1528 return c !== 0 ? c : i < j ? -1 : 1;
1529 });
1530 var newL = emptyPushable();
1531 for (var i_3 = 0; i_3 < arr.length; ++i_3) {
1532 push(arr[i_3].elm, newL);
1533 }
1534 return newL;
1535}
1536exports.sortWith = sortWith;
1537function sortBy(f, l) {
1538 if (l.length === 0) {
1539 return l;
1540 }
1541 var arr = [];
1542 var i = 0;
1543 forEach(function (elm) {
1544 return arr.push({ idx: i++, elm: elm, prop: f(elm) });
1545 }, l);
1546 var comparator = isPrimitive(arr[0].prop) ? comparePrimitive : compareOrd;
1547 arr.sort(function (_a, _b) {
1548 var a = _a.prop,
1549 i = _a.idx;
1550 var b = _b.prop,
1551 j = _b.idx;
1552 var c = comparator(a, b);
1553 return c !== 0 ? c : i < j ? -1 : 1;
1554 });
1555 var newL = emptyPushable();
1556 for (var i_4 = 0; i_4 < arr.length; ++i_4) {
1557 push(arr[i_4].elm, newL);
1558 }
1559 return newL;
1560}
1561exports.sortBy = sortBy;
1562function group(l) {
1563 return groupWith(elementEquals, l);
1564}
1565exports.group = group;
1566function groupWith(f, l) {
1567 var result = emptyPushable();
1568 var buffer = emptyPushable();
1569 forEach(function (a) {
1570 if (buffer.length !== 0 && !f(last(buffer), a)) {
1571 push(buffer, result);
1572 buffer = emptyPushable();
1573 }
1574 push(a, buffer);
1575 }, l);
1576 return buffer.length === 0 ? result : push(buffer, result);
1577}
1578exports.groupWith = groupWith;
1579function intersperse(separator, l) {
1580 return pop(foldl(function (l2, a) {
1581 return push(separator, push(a, l2));
1582 }, emptyPushable(), l));
1583}
1584exports.intersperse = intersperse;
1585function isEmpty(l) {
1586 return l.length === 0;
1587}
1588exports.isEmpty = isEmpty;
\No newline at end of file