UNPKG

extra-iterable

Version:

An [iterable] is a sequence of values.<br>

1,721 lines (1,415 loc) • 33.8 kB
import {assertEquals} from "@std/assert"; import { type EndFunction, is, isList, isIterator, iterator, keys, values, entries, from, fromInvocation, fromApplication, fromRange, toInvokable, isOnce, isMany, toMany, isEmpty, length, size, compare, isEqual, index, indexRange, get, getAll, getPath, hasPath, set, swap, remove, count, countAs, min, max, range, minEntry, maxEntry, rangeEntries, slice, head, tail, init, last, left, right, middle, take, takeRight, takeWhile, takeWhileRight, drop, dropRight, dropWhile, dropWhileRight, includes, indexOf, lastIndexOf, find, findRight, findAll, scanWhile, scanWhileRight, scanUntil, scanUntilRight, search, searchRight, searchAll, searchValue, searchValueRight, searchValueAll, searchInfix, searchInfixRight, searchInfixAll, searchSubsequence, hasValue, hasPrefix, hasSuffix, hasInfix, hasSubsequence, forEach, some, every, map, reduce, filter, filterAt, reject, rejectAt, accumulate, flat, flatMap, zip, fill, push, pop, shift, unshift, copy, copyWithin, moveWithin, splice, split, splitAt, cut, cutRight, cutAt, cutAtRight, group, partition, partitionAs, chunk, cycle, repeat, reverse, rotate, intermix, interleave, interpolate, intersperse, concat, merge, join, isUnique, isDisjoint, unique, union, intersection, difference, symmetricDifference, cartesianProduct, } from "./index.ts"; import * as xiterable from "./index.ts"; Deno.test("example", () => { let x, v, a; x = [2, 4, 6, 8]; v = xiterable.get(x, 1); assertEquals(v, 4); // → 4 x = [1, 2, 3, 4]; a = [...xiterable.swap(x, 0, 1)]; assertEquals(a, [2, 1, 3, 4]); // → [2, 1, 3, 4] x = [1, 2, 3]; a = [...xiterable.cycle(x, 0, 4)]; assertEquals(a, [1, 2, 3, 1]); // → [1, 2, 3, 1] x = [1, 2, 3, 4]; v = xiterable.reduce(x, (acc, v) => acc+v, 0); assertEquals(v, 10); // → 10 }); // ABOUT // ----- Deno.test("is", () => { let a; a = is([1, 2]); assertEquals(a, true); a = is("ab"); assertEquals(a, true); a = is(1); assertEquals(a, false); }); Deno.test("isList", () => { let a; a = isList([1, 2]); assertEquals(a, true); a = isList("ab"); assertEquals(a, false); }); Deno.test("isIterator", () => { let a; const x = [1, 2]; a = isIterator(x); assertEquals(a, false); a = isIterator(x[Symbol.iterator]()); assertEquals(a, true); a = isIterator(x.values()); assertEquals(a, true); }); Deno.test("iterator", () => { let a; a = iterator([1, 2]); assertEquals(a.next().value, 1); a = iterator(new Set([1, 2])); assertEquals(a.next().value, 1); }); Deno.test("keys", () => { const x = [1, 2, 3]; const a = [...keys(x)]; assertEquals(a, [0, 1, 2]); }); Deno.test("values", () => { const x = [1, 2, 3]; const a = [...values(x)]; assertEquals(a, [1, 2, 3]); }); Deno.test("entries", () => { const x = ["A", "B", "C"]; const a = [...entries(x)]; assertEquals(a, [[0, "A"], [1, "B"], [2, "C"]]); }); // GENERATE // -------- Deno.test("from", () => { const x = [1, 2].values(); const xi = x[Symbol.iterator](); const a = [...from(xi)]; assertEquals(a, [1, 2]); }); Deno.test("fromInvocation", () => { let id = 0; function getId() { return ++id; } const x = fromInvocation(getId); const a = [...take(x, 4)]; assertEquals(a, [1, 2, 3, 4]); }); Deno.test("fromApplication", () => { let a; a = [...take(fromApplication(v => v+2, 2), 4)]; assertEquals(a, [2, 4, 6, 8]); a = [...take(fromApplication(v => v*2, 2), 4)]; assertEquals(a, [2, 4, 8, 16]); }); Deno.test("fromRange", () => { let a; a = [...fromRange(0, 4)]; assertEquals(a, [0, 1, 2, 3]); a = [...fromRange(0, 8, 2)]; assertEquals(a, [0, 2, 4, 6]); }); // BEHAVIOR // -------- Deno.test("toInvokable", () => { const x = [1, 2, 3, 4], s = [0]; const f = toInvokable(x); for (let i=0; i<6; i++) s.push(f()); assertEquals(s, [0, 1, 2, 3, 4, undefined, undefined]); }); Deno.test("isOnce", () => { let a; const x = [1, 2, 3, 4]; a = isOnce(x); assertEquals(a, false); a = isOnce(x.values()); assertEquals(a, true); }); Deno.test("isMany", () => { let a; const x = [1, 2, 3, 4]; a = isMany(x); assertEquals(a, true); a = isMany(x.values()); assertEquals(a, false); }); Deno.test("toMany", () => { let x, y, a, s; const w = [1, 2, 3].values(); s = [0]; a = [...w, ...w]; // ("w" cant be iterated multiple times) assertEquals(a, [1, 2, 3]); function* from1ToN(n: number) { for (let i=1; i<=n; i++) { s.push(i); yield i; } } x = from1ToN(3); y = toMany(x); assertEquals(s, [0]); a = [...y]; assertEquals(a, [1, 2, 3]); assertEquals(s, [0, 1, 2, 3]); a = [...y]; assertEquals(a, [1, 2, 3]); assertEquals(s, [0, 1, 2, 3]); s = [0]; x = from1ToN(3); y = toMany(x, true); assertEquals(s, [0, 1, 2, 3]); a = [...y]; assertEquals(a, [1, 2, 3]); assertEquals(s, [0, 1, 2, 3]); a = [...y]; assertEquals(a, [1, 2, 3]); assertEquals(s, [0, 1, 2, 3]); }); // LENGTH // ------ Deno.test("isEmpty", () => { let a; const x = [1, 2, 3]; a = isEmpty(x); assertEquals(a, false); const y: number[] = []; a = isEmpty(y); assertEquals(a, true); }); Deno.test("length", () => { let a; const x = [2, 4, 6, 8]; a = length(x); assertEquals(a, 4); a = length(x, 1); assertEquals(a, 3); a = length(x, 1, 3); assertEquals(a, 2); }); Deno.test("size", () => { let a; const x = [2, 4, 6, 8]; a = size(x); assertEquals(a, 4); a = size(x, 1); assertEquals(a, 3); a = size(x, 1, 3); assertEquals(a, 2); }); Deno.test("index", () => { let a; const x = [2, 4, 6, 8]; a = index(x, 1); assertEquals(a, 1); a = index(x, -1); assertEquals(a, 3); a = index(x, -10); assertEquals(a, 0); }); Deno.test("indexRange", () => { let a; const x = [2, 4, 6, 8]; a = indexRange(x, 1); assertEquals(a, [1, 4]); a = indexRange(x, 1, -1); assertEquals(a, [1, 3]); a = indexRange(x, 1, -10); assertEquals(a, [1, 1]); }); // COMPARE // ------- Deno.test("compare", () => { let y, a; const x = [1, 2]; y = [1, 2, 3]; a = compare(x, y); assertEquals(a, -1); y = [1, 2]; a = compare(x, y); assertEquals(a, 0); y = [1, -2]; a = compare(x, y); assertEquals(a, 1); a = compare(x, y, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, 0); a = compare(x, y, null, v => Math.abs(v)); assertEquals(a, 0); }); Deno.test("isEqual", () => { let a; const x = [1, 2]; a = isEqual(x, [1, 2]); assertEquals(a, true); a = isEqual(x, [11, 12]); assertEquals(a, false); a = isEqual(x, [11, 12], (a, b) => (a % 10) - (b % 10)); assertEquals(a, true); a = isEqual(x, [11, 12], null, v => v % 10); assertEquals(a, true); }); // GET/SET // ------- Deno.test("get", () => { let a; const x = [2, 4, 6, 8]; a = get(x, 1); assertEquals(a, 4); a = get(x, 3); assertEquals(a, 8); }); Deno.test("getAll", () => { let a; const x = [2, 4, 6, 8]; a = [...getAll(x, [1, 2])]; assertEquals(a, [4, 6]); a = [...getAll(x, [1, 3])]; assertEquals(a, [4, 8]); }); Deno.test("getPath", () => { let a; const x = [[2, 4], 6, 8]; a = getPath(x, [1]); assertEquals(a, 6); a = getPath(x, [0, 1]); assertEquals(a, 4); a = getPath(x, [0, 1, 2]); assertEquals(a, undefined); }); Deno.test("hasPath", () => { let a; const x = [[2, 4], 6, 8]; a = hasPath(x, [1]); assertEquals(a, true); a = hasPath(x, [0, 1]); assertEquals(a, true); a = hasPath(x, [0, 1, 2]); assertEquals(a, false); }); Deno.test("set", () => { let a; const x = [2, 4, 6, 8]; a = [...set(x, 1, 40)]; assertEquals(a, [2, 40, 6, 8]); a = [...set(x, 3, 80)]; assertEquals(a, [2, 4, 6, 80]); }); Deno.test("swap", () => { let a; const x = [1, 2, 3, 4]; a = [...swap(x, 0, 1)]; assertEquals(a, [2, 1, 3, 4]); a = [...swap(x, 0, 3)]; assertEquals(a, [4, 2, 3, 1]); }); Deno.test("remove", () => { const x = [1, 2, 3, 4, 5]; const a = [...remove(x, 2)]; assertEquals(a, [1, 2, 4, 5]); }); // PROPERTY // -------- Deno.test("count", () => { let a; const x = [1, 1, 2, 2, 4]; a = count(x, v => v % 2===1); assertEquals(a, 2); a = count(x, v => v % 2===0); assertEquals(a, 3); }); Deno.test("countAs", () => { let x, a; x = [1, 1, 2, 2, 4]; a = countAs(x); assertEquals(a, new Map([[1, 2], [2, 2], [4, 1]])); x = [1, 2, 3, 4]; a = countAs(x, v => v % 2); assertEquals(a, new Map([[1, 2], [0, 2]])); }); Deno.test("min", () => { let a; const x = [1, 2, -3, -4]; a = min(x); assertEquals(a, -4); a = min(x, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, 1); a = min(x, null, v => Math.abs(v)); assertEquals(a, 1); }); Deno.test("max", () => { let a; const x = [1, 2, -3, -4]; a = max(x); assertEquals(a, 2); a = max(x, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, -4); a = max(x, null, v => Math.abs(v)); assertEquals(a, -4); }); Deno.test("range", () => { let a; const x = [1, 2, -3, -4]; a = range(x); assertEquals(a, [-4, 2]); a = range(x, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, [1, -4]); a = range(x, null, v => Math.abs(v)); assertEquals(a, [1, -4]); }); Deno.test("minEntry", () => { let a; const x = [1, 2, -3, -4]; a = minEntry(x); assertEquals(a, [3, -4]); a = minEntry(x, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, [0, 1]); a = minEntry(x, null, v => Math.abs(v)); assertEquals(a, [0, 1]); }); Deno.test("maxEntry", () => { let a; const x = [1, 2, -3, -4]; a = maxEntry(x); assertEquals(a, [1, 2]); a = maxEntry(x, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, [3, -4]); a = maxEntry(x, null, v => Math.abs(v)); assertEquals(a, [3, -4]); }); Deno.test("rangeEntries", () => { let a; const x = [1, 2, -3, -4]; a = rangeEntries(x); assertEquals(a, [[3, -4], [1, 2]]); a = rangeEntries(x, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, [[0, 1], [3, -4]]); a = rangeEntries(x, null, v => Math.abs(v)); assertEquals(a, [[0, 1], [3, -4]]); }); // PART // ---- Deno.test("slice", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...slice(x, 2)]; assertEquals(a, [3, 4, 5]); a = [...slice(x, 2, 4)]; assertEquals(a, [3, 4]); a = [...slice(x, -3, -1)]; assertEquals(a, [3, 4]); }); Deno.test("head", () => { let a; a = head([1, 2, 3]); assertEquals(a, 1); a = head([], -1); assertEquals(a, -1); }); Deno.test("tail", () => { let x, a; x = [1, 2, 3]; a = [...tail(x)]; assertEquals(a, [2, 3]); x = [1]; a = [...tail(x)]; assertEquals(a, []); }); Deno.test("init", () => { let a; a = [...init([1, 2, 3])]; assertEquals(a, [1, 2]); a = [...init([1])]; assertEquals(a, []); }); Deno.test("last", () => { let a; a = last([1, 2, 3]); assertEquals(a, 3); a = last([], -1); assertEquals(a, -1); }); Deno.test("left", () => { let a; const x = [1, 2, 3]; a = [...left(x, 1)]; assertEquals(a, [1]); a = [...left(x, 2)]; assertEquals(a, [1, 2]); }); Deno.test("right", () => { let a; const x = [1, 2, 3]; a = [...right(x, 1)]; assertEquals(a, [3]); a = [...right(x, 2)]; assertEquals(a, [2, 3]); }); Deno.test("middle", () => { let a; const x = [1, 2, 3]; a = [...middle(x, 1, 1)]; assertEquals(a, [2]); a = [...middle(x, 1, 2)]; assertEquals(a, [2, 3]); }); Deno.test("take", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...take(x, 2)]; assertEquals(a, [1, 2]); a = [...take(x, 3)]; assertEquals(a, [1, 2, 3]); }); Deno.test("takeRight", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...takeRight(x, 2)]; assertEquals(a, [4, 5]); a = [...takeRight(x, 3)]; assertEquals(a, [3, 4, 5]); }); Deno.test("takeWhile", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...takeWhile(x, v => v < 3)]; assertEquals(a, [1, 2]); a = [...takeWhile(x, v => v < 4)]; assertEquals(a, [1, 2, 3]); }); Deno.test("takeWhileRight", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...takeWhileRight(x, v => v >= 3)]; assertEquals(a, [3, 4, 5]); a = [...takeWhileRight(x, v => v >= 4)]; assertEquals(a, [4, 5]); }); Deno.test("drop", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...drop(x, 2)]; assertEquals(a, [3, 4, 5]); a = [...drop(x, 3)]; assertEquals(a, [4, 5]); }); Deno.test("dropRight", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...dropRight(x, 2)]; assertEquals(a, [1, 2, 3]); a = [...dropRight(x, 3)]; assertEquals(a, [1, 2]); }); Deno.test("dropWhile", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...dropWhile(x, v => v < 3)]; assertEquals(a, [3, 4, 5]); a = [...dropWhile(x, v => v < 4)]; assertEquals(a, [4, 5]); }); Deno.test("dropWhileRight", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...dropWhileRight(x, v => v >= 3)]; assertEquals(a, [1, 2]); a = [...dropWhileRight(x, v => v >= 4)]; assertEquals(a, [1, 2, 3]); }); // FIND // ---- Deno.test("includes", () => { let a; const x = [1, 2, -3]; a = includes(x, 3); assertEquals(a, false); a = includes(x, -3); assertEquals(a, true); }); Deno.test("indexOf", () => { let x, a; x = [1, 2, 3, 2, 5]; a = indexOf(x, 2); assertEquals(a, 1); x = [1, 2, 3, 2, 5]; a = indexOf(x, 2, 2); assertEquals(a, 3); }); Deno.test("lastIndexOf", () => { let x, a; x = [1, 2, 3, 2, 5]; a = lastIndexOf(x, 2); assertEquals(a, 3); x = [1, 2, 3, 2, 5]; a = lastIndexOf(x, 2, 2); assertEquals(a, 1); }); Deno.test("find", () => { let a; const x = [1, 2, 3, 4, 5]; a = find(x, v => v % 2===0); assertEquals(a, 2); a = find(x, v => v % 2===1); assertEquals(a, 1); }); Deno.test("findRight", () => { let a; const x = [1, 2, 3, 4, 5]; a = findRight(x, v => v % 2===0); assertEquals(a, 4); a = findRight(x, v => v % 2===1); assertEquals(a, 5); }); Deno.test("findAll", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...findAll(x, v => v % 2===1)]; assertEquals(a, [1, 3, 5]); a = [...findAll(x, v => v % 2===0)]; assertEquals(a, [2, 4]); }); Deno.test("scanWhile", () => { let a; const x = [1, 1, 2, 2, 3, 3, 4, 4]; a = scanWhile(x, v => v % 2!==0); assertEquals(a, 2); a = scanWhile(x, v => v % 3!==0); assertEquals(a, 4); a = scanWhile(x, v => v % 6!==0); assertEquals(a, 8); }); Deno.test("scanWhileRight", () => { let a; const x = [1, 1, 2, 2, 3, 3, 4, 4]; a = scanWhileRight(x, v => v % 3!==0); assertEquals(a, 6); a = scanWhileRight(x, v => v % 2!==0); assertEquals(a, 8); a = scanWhileRight(x, v => v % 6!==0); assertEquals(a, 0); }); Deno.test("scanUntil", () => { let a; const x = [1, 1, 2, 2, 3, 3, 4, 4]; a = scanUntil(x, v => v % 2===0); assertEquals(a, 2); a = scanUntil(x, v => v % 3===0); assertEquals(a, 4); a = scanUntil(x, v => v % 6===0); assertEquals(a, 8); }); Deno.test("scanUntilRight", () => { let a; const x = [1, 1, 2, 2, 3, 3, 4, 4]; a = scanUntilRight(x, v => v % 3===0); assertEquals(a, 6); a = scanUntilRight(x, v => v % 2===0); assertEquals(a, 8); a = scanUntilRight(x, v => v % 6===0); assertEquals(a, 0); }); Deno.test("search", () => { let a; const x = [1, 2, 3, 4, 5]; a = search(x, v => v % 2===0); assertEquals(a, 1); a = search(x, v => v % 2===1); assertEquals(a, 0); }); Deno.test("searchRight", () => { let a; const x = [1, 2, 3, 4, 5]; a = searchRight(x, v => v % 2===0); assertEquals(a, 3); a = searchRight(x, v => v % 2===1); assertEquals(a, 4); }); Deno.test("searchAll", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...searchAll(x, v => v % 2===0)]; assertEquals(a, [1, 3]); a = [...searchAll(x, v => v % 2===1)]; assertEquals(a, [0, 2, 4]); }); Deno.test("searchValue", () => { let x, a; x = [1, 2, 3, 2, 5]; a = searchValue(x, 2); assertEquals(a, 1); x = [1, -2, 3, 2, 5]; a = searchValue(x, 2, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, 1); x = [1, -2, 3, 2, 5]; a = searchValue(x, 2, null, v => Math.abs(v)); assertEquals(a, 1); }); Deno.test("searchValueRight", () => { let x, a; x = [1, 2, 3, 2, 5]; a = searchValueRight(x, 2); assertEquals(a, 3); x = [1, 2, 3, -2, 5]; a = searchValueRight(x, 2, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, 3); a = searchValueRight(x, 2, null, v => Math.abs(v)); assertEquals(a, 3); }); Deno.test("searchValueAll", () => { let x, a; x = [1, 2, 3, 2, 5]; a = [...searchValueAll(x, 2)]; assertEquals(a, [1, 3]); x = [1, 2, 3, -2, 5]; a = [...searchValueAll(x, 2, (a, b) => Math.abs(a) - Math.abs(b))]; assertEquals(a, [1, 3]); a = [...searchValueAll(x, 2, null, v => Math.abs(v))]; assertEquals(a, [1, 3]); }); Deno.test("searchInfix", () => { let y, a; const x = [1, 2, 3, 4]; y = [2, 3]; a = searchInfix(x, y); assertEquals(a, 1); y = [-2, -3]; a = searchInfix(x, y); assertEquals(a, -1); a = searchInfix(x, y, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, 1); a = searchInfix(x, y, null, v => Math.abs(v)); assertEquals(a, 1); }); Deno.test("searchInfixRight", () => { let y, a; const x = [1, 2, 3, 4]; y = [2, 3]; a = searchInfixRight(x, y); assertEquals(a, 1); y = [-2, -3]; a = searchInfixRight(x, y); assertEquals(a, -1); a = searchInfixRight(x, y, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, 1); a = searchInfixRight(x, y, null, v => Math.abs(v)); assertEquals(a, 1); }); Deno.test("searchInfixAll", () => { let y, a; const x = [1, 2, 3, 4, -2, -3]; y = [2, 3]; a = [...searchInfixAll(x, y)]; assertEquals(a, [1]); y = [-2, -3]; a = [...searchInfixAll(x, y)]; assertEquals(a, [4]); a = [...searchInfixAll(x, y, (a, b) => Math.abs(a) - Math.abs(b))]; assertEquals(a, [1, 4]); a = [...searchInfixAll(x, y, null, v => Math.abs(v))]; assertEquals(a, [1, 4]); }); Deno.test("searchSubsequence", () => { let a; const x = [1, 2, 3, 4]; a = searchSubsequence(x, [2, 4]); assertEquals(a, 1); a = searchSubsequence(x, [-2, -4]); assertEquals(a, -1); a = searchSubsequence(x, [-2, -4], (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, 1); a = searchSubsequence(x, [-2, -4], null, v => Math.abs(v)); assertEquals(a, 1); }); Deno.test("hasValue", () => { let a; const x = [1, 2, -3]; a = hasValue(x, 3); assertEquals(a, false); a = hasValue(x, 3, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, true); a = hasValue(x, 3, null, v => Math.abs(v)); assertEquals(a, true); }); Deno.test("hasPrefix", () => { let a; const x = [1, 2, 3, 4]; a = hasPrefix(x, [1, 2]); assertEquals(a, true); a = hasPrefix(x, [-1, -2]); assertEquals(a, false); a = hasPrefix(x, [-1, -2], (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, true); a = hasPrefix(x, [-1, -2], null, v => Math.abs(v)); assertEquals(a, true); }); Deno.test("hasSuffix", () => { let a; const x = [1, 2, 3, 4]; a = hasSuffix(x, [3, 4]); assertEquals(a, true); a = hasSuffix(x, [-3, -4]); assertEquals(a, false); a = hasSuffix(x, [-3, -4], (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, true); a = hasSuffix(x, [-3, -4], null, v => Math.abs(v)); assertEquals(a, true); }); Deno.test("hasInfix", () => { let a; const x = [1, 2, 3, 4]; a = hasInfix(x, [2, 3]); assertEquals(a, true); a = hasInfix(x, [-2, -3]); assertEquals(a, false); a = hasInfix(x, [-2, -3], (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, true); a = hasInfix(x, [-2, -3], null, v => Math.abs(v)); assertEquals(a, true); }); Deno.test("hasSubsequence", () => { let a; const x = [1, 2, 3, 4]; a = hasSubsequence(x, [2, 4]); assertEquals(a, true); a = hasSubsequence(x, [-2, -4]); assertEquals(a, false); a = hasSubsequence(x, [-2, -4], (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, true); a = hasSubsequence(x, [-2, -4], null, v => Math.abs(v)); assertEquals(a, true); }); // FUNCTIONAL // ---------- Deno.test("forEach", () => { let sum = 0; const x = [1, 2, -3, -4]; forEach(x, v => sum += v); assertEquals(sum, -4); }); Deno.test("some", () => { let a; const x = [1, 2, -3, -4]; a = some(x, v => v > 10); assertEquals(a, false); a = some(x, v => v < 0); assertEquals(a, true); }); Deno.test("every", () => { let a; const x = [1, 2, -3, -4]; a = every(x, v => v > 0); assertEquals(a, false); a = every(x, v => v > -10); assertEquals(a, true); }); Deno.test("map", () => { const x = [1, 2, 3, 4]; const a = [...map(x, v => v * 2)]; assertEquals(a, [2, 4, 6, 8]); }); Deno.test("reduce", () => { let a; const x = [1, 2, 3, 4]; a = reduce(x, (acc, v) => acc+v, 0); assertEquals(a, 10); a = reduce(x, (acc, v) => acc+v, 100); assertEquals(a, 110); }); Deno.test("filter", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...filter(x, v => v % 2===1)]; assertEquals(a, [1, 3, 5]); a = [...filter(x, v => v % 2===0)]; assertEquals(a, [2, 4]); }); Deno.test("filterAt", () => { let a; const x = [2, 4, 6, 8]; a = [...filterAt(x, [1, 2])]; assertEquals(a, [4, 6]); a = [...filterAt(x, [1, 3])]; assertEquals(a, [4, 8]); }); Deno.test("reject", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...reject(x, v => v % 2===1)]; assertEquals(a, [2, 4]); a = [...reject(x, v => v % 2===0)]; assertEquals(a, [1, 3, 5]); }); Deno.test("rejectAt", () => { let a; const x = [2, 4, 6, 8]; a = [...rejectAt(x, [1, 2])]; assertEquals(a, [2, 8]); a = [...rejectAt(x, [1, 3])]; assertEquals(a, [2, 6]); }); Deno.test("accumulate", () => { let a; const x = [1, 2, 3, 4]; a = [...accumulate(x, (acc, v) => acc+v)]; assertEquals(a, [1, 3, 6, 10]); a = [...accumulate(x, (acc, v) => acc+v, 100)]; assertEquals(a, [101, 103, 106, 110]); }); Deno.test("flat", () => { let a; const x = [[1, 2], [3, [4, [5]]]]; a = [...flat(x)]; assertEquals(a, [1, 2, 3, 4, 5]); a = [...flat(x, 1)]; assertEquals(a, [1, 2, 3, [4, [5]]]); a = [...flat(x, 2)]; assertEquals(a, [1, 2, 3, 4, [5]]); }); Deno.test("flatMap", () => { let a; const x = [[1, 2], [3, [4, [5]]]]; a = [...flatMap(x)]; assertEquals(a, [1, 2, 3, [4, [5]]]); a = [...flatMap(x, v => flat(v as Iterable<unknown>, 1))]; assertEquals(a, [1, 2, 3, 4, [5]]); a = [...flatMap(x, v => flat(v as Iterable<unknown>, 2))]; assertEquals(a, [1, 2, 3, 4, 5]); }); Deno.test("zip", () => { let a; const x = [1, 2, 3]; const y = [4, 5]; a = [...zip([x, y])]; assertEquals(a, [[1, 4], [2, 5]]); // (shortest) const b = [...zip([x, y], ([a, b]) => a + b)]; assertEquals(b, [5, 7]); a = [...zip([x, y], null, some)]; assertEquals(a, [[1, 4], [2, 5]]); // (shortest) a = [...zip([x, y], null, every, 0)]; assertEquals(a, [[1, 4], [2, 5], [3, 0]]); // (longest) a = [...zip([x, y], null, head as EndFunction, 0)]; assertEquals(a, [[1, 4], [2, 5], [3, 0]]); // (first) }); // MANIPULATION // ------------ Deno.test("fill", () => { let a; const x = [1, 2, 3, 4]; a = [...fill(x, 2)]; assertEquals(a, [2, 2, 2, 2]); a = [...fill(x, 2, 1)]; assertEquals(a, [1, 2, 2, 2]); a = [...fill(x, 2, 1, 3)]; assertEquals(a, [1, 2, 2, 4]); }); Deno.test("push", () => { let a; const x = [1, 2]; a = [...push(x, 3)]; assertEquals(a, [1, 2, 3]); a = [...push(x, 3, 4)]; assertEquals(a, [1, 2, 3, 4]); }); Deno.test("pop", () => { let x, a; x = [1, 2, 3]; a = [...pop(x)]; assertEquals(a, [1, 2]); x = [1, 2, 3, 4]; a = [...pop(x)]; assertEquals(a, [1, 2, 3]); }); Deno.test("shift", () => { let x, a; x = [1, 2, 3]; a = [...shift(x)]; assertEquals(a, [2, 3]); x = [1, 2, 3, 4]; a = [...shift(x)]; assertEquals(a, [2, 3, 4]); }); Deno.test("unshift", () => { let a; const x = [3, 4]; a = [...unshift(x, 2)]; assertEquals(a, [2, 3, 4]); a = [...unshift(x, 1, 2)]; assertEquals(a, [1, 2, 3, 4]); }); Deno.test("copy", () => { let a; const x = [1, 2, 3, 4, 5]; const y = [10, 20, 30]; a = [...copy(x, y)]; assertEquals(a, [10, 20, 30, 4, 5]); a = [...copy(x, y, 1)]; assertEquals(a, [1, 10, 20, 30, 5]); a = [...copy(x, y, 1, 1)]; assertEquals(a, [1, 20, 30, 4, 5]); a = [...copy(x, y, 1, 1, 2)]; assertEquals(a, [1, 20, 3, 4, 5]); }); Deno.test("copyWithin", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...copyWithin(x, 3)]; assertEquals(a, [1, 2, 3, 1, 2]); a = [...copyWithin(x, 3, 1)]; assertEquals(a, [1, 2, 3, 2, 3]); a = [...copyWithin(x, 3, 1, 2)]; assertEquals(a, [1, 2, 3, 2, 5]); }); Deno.test("moveWithin", () => { let a; const x = [1, 2, 3, 4, 5, 6]; a = [...moveWithin(x, 0, 1, 3)]; assertEquals(a, [2, 3, 1, 4, 5, 6]); // (2,3 to left) a = [...moveWithin(x, 6, 3, 5)]; assertEquals(a, [1, 2, 3, 6, 4, 5]); // (4,5 to right) }); Deno.test("splice", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...splice(x, 2)]; assertEquals(a, [1, 2]); a = [...splice(x, 2, 2)]; assertEquals(a, [1, 2, 5]); a = [...splice(x, 2, 2, 30, 40)]; assertEquals(a, [1, 2, 30, 40, 5]); }); Deno.test("split", () => { let x, a; x = [1, 2, 2, 3, 5, 4, 4, 7]; a = [...split(x, v => v % 2 === 0)]; assertEquals(a, [[1], [3, 5], [7]]); x = [2, 4, 5, 6, 8]; a = [...split(x, v => v % 2 === 0)]; assertEquals(a, [[5]]); }); Deno.test("splitAt", () => { let x, a; x = [1, 2, 2, 3, 5, 4, 4, 7]; a = [...splitAt(x, [1, 2, 5, 6])]; assertEquals(a, [[1], [3, 5], [7]]); x = [2, 4, 5, 6, 8]; a = [...splitAt(x, [0, 1, 3, 4])]; assertEquals(a, [[5]]); }); Deno.test("cut", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...cut(x, v => v % 2===0)]; assertEquals(a, [[1], [2, 3], [4, 5]]); a = [...cut(x, v => v % 2===1)]; assertEquals(a, [[], [1, 2], [3, 4], [5]]); }); Deno.test("cutRight", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...cutRight(x, v => v % 2===0)]; assertEquals(a, [[1, 2], [3, 4], [5]]); a = [...cutRight(x, v => v % 2===1)]; assertEquals(a, [[1], [2, 3], [4, 5], []]); }); Deno.test("cutAt", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...cutAt(x, [1, 3])]; assertEquals(a, [[1], [2, 3], [4, 5]]); a = [...cutAt(x, [0, 4])]; assertEquals(a, [[], [1, 2, 3, 4], [5]]); }); Deno.test("cutAtRight", () => { let a; const x = [1, 2, 3, 4, 5]; a = [...cutAtRight(x, [1, 3])]; assertEquals(a, [[1, 2], [3, 4], [5]]); a = [...cutAtRight(x, [0, 4])]; assertEquals(a, [[1], [2, 3, 4, 5], []]); }); Deno.test("group", () => { let a; const x = [1, 2, 2, -2, -2, 4]; a = [...group(x)]; assertEquals(a, [[1], [2, 2], [-2, -2], [4]]); a = [...group(x, (a, b) => Math.abs(a) - Math.abs(b))]; assertEquals(a, [[1], [2, 2, -2, -2], [4]]); a = [...group(x, null, v => Math.abs(v))]; assertEquals(a, [[1], [2, 2, -2, -2], [4]]); }); Deno.test("partition", () => { let x, a; x = [1, 2, 3, 4]; a = partition(x, v => v % 2===0); assertEquals(a, [[2, 4], [1, 3]]); x = [1, 2, 3, 4, 5]; a = partition(x, v => v % 2===1); assertEquals(a, [[1, 3, 5], [2, 4]]); }); Deno.test("partitionAs", () => { let x; x = [1, 2, 3, 4]; const a = partitionAs(x, v => v % 2===0); assertEquals(a, new Map([[false, [1, 3]], [true, [2, 4]]])) x = [1, 2, 3, 4, 5]; const b = partitionAs(x, v => v % 3); assertEquals(b, new Map([[1, [1, 4]], [2, [2, 5]], [0, [3]]])); }); Deno.test("chunk", () => { let a; const x = [1, 2, 3, 4, 5, 6, 7, 8]; a = [...chunk(x, 3)]; assertEquals(a, [[1, 2, 3], [4, 5, 6], [7, 8]]); a = [...chunk(x, 2, 3)]; assertEquals(a, [[1, 2], [4, 5], [7, 8]]); a = [...chunk(x, 4, 3)]; assertEquals(a, [[1, 2, 3, 4], [4, 5, 6, 7], [7, 8]]); }); Deno.test("cycle", () => { let a; const x = [1, 2, 3]; a = [...cycle(x, 0, 2)]; assertEquals(a, [1, 2]); a = [...cycle(x, 0, 4)]; assertEquals(a, [1, 2, 3, 1]); a = [...cycle(x, 1, 6)]; assertEquals(a, [2, 3, 1, 2, 3, 1]); }); Deno.test("repeat", () => { let a; const x = [1, 2]; a = [...repeat(x, 2)]; assertEquals(a, [1, 2, 1, 2]); a = [...repeat(x, 3)]; assertEquals(a, [1, 2, 1, 2, 1, 2]); }); Deno.test("reverse", () => { const x = [1, 2, 3, 4]; const a = [...reverse(x)]; assertEquals(a, [4, 3, 2, 1]); }); Deno.test("rotate", () => { let a; const x = [1, 2, 3, 4]; a = [...rotate(x, 1)]; assertEquals(a, [2, 3, 4, 1]); a = [...rotate(x, 2)]; assertEquals(a, [3, 4, 1, 2]); a = [...rotate(x, -1)]; assertEquals(a, [4, 1, 2, 3]); }); Deno.test("intermix", () => { let a; const x = [1, 2, 3, 4]; const y = [10, 20, 30]; a = [...intermix(x, [10])]; assertEquals(a, [1, 10, 2, 10, 3, 10, 4]); a = [...intermix(x, y)]; assertEquals(a, [1, 10, 2, 20, 3, 30, 4]); a = [...intermix(x, y, 2)]; assertEquals(a, [1, 2, 10, 3, 4]); a = [...intermix(x, y, 1, 2)]; assertEquals(a, [1, 10, 20, 2, 30, 10, 3, 20, 30, 4]); }); Deno.test("interleave", () => { let y, a; const x = [1, 2, 3, 4]; y = [10, 20, 30, 40]; a = [...interleave([x, y])]; assertEquals(a, [1, 10, 2, 20, 3, 30, 4, 40]); y = [10, 20]; a = [...interleave([x, y])]; assertEquals(a, [1, 10, 2, 20, 3, 4]); }); Deno.test("interpolate", () => { const x = [1, 2, 3]; const a = [...interpolate(x, (a, b) => (a + b)/2)]; assertEquals(a, [1, 1.5, 2, 2.5, 3]); }); Deno.test("intersperse", () => { let x, a; x = [1, 2, 3]; a = [...intersperse(x, 10)]; assertEquals(a, [1, 10, 2, 10, 3]); x = [1, 2, 3, 4]; a = [...intersperse(x, 10)]; assertEquals(a, [1, 10, 2, 10, 3, 10, 4]); }); // COMBINE // ------- Deno.test("concat", () => { let a; const x = [1, 2]; const y = [3, 4]; a = [...concat(x, y)]; assertEquals(a, [1, 2, 3, 4]); a = [...concat(x, y, y)]; assertEquals(a, [1, 2, 3, 4, 3, 4]); }); Deno.test("merge", () => { let y, a; const x = [1, 3, 5, 7]; y = [2, 4, 8]; a = [...merge([x, y])]; assertEquals(a, [ 1, 2, 3, 4, 5, 7, 8 ]); y = [-2, -4, -8]; a = [...merge([x, y], (a, b) => Math.abs(a) - Math.abs(b))]; assertEquals(a, [ 1, -2, 3, -4, 5, 7, -8 ]); a = [...merge([x, y], null, v => Math.abs(v))]; assertEquals(a, [ 1, -2, 3, -4, 5, 7, -8 ]); }); Deno.test("join", () => { let a; const x = [1, 2]; a = join(x); assertEquals(a, "1,2"); a = join(x, " : "); assertEquals(a, "1 : 2"); }); // SET OPERATIONS // -------------- Deno.test("isUnique", () => { let a; const x = [1, 2, -1, -2]; a = isUnique(x); assertEquals(a, true); a = isUnique(x, (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, false); a = isUnique(x, null, v => Math.abs(v)); assertEquals(a, false); }); Deno.test("isDisjoint", () => { let a; const x = [1, 2, 3, 4]; a = isDisjoint(x, [2, 5]); assertEquals(a, false); a = isDisjoint(x, [-2, -5]); assertEquals(a, true); a = isDisjoint(x, [-2, -5], (a, b) => Math.abs(a) - Math.abs(b)); assertEquals(a, false); a = isDisjoint(x, [-2, -5], null, v => Math.abs(v)); assertEquals(a, false); }); Deno.test("unique", () => { let x, a; x = [1, 2, 3, 4, 2, 3]; a = [...unique(x)]; assertEquals(a, [1, 2, 3, 4]); x = [1, 2, 3, 4, -2, -3]; a = [...unique(x)]; assertEquals(a, [1, 2, 3, 4, -2, -3]); a = [...unique(x, (a, b) => Math.abs(a) - Math.abs(b))]; assertEquals(a, [1, 2, 3, 4]); a = [...unique(x, null, v => Math.abs(v))]; assertEquals(a, [1, 2, 3, 4]); }); Deno.test("union", () => { let y, a; const x = [1, 2, 3, 4]; y = [3, 4, 5]; a = [...union(x, y)]; assertEquals(a, [1, 2, 3, 4, 5]); y = [-3, -4, -5]; a = [...union(x, y)]; assertEquals(a, [ 1, 2, 3, 4, -3, -4, -5 ]); a = [...union(x, y, (a, b) => Math.abs(a) - Math.abs(b))]; assertEquals(a, [1, 2, 3, 4, -5]); a = [...union(x, y, null, v => Math.abs(v))]; assertEquals(a, [1, 2, 3, 4, -5]); }); Deno.test("intersection", () => { let y, a; const x = [1, 2, 3, 4]; y = [2, 3, 5]; a = [...intersection(x, y)]; assertEquals(a, [2, 3]); y = [-2, -3, -5]; a = [...intersection(x, y, (a, b) => Math.abs(a) - Math.abs(b))]; assertEquals(a, [2, 3]); a = [...intersection(x, y, null, v => Math.abs(v))]; assertEquals(a, [2, 3]); }); Deno.test("difference", () => { let y, a; const x = [1, 2, 3, 4, 5]; y = [2, 4]; a = [...difference(x, y)]; assertEquals(a, [1, 3, 5]); y = [-2, -4]; a = [...difference(x, y)]; assertEquals(a, [1, 2, 3, 4, 5]); a = [...difference(x, y, (a, b) => Math.abs(a) - Math.abs(b))]; assertEquals(a, [1, 3, 5]); a = [...difference(x, y, null, v => Math.abs(v))]; assertEquals(a, [1, 3, 5]); }); Deno.test("symmetricDifference", () => { let y, a; const x = [1, 2, 3, 4]; y = [3, 4, 5]; a = [...symmetricDifference(x, y)]; assertEquals(a, [1, 2, 5]); y = [-3, -4, -5]; a = [...symmetricDifference(x, y)]; assertEquals(a, [ 1, 2, 3, 4, -3, -4, -5 ]); a = [...symmetricDifference(x, y, (a, b) => Math.abs(a) - Math.abs(b))]; assertEquals(a, [1, 2, -5]); a = [...symmetricDifference(x, y, null, v => Math.abs(v))]; assertEquals(a, [1, 2, -5]); }); Deno.test("cartesianProduct", () => { let a; const x = [1, 2, 3]; const y = [10, 20, 30]; a = [...cartesianProduct([x, y])]; assertEquals(a, [ [1, 10], [1, 20], [1, 30], [2, 10], [2, 20], [2, 30], [3, 10], [3, 20], [3, 30] ]); a = [...cartesianProduct([x, y], ([a, b]) => a + b)]; assertEquals(a, [ 11, 21, 31, 12, 22, 32, 13, 23, 33 ]); });