UNPKG

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