UNPKG

extra-iterable

Version:

An iterable is a sequence of values.

1,428 lines (1,423 loc) 32.9 kB
'use strict'; function IDENTITY(v) { return v; } function COMPARE(a, b) { return a < b ? -1 : (a > b ? 1 : 0); } function mod(x, y) { return x - y * Math.floor(x / y); } const END = Number.MAX_SAFE_INTEGER; const EMPTY = [].values(); function toSet(x, fm = null) { if (!fm) return new Set(x); var a = new Set(), i = -1; for (var v of x) a.add(fm(v, ++i, x)); return a; } function is(v) { return v != null && typeof v[Symbol.iterator] === "function"; } function isIterator(v) { return v != null && typeof v.next === "function"; } function isList(v) { return is(v) && typeof v !== "string"; } function iterator(x) { return x[Symbol.iterator](); } function* keys(x) { var i = -1; for (var _ of x) yield ++i; } function* values(x) { yield* x; } function* entries(x) { var i = -1; for (var v of x) yield [++i, v]; } function from(x) { if (is(x)) return x; return fromIterator(x); } function fromIterator(x) { return { [Symbol.iterator]: () => x }; } function* fromRange(v = 0, V = END, dv = 1) { for (var n = 0, N = (V - v) / dv; n < N; ++n, v += dv) yield v; } function* fromInvocation(fn, ...args) { for (;;) yield fn(...args); } function* fromApplication(fm, v) { yield v; for (var i = 1;; ++i) yield v = fm(v, i, null); } function isOnce(x) { return x[Symbol.iterator]() === x; } function isMany(x) { return !isOnce(x); } function toMany(x, now = false) { if (!isOnce(x)) return x; return now ? Array.from(x) : toManyLate(x[Symbol.iterator](), []); } function toManyLate(ix, a) { return { [Symbol.iterator]: () => { var i = -1; return { next: () => { if (++i < a.length) return { value: a[i], done: false }; var { value, done } = ix.next(); if (!done) a[i] = value; return { value, done }; } }; } }; } function toInvokable(x) { var ix = x[Symbol.iterator](); return () => ix.next().value; } function isEmpty(x) { for (var _ of x) return false; return true; } function length(x, i = 0, I = END) { var j = -1, n = 0; for (var _ of x) if (++j >= i && j < I) ++n; return n; } function index(x, i) { var X = length(x); return i >= 0 ? Math.min(i, X) : Math.max(X + i, 0); } function indexRange(x, i = 0, I = END) { var X = length(x); var i = i >= 0 ? Math.min(i, X) : Math.max(X + i, 0); var I = I >= 0 ? Math.min(I, X) : Math.max(X + I, 0); return [i, Math.max(i, I)]; } function compare(x, y, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var ix = x[Symbol.iterator](); var iy = y[Symbol.iterator](); for (var i = 0;; ++i) { var u = ix.next(); var v = iy.next(); if (u.done || v.done) break; var u1 = fm(u.value, i, x); var v1 = fm(v.value, i, y); var c = fc(u1, v1); if (c !== 0) return c; } return (v.done ? 1 : 0) - (u.done ? 1 : 0); } function isEqual(x, y, fc = null, fm = null) { return compare(x, y, fc, fm) === 0; } function get(x, i) { var j = -1; for (var v of x) if (++j === i) return v; } function* getAll(x, is) { var i = 0, j = -1; var IS = is.length; for (var v of x) { if (is[i] !== ++j) continue; do { yield v; } while (++i < IS && is[i] === is[i - 1]); if (i >= IS) break; } for (; i < IS; ++i) yield; } function getPath(x, p) { for (var i of p) x = is(x) ? get(x, i) : undefined; return x; } function hasPath(x, p) { return getPath(x, p) !== undefined; } function* set(x, i, v) { var j = -1; for (var u of x) yield ++j === i ? v : u; if (j >= i) return; for (; ++j < i;) yield; yield v; } function* swap(x, i, j) { if (i === j) { yield* x; return; } var k = Math.min(i, j); var l = Math.max(i, j); var mid = []; var vk, i = -1; for (var v of x) { if (++i < k || i > l) yield v; else if (i === k) vk = v; else if (i < l) mid.push(v); else { yield v; yield* mid; yield vk; mid = null; } } } function* remove(x, i) { yield* splice(x, i, 1); } function count(x, ft) { var i = -1, a = 0; for (var v of x) if (ft(v, ++i, x)) ++a; return a; } function countAs(x, fm = null) { var fm = fm || IDENTITY; var i = -1, a = new Map(); for (var v of x) { var v1 = fm(v, ++i, x); a.set(v1, (a.get(v1) || 0) + 1); } return a; } function min(x, fc = null, fm = null) { return rangeEntries(x, fc, fm)[0][1]; } function max(x, fc = null, fm = null) { return rangeEntries(x, fc, fm)[1][1]; } function range(x, fc = null, fm = null) { var [a, b] = rangeEntries(x, fc, fm); return [a[1], b[1]]; } function minEntry(x, fc = null, fm = null) { return rangeEntries(x, fc, fm)[0]; } function maxEntry(x, fc = null, fm = null) { return rangeEntries(x, fc, fm)[1]; } function rangeEntries(x, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var mi = -1, mu, mv; var ni = -1, nu, nv; var i = -1; for (var u of x) { var v = fm(u, ++i, x); if (i === 0 || fc(v, mv) < 0) { mi = i; mu = u; mv = v; } if (i === 0 || fc(v, nv) > 0) { ni = i; nu = u; nv = v; } } return [[mi, mu], [ni, nu]]; } function slice(x, i = 0, I = END) { if (i >= 0 && I >= 0) return slicePos(x, i, I); else if (i >= 0 && I < 0) return slicePosNeg(x, i, I); else return sliceNeg(x, i, I); } function* slicePos(x, i, I) { var k = -1; for (var v of x) { if (++k >= I) break; if (k >= i) yield v; } } function* slicePosNeg(x, i, I) { var j = 0, k = -1; var a = [], A = -I; for (var v of x) { if (++k < i) continue; if (a.length >= A) yield a[j]; a[j] = v; j = (j + 1) % A; } } function* sliceNeg(x, i, I) { var j = 0, X = 0; var a = [], A = -i; for (var v of x) { a[j] = v; j = (j + 1) % A; ++X; } var i = Math.max(X + i, 0); var I = I < 0 ? Math.max(X + I, 0) : Math.min(I, X); var n = Math.max(I - i, 0); var J = Math.max(j + n - A, 0); yield* a.slice(j, j + n); yield* a.slice(0, J); } function head(x, vd) { for (var v of x) return v; return vd; } function last(x, vd) { var v = vd; for (var v of x) ; return v; } function* tail(x) { var i = -1; for (var v of x) if (++i > 0) yield v; } function* init(x) { var u, i = -1; for (var v of x) { if (++i > 0) yield u; u = v; } } function left(x, n) { return slice(x, 0, n); } function right(x, n) { return n !== 0 ? slice(x, -n) : EMPTY; } function middle(x, i, n = 1) { return slice(x, i, i + n); } function take(x, n = 1) { return slice(x, 0, n); } function takeRight(x, n = 1) { return n > 0 ? slice(x, -n) : EMPTY; } function* takeWhile(x, ft) { var i = -1; for (var v of x) { if (ft(v, ++i, x)) yield v; else return; } } function* takeWhileRight(x, ft) { var a = [], i = -1; for (var v of x) { if (ft(v, ++i, x)) a.push(v); else a.length = 0; } yield* a; } function drop(x, n = 1) { return slice(x, n); } function dropRight(x, n = 1) { return n > 0 ? slice(x, 0, -n) : values(x); } function* dropWhile(x, ft) { var c = true, i = -1; for (var v of x) { c = c && ft(v, ++i, x); if (!c) yield v; } } function* dropWhileRight(x, ft) { var a = [], i = -1; for (var v of x) { if (ft(v, ++i, x)) a.push(v); else { yield* a; yield v; a.length = 0; } } } function includes(x, v, i = 0) { return hasValue(slice(x, i), v); } function indexOf(x, v, i = 0) { var a = searchValue(slice(x, i), v); return a >= 0 ? a + i : a; } function lastIndexOf(x, v, i = END - 1) { return searchValueRight(slice(x, 0, i + 1), v); } function find(x, ft) { var i = -1; for (var v of x) if (ft(v, ++i, x)) return v; } function findRight(x, ft) { var i = -1, a; for (var v of x) if (ft(v, ++i, x)) a = v; return a; } function scanWhile(x, ft) { var i = -1; for (var v of x) if (!ft(v, ++i, x)) return i; return ++i; } function scanWhileRight(x, ft) { var a = -1, i = -1; for (var v of x) if (!ft(v, ++i, x)) a = i; return ++a; } function scanUntil(x, ft) { var i = -1; for (var v of x) if (ft(v, ++i, x)) return i; return ++i; } function scanUntilRight(x, ft) { var a = -1, i = -1; for (var v of x) if (ft(v, ++i, x)) a = i; return ++a; } function search(x, ft) { var i = -1; for (var v of x) if (ft(v, ++i, x)) return i; return -1; } function searchRight(x, ft) { var i = -1, a = -1; for (var v of x) if (ft(v, ++i, x)) a = i; return a; } function* searchAll(x, ft) { var i = -1; for (var v of x) if (ft(v, ++i, x)) yield i; } function searchValue(x, v, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var v1 = fm(v, 0, null), i = -1; for (var u of x) { var u1 = fm(u, ++i, x); if (fc(u1, v1) === 0) return i; } return -1; } function searchValueRight(x, v, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var v1 = fm(v, 0, null); var i = -1, a = -1; for (var u of x) { var u1 = fm(u, ++i, x); if (fc(u1, v1) === 0) a = i; } return a; } function* searchValueAll(x, v, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var v1 = fm(v, 0, null), i = -1; for (var u of x) { var u1 = fm(u, ++i, x); if (fc(u1, v1) === 0) yield i; } } function searchInfix(x, y, fc = null, fm = null) { return head(searchInfixAll(x, y, fc, fm), -1); } function searchInfixRight(x, y, fc = null, fm = null) { return last(searchInfixAll(x, y, fc, fm), -1); } function* searchInfixAll(x, y, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var y1 = [...map(y, fm)]; var Y = y1.length; if (Y === 0) { yield* fromRange(0, length(x)); return; } var m = new Array(Y).fill(false); var i = -1, J = 0; for (var u of x) { var u1 = fm(u, ++i, x); for (var j = J; j > 0; --j) m[j] = m[j - 1] && fc(u1, y1[j]) === 0; m[0] = fc(u1, y1[0]) === 0; J = Math.min(J + 1, Y - 1); if (m[Y - 1]) yield i - Y + 1; } } function searchSubsequence(x, y, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var y1 = [...map(y, fm)]; var Y = y1.length; if (Y === 0) return 0; var si = [], sn = [], i = -1; for (var u of x) { var u1 = fm(u, ++i, x); for (var s = 0, S = si.length; s < S; ++s) { var v1 = y1[sn[s]]; if (fc(u1, v1) !== 0) continue; if (++sn[s] === Y) return si[s]; } var v1 = y1[0]; if (fc(u1, v1) !== 0) continue; si.push(i); sn.push(1); } return -1; } function hasValue(x, v, fc = null, fm = null) { return searchValue(x, v, fc, fm) >= 0; } function hasPrefix(x, y, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var ix = x[Symbol.iterator](), i = -1; for (var v of y) { var a = ix.next(); if (a.done) return false; var u1 = fm(a.value, ++i, x); var v1 = fm(v, i, y); if (fc(u1, v1) !== 0) return false; } return true; } function hasSuffix(x, y, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var y1 = Array.isArray(y) ? y : [...y]; var Y = y1.length; var a = [], k = 0, n = 0; if (Y === 0) return true; for (var u of x) { a[k++ % Y] = u; ++n; } if (a.length < Y) return false; for (var i = 0, j = n - Y; i < Y; ++i, ++j) { var u1 = fm(a[k++ % Y], j, x); var v1 = fm(y1[i], i, y); if (fc(u1, v1) !== 0) return false; } return true; } function hasInfix(x, y, fc = null, fm = null) { return searchInfix(x, y, fc, fm) >= 0; } function hasSubsequence(x, y, fc = null, fm = null) { return searchSubsequence(x, y, fc, fm) >= 0; } function forEach(x, fp) { var i = -1; for (var v of x) fp(v, ++i, x); } function some(x, ft = null) { if (ft) return someTest(x, ft); else return someBoolean(x); } function someBoolean(x) { for (var v of x) if (v) return true; return false; } function someTest(x, ft) { var i = -1; for (var v of x) if (ft(v, ++i, x)) return true; return false; } function every(x, ft = null) { if (ft) return everyTest(x, ft); else return everyBoolean(x); } function everyBoolean(x) { for (var v of x) if (!v) return false; return true; } function everyTest(x, ft) { var i = -1; for (var v of x) if (!ft(v, ++i, x)) return false; return true; } function* map(x, fm) { var i = -1; for (var v of x) yield fm(v, ++i, x); } function reduce(x, fr, acc) { var init = arguments.length <= 2, i = -1; for (var v of x) { if (init) { init = false; acc = v; ++i; } else acc = fr(acc, v, ++i, x); } return acc; } function* filter(x, ft) { var i = -1; for (var v of x) if (ft(v, ++i, x)) yield v; } function* filterAt(x, is) { var i = -1; for (var v of x) if (is.includes(++i)) yield v; } function* reject(x, ft) { var i = -1; for (var v of x) if (!ft(v, ++i, x)) yield v; } function* rejectAt(x, is) { var i = -1; for (var v of x) if (!is.includes(++i)) yield v; } function* accumulate(x, fr, acc) { var init = arguments.length <= 2, i = -1; for (var v of x) { if (init) { init = false; acc = v; ++i; } else acc = fr(acc, v, ++i, x); yield acc; } } function* flat(x, n = -1, fm = null, ft = null) { var fm = fm || IDENTITY; var ft = ft || isList, i = -1; for (var v of x) { var v1 = fm(v, ++i, x); if (n !== 0 && ft(v1, i, x)) yield* flat(v1, n - 1, fm, ft); else yield v1; } } function* flatMap(x, fm = null, ft = null) { var fm = fm || IDENTITY; var ft = ft || isList, i = -1; for (var v of x) { var v1 = fm(v, ++i, x); if (ft(v1, i, x)) yield* v1; else yield v1; } } function* zip(xs, fm = null, fe = null, vd) { var fm = fm || IDENTITY; var fe = fe || some; var X = xs.length; if (X === 0) return; var ix = [], ds = [], vs = []; for (var r = 0; r < X; r++) ix[r] = xs[r][Symbol.iterator](); for (var i = 0;; ++i) { for (var r = 0; r < X; ++r) { var { done, value } = ix[r].next(); ds[r] = done; vs[r] = done ? vd : value; } if (fe(ds)) break; yield fm(vs.slice(), i, null); } } function* fill(x, v, i = 0, I = END) { var j = -1; for (var u of x) { if (++j >= i && j < I) yield v; else yield u; } } function* push(x, ...vs) { yield* x; yield* vs; } function* unshift(x, ...vs) { yield* vs; yield* x; } function* copy(x, y, j = 0, i = 0, I = END) { var k = -1, J = -1; for (var u of x) { if (++k === j) { J = k; for (var v of slice(y, i, I)) { yield v; ++J; } } if (k >= j && k < J) continue; else yield u; } if (k < j) { for (; ++k < j;) yield; yield* slice(y, i, I); } } function* copyWithin(x, j = 0, i = 0, I = END) { var x = toMany(x), n = length(x); for (var v of copy(x, x, j, i, I)) { if (--n < 0) break; yield v; } } function moveWithin(x, j = 0, i = 0, I = END) { if (j < i) return movePart(x, j, i, I); else if (j > I) return movePart(x, i, I, j); else return values(x); } function* movePart(x, j, k, l) { var p = [], i = -1; for (var v of x) { if (++i < j || i >= l) yield v; else { p.push(v); if (i < l - 1) continue; yield* p.slice(k - j); yield* p.slice(0, k - j); } } } function* splice(x, i = 0, n = END - i, ...vs) { var j = -1; for (var u of x) { if (++j < i || j >= i + n) yield u; else if (j === i) yield* vs; } } function* split(x, ft) { var a = [], i = -1; for (var v of x) { if (!ft(v, ++i, x)) a.push(v); else if (a.length > 0) { yield a; a = []; } } if (a.length > 0) yield a; } function* splitAt(x, is) { var a = [], i = -1; for (var v of x) { if (!is.includes(++i)) a.push(v); else if (a.length > 0) { yield a; a = []; } } if (a.length > 0) yield a; } function* cut(x, ft) { var i = -1, a = []; for (var v of x) { if (ft(v, ++i, x)) { yield a; a = []; } a.push(v); } yield a; } function* cutRight(x, ft) { var i = -1, a = []; for (var v of x) { a.push(v); if (ft(v, ++i, x)) { yield a; a = []; } } yield a; } function* cutAt(x, is) { var ii = is[Symbol.iterator](); var i = ii.next(); if (i.done) i.value = END; var a = [], j = -1; for (var v of x) { if (++j < i.value) { a.push(v); continue; } yield a; a = [v]; var i = ii.next(); if (i.done) i.value = END; } yield a; for (; !i.done; i = ii.next()) yield []; } function* cutAtRight(x, is) { yield* cutAt(x, map(is, i => i + 1)); } function* group(x, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var a = [], u1, i = -1; for (var v of x) { var v1 = fm(v, ++i, x); if (i > 0 && fc(u1, v1) !== 0) { yield a; a = [v]; } else a.push(v); u1 = v1; } yield a; } function partition(x, ft) { var t = [], f = [], i = -1; for (var v of x) { if (ft(v, ++i, x)) t.push(v); else f.push(v); } return [t, f]; } function partitionAs(x, fm = null) { var fm = fm || IDENTITY; var a = new Map(), i = -1; for (var v of x) { var v1 = fm(v, ++i, x); if (!a.has(v1)) a.set(v1, []); a.get(v1).push(v); } return a; } function* chunk(x, n = 1, s = n) { var M = Math.max(n, s); var m = 0, a = []; for (var v of x) { if (m < n) a.push(v); if (++m < M) continue; do { yield a; } while (s <= 0); a = a.slice(s); m = a.length; } if (a.length > 0) yield a; } function* cycle(x, i = 0, n = -1) { var x = toMany(x), X = 0; if (i < 0) { X = length(x); if (X === 0) return; i = mod(i, X); } while (true) { X = 0; for (var v of x) { ++X; if (--i >= 0) continue; if (n-- === 0) return; yield v; } if (X === 0) return; if (i >= X) i = mod(i, X); } } function* repeat(x, n = -1) { var x = toMany(x); for (; n !== 0; --n) yield* x; } function* reverse(x) { var a = Array.isArray(x) ? x : [...x]; for (var i = a.length - 1; i >= 0; --i) yield a[i]; } function rotate(x, n = 0) { if (n === 0) return values(x); else if (n > 0) return rotateLeft(x, n); else return rotateRight(x, -n); } function* rotateLeft(x, n) { var a = [], i = -1; for (var v of x) { if (++i < n) a.push(v); else yield v; } if (++i === 0 || i >= n) { yield* a; return; } var n = n % i; yield* a.slice(n); yield* a.slice(0, n); } function* rotateRight(x, n) { var a = Array.from(x); if (a.length === 0) return; var n = n % a.length; yield* a.slice(-n); yield* a.slice(0, -n); } function* intersperse(x, v) { var i = -1; for (var u of x) { if (++i > 0) yield v; yield u; } } function* interpolate(x, fc) { var u, i = -1; for (var v of x) { if (++i > 0) yield fc(u, v); yield (u = v); } } function* intermix(x, y, m = 1, n = 1, s = m, t = n) { var x1 = chunk(x, m, s); var y1 = chunk(repeat(y), n, t); var iy = y1[Symbol.iterator](), i = -1; for (var u of x1) { if (++i > 0) yield* iy.next().value; yield* u; } } function* interleave(xs) { var X = xs.length; if (X === 0) return; var ix = []; for (var i = 0; i < X; ++i) ix[i] = xs[i][Symbol.iterator](); for (var i = 0, n = X; n > 0; i = (i + 1) % X) { if (ix[i] == null) continue; var a = ix[i].next(); if (a.done) { ix[i] = null; --n; } else yield a.value; } } function* concat(...xs) { for (var x of xs) yield* x; } function* merge(xs, fc = null, fm = null) { var X = xs.length; var ix = [], ax = []; for (var i = 0, n = 0; n < X; ++n) { ix[i] = xs[i][Symbol.iterator](); ax[i] = ix[i].next(); if (!ax[i].done) ++i; } while (i > 0) { var as = ax.map(a => a.value); var j = minEntry(as, fc, fm)[0]; yield as[j]; ax[j] = ix[j].next(); if (!ax[j].done) continue; ix.splice(j, 1); ax.splice(j, 1); --i; } } function join(x, sep = ",") { var a = ""; for (var v of x) a += v + sep; return a.substring(0, a.length - sep.length); } function isUnique(x, fc = null, fm = null) { if (fc) return isUniqueDual(x, fc, fm); else return isUniqueMap(x, fm); } function isUniqueMap(x, fm = null) { var fm = fm || IDENTITY; var x1 = new Set(), i = -1; for (var v of x) { var v1 = fm(v, ++i, x); if (x1.has(v1)) return false; x1.add(v1); } return true; } function isUniqueDual(x, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var x1 = [...map(x, fm)]; for (var u1 of x1) { for (var v1 of x1) if (fc(u1, v1) === 0) return false; } return true; } function isDisjoint(x, y, fc = null, fm = null) { if (fc) return isDisjointDual(x, y, fc, fm); else return isDisjointMap(x, y, fm); } function isDisjointMap(x, y, fm = null) { var y1 = toSet(y, fm), i = -1; var fm = fm || IDENTITY; for (var u of x) { var u1 = fm(u, ++i, x); if (y1.has(u1)) return false; } return true; } function isDisjointDual(x, y, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var y1 = [...map(y, fm)], i = -1; for (var u of x) { var u1 = fm(u, ++i, x); for (var v1 of y1) if (fc(u1, v1) === 0) return false; } return true; } function* unique(x, fc = null, fm = null) { if (fc) yield* uniqueDual(x, fc, fm); else yield* uniqueMap(x, fm); } function* uniqueMap(x, fm = null) { var fm = fm || IDENTITY; var x1 = new Set(), i = -1; for (var v of x) { var v1 = fm(v, ++i, x); if (x1.has(v1)) continue; x1.add(v1); yield v; } } function* uniqueDual(x, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var x1 = [], i = -1; NEXTX: for (var v of x) { var v1 = fm(v, ++i, x); for (var u1 of x1) if (fc(u1, v1) === 0) continue NEXTX; x1.push(v1); yield v; } } function* union(x, y, fc = null, fm = null) { if (fc) yield* unionDual(x, y, fc, fm); else yield* unionMap(x, y, fm); } function* unionMap(x, y, fm = null) { var fm = fm || IDENTITY; var x1 = new Set(); var i = -1, j = -1; for (var u of x) { var u1 = fm(u, ++i, x); x1.add(u1); yield u; } for (var v of y) { var v1 = fm(v, ++j, y); if (!x1.has(v1)) yield v; } } function* unionDual(x, y, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var x = toMany(x); yield* x; var x1 = [...map(x, fm)], j = -1; NEXTY: for (var v of y) { var v1 = fm(v, ++j, y); for (var u1 of x1) if (fc(u1, v1) === 0) continue NEXTY; yield v; } } function* intersection(x, y, fc = null, fm = null) { if (fc) yield* intersectionDual(x, y, fc, fm); else yield* intersectionMap(x, y, fm); } function* intersectionMap(x, y, fm = null) { var y1 = toSet(y, fm), i = -1; var fm = fm || IDENTITY; for (var u of x) { var u1 = fm(u, ++i, x); if (y1.has(u1)) yield u; } } function* intersectionDual(x, y, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var y1 = [...map(y, fm)], i = -1; NEXTX: for (var u of x) { var u1 = fm(u, ++i, x); for (var v1 of y1) if (fc(u1, v1) === 0) { yield u; continue NEXTX; } } } function* difference(x, y, fc = null, fm = null) { if (fc) yield* differenceDual(x, y, fc, fm); else yield* differenceMap(x, y, fm); } function* differenceMap(x, y, fm = null) { var y1 = toSet(y, fm), i = -1; var fm = fm || IDENTITY; for (var u of x) { var u1 = fm(u, ++i, x); if (!y1.has(u1)) yield u; } } function* differenceDual(x, y, fc = null, fm = null) { var fc = fc || COMPARE; var fm = fm || IDENTITY; var y1 = [...map(y, fm)], i = -1; NEXTX: for (var u of x) { var u1 = fm(u, ++i, x); for (var v1 of y1) if (fc(u1, v1) === 0) continue NEXTX; yield u; } } function* symmetricDifference(x, y, fc = null, fm = null) { var x = toMany(x), y = toMany(y); yield* difference(x, y, fc, fm); yield* difference(y, x, fc, fm); } function* cartesianProduct(xs, fm = null) { var fm = fm || IDENTITY; var X = xs.length; if (X === 0) return; var jx = [], ix = [], ax = []; for (var i = 0; i < X; ++i) { jx[i] = i > 0 ? toMany(xs[i]) : xs[i]; ix[i] = jx[i][Symbol.iterator](); ax[i] = ix[i].next(); if (ax[i].done) return; } for (var i = 0;; ++i) { var vs = []; for (var a of ax) vs.push(a.value); yield fm(vs, i, null); for (var r = X - 1; r >= 0; --r) { ax[r] = ix[r].next(); if (!ax[r].done) break; ix[r] = jx[r][Symbol.iterator](); ax[r] = ix[r].next(); } if (r < 0) break; } } exports.END = END; exports.accumulate = accumulate; exports.callable = toInvokable; exports.cartesianProduct = cartesianProduct; exports.chunk = chunk; exports.compare = compare; exports.concat = concat; exports.copy = copy; exports.copyWithin = copyWithin; exports.count = count; exports.countAs = countAs; exports.cut = cut; exports.cutAt = cutAt; exports.cutAtRight = cutAtRight; exports.cutRight = cutRight; exports.cycle = cycle; exports.difference = difference; exports.drop = drop; exports.dropRight = dropRight; exports.dropWhile = dropWhile; exports.dropWhileRight = dropWhileRight; exports.entries = entries; exports.every = every; exports.fill = fill; exports.filter = filter; exports.filterAt = filterAt; exports.find = find; exports.findAll = filter; exports.findRight = findRight; exports.flat = flat; exports.flatMap = flatMap; exports.forEach = forEach; exports.from = from; exports.fromApplication = fromApplication; exports.fromApply = fromApplication; exports.fromCall = fromInvocation; exports.fromInvocation = fromInvocation; exports.fromIterator = fromIterator; exports.fromRange = fromRange; exports.get = get; exports.getAll = getAll; exports.getPath = getPath; exports.group = group; exports.hasInfix = hasInfix; exports.hasPath = hasPath; exports.hasPrefix = hasPrefix; exports.hasSubsequence = hasSubsequence; exports.hasSuffix = hasSuffix; exports.hasValue = hasValue; exports.head = head; exports.includes = includes; exports.index = index; exports.indexOf = indexOf; exports.indexRange = indexRange; exports.init = init; exports.interleave = interleave; exports.intermix = intermix; exports.interpolate = interpolate; exports.intersection = intersection; exports.intersperse = intersperse; exports.is = is; exports.isDisjoint = isDisjoint; exports.isEmpty = isEmpty; exports.isEqual = isEqual; exports.isIterator = isIterator; exports.isList = isList; exports.isMany = isMany; exports.isOnce = isOnce; exports.isUnique = isUnique; exports.iterator = iterator; exports.join = join; exports.keys = keys; exports.last = last; exports.lastIndexOf = lastIndexOf; exports.left = left; exports.length = length; exports.many = toMany; exports.map = map; exports.max = max; exports.maxEntry = maxEntry; exports.merge = merge; exports.middle = middle; exports.min = min; exports.minEntry = minEntry; exports.moveWithin = moveWithin; exports.partition = partition; exports.partitionAs = partitionAs; exports.pop = init; exports.push = push; exports.range = range; exports.rangeEntries = rangeEntries; exports.reduce = reduce; exports.reject = reject; exports.rejectAt = rejectAt; exports.remove = remove; exports.repeat = repeat; exports.reverse = reverse; exports.right = right; exports.rotate = rotate; exports.scanUntil = scanUntil; exports.scanUntilRight = scanUntilRight; exports.scanWhile = scanWhile; exports.scanWhileRight = scanWhileRight; exports.search = search; exports.searchAll = searchAll; exports.searchInfix = searchInfix; exports.searchInfixAll = searchInfixAll; exports.searchInfixRight = searchInfixRight; exports.searchRight = searchRight; exports.searchSubsequence = searchSubsequence; exports.searchValue = searchValue; exports.searchValueAll = searchValueAll; exports.searchValueRight = searchValueRight; exports.set = set; exports.shift = tail; exports.size = length; exports.slice = slice; exports.some = some; exports.splice = splice; exports.split = split; exports.splitAt = splitAt; exports.swap = swap; exports.symmetricDifference = symmetricDifference; exports.tail = tail; exports.take = take; exports.takeRight = takeRight; exports.takeWhile = takeWhile; exports.takeWhileRight = takeWhileRight; exports.toCallable = toInvokable; exports.toInvokable = toInvokable; exports.toMany = toMany; exports.toOnce = values; exports.union = union; exports.unique = unique; exports.unshift = unshift; exports.values = values; exports.zip = zip;