UNPKG

extra-object

Version:

A collection of methods for working with Objects.<br>

1,119 lines (909 loc) • 24.4 kB
import {assertEquals} from "@std/assert"; import { type Dictionary, type MapFunction, is, keys, values, entries, fromEntries, fromLists, compare, isEqual, size, isEmpty, get, getAll, getPath, hasPath, set, set$, setPath$, swap, swap$, remove, remove$, removePath$, count, countAs, min, minEntry, max, maxEntry, range, rangeEntries, head, tail, take, take$, drop, drop$, subsets, randomKey, randomEntry, randomSubset, has, hasValue, hasEntry, hasSubset, find, findAll, search, searchAll, searchValue, searchValueAll, forEach, some, every, map, map$, reduce, filter, filter$, filterAt, filterAt$, reject, reject$, rejectAt, rejectAt$, flat, flatMap, zip, partition, partitionAs, chunk, concat, concat$, join, isDisjoint, unionKeys, union, union$, intersectionKeys, intersection, intersection$, difference, difference$, symmetricDifference, symmetricDifference$, cartesianProduct, } from "./index.ts"; import { type EndFunction, head as arrayHead, some as arraySome, every as arrayEvery, } from "@nodef/extra-array"; // ABOUT // ----- Deno.test("is", () => { let a; a = is({a: 1, b: 2}); assertEquals(a, true); a = is({}); assertEquals(a, true); a = is(1); assertEquals(a, false); }); Deno.test("keys", () => { const x = {a: 1, b: 2, c: 3}; const a = keys(x); assertEquals([...a], ["a", "b", "c"]); }); Deno.test("values", () => { const x = {a: 1, b: 2, c: 3}; const a = values(x); assertEquals([...a], [1, 2, 3]); }); Deno.test("entries", () => { const x = {a: 1, b: 2, c: 3}; const a = entries(x); assertEquals([...a], [["a", 1], ["b", 2], ["c", 3]]); }); // GENERATE // -------- Deno.test("fromEntries", () => { const es: [string, number][] = [["a", 1], ["b", 2], ["c", 3]]; const a = fromEntries(es); assertEquals(a, {a: 1, b: 2, c: 3}); }); Deno.test("fromLists", () => { const ls: [string[], number[]] = [["a", "b", "c"], [1, 2, 3]]; const a = fromLists(ls); assertEquals(a, {a: 1, b: 2, c: 3}); }); // COMPARE // ------- Deno.test("compare", () => { let z, a; const x = {a: 1, b: 2}; const y = {a: 1, b: 2, c: 3}; a = compare(x, y); assertEquals(a, -1); z = {a: 1, b: 2}; a = compare(x, z); assertEquals(a, 0); z = {a: 1, b: -2}; a = compare(x, z); assertEquals(a, 1); a = compare(x, z, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, 0); a = compare(x, z, null, v => Math.abs(v as number)); assertEquals(a, 0); }); Deno.test("isEqual", () => { let a; const x = {a: 1, b: 2}; a = isEqual(x, {a: 1, b: 2}); assertEquals(a, true); a = isEqual(x, {a: 11, b: 12}); assertEquals(a, false); a = isEqual(x, {a: 11, b: 12}, (a, b) => (a as number % 10) - (b as number % 10)); assertEquals(a, true); a = isEqual(x, {a: 11, b: 12}, null, v => (v as number) % 10); assertEquals(a, true); }); // SIZE // ---- Deno.test("size", () => { const x = {a: 1, b: 2, c: 3}; const a = size(x); assertEquals(a, 3); }); Deno.test("isEmpty", () => { let x: Dictionary, a; x = {a: 1, b: 2, c: 3}; a = isEmpty(x); assertEquals(a, false); x = {}; a = isEmpty(x); assertEquals(a, true); }); // GET/SET // ------- Deno.test("get", () => { let a; const x = {a: 2, b: 4, c: 6, d: 8}; a = get(x, "b"); assertEquals(a, 4); a = get(x, "d"); assertEquals(a, 8); }); Deno.test("getAll", () => { let a; const x = {a: 2, b: 4, c: 6, d: 8}; a = getAll(x, ["b", "c"]); assertEquals(a, [4, 6]); a = getAll(x, ["e"]); assertEquals(a, [undefined]); }); Deno.test("getPath", () => { let a; const x = {a: {b: 2, c: 3}, d: 4}; a = getPath(x, ["d"]); assertEquals(a, 4); a = getPath(x, ["a", "b"]); assertEquals(a, 2); a = getPath(x, ["a", "b", "c"]); assertEquals(a, undefined); }); Deno.test("hasPath", () => { let a; const x = {a: {b: 2, c: 3}, d: 4}; a = hasPath(x, ["d"]); assertEquals(a, true); a = hasPath(x, ["a", "b"]); assertEquals(a, true); a = hasPath(x, ["a", "b", "c"]); assertEquals(a, false); }); Deno.test("set", () => { let a; const x = {a: 2, b: 4, c: 6, d: 8}; a = set(x, "b", 40); assertEquals(a, {a: 2, b: 40, c: 6, d: 8}); a = set(x, "d", 80); assertEquals(a, {a: 2, b: 4, c: 6, d: 80}); }); Deno.test("set$", () => { let x, a; x = {a: 2, b: 4, c: 6, d: 8}; a = set$(x, "b", 40); assertEquals(a, {a: 2, b: 40, c: 6, d: 8}); assertEquals(x, {a: 2, b: 40, c: 6, d: 8}); x = {a: 2, b: 4, c: 6, d: 8}; a = set$(x, "d", 80); assertEquals(a, {a: 2, b: 4, c: 6, d: 80}); }); Deno.test("setPath$", () => { let a; const x = {a: {b: 2, c: 3}, d: 4}; a = setPath$(x, ["d"], 40); assertEquals(a, {a: {b: 2, c: 3}, d: 40}); assertEquals(x, {a: {b: 2, c: 3}, d: 40}); a = setPath$(x, ["a", "b"], 20); assertEquals(a, {a: {b: 20, c: 3}, d: 40}); a = setPath$(x, ["a", "b", "c"], 30); assertEquals(a, {a: {b: 20, c: 3}, d: 40}); // no effect }); Deno.test("swap", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4}; a = swap(x, "a", "b"); assertEquals(a, {a: 2, b: 1, c: 3, d: 4}); a = swap(x, "a", "d"); assertEquals(a, {a: 4, b: 2, c: 3, d: 1}); }); Deno.test("swap$", () => { let x, a; x = {a: 1, b: 2, c: 3, d: 4}; a = swap$(x, "a", "b"); assertEquals(a, {a: 2, b: 1, c: 3, d: 4}); assertEquals(x, {a: 2, b: 1, c: 3, d: 4}); x = {a: 1, b: 2, c: 3, d: 4}; a = swap$(x, "a", "d"); assertEquals(a, {a: 4, b: 2, c: 3, d: 1}); }); Deno.test("remove", () => { let a; const x = {a: 2, b: 4, c: 6, d: 8}; a = remove(x, "b"); assertEquals(a, {a: 2, c: 6, d: 8}); a = remove(x, "d"); assertEquals(a, {a: 2, b: 4, c: 6}); }); Deno.test("remove$", () => { let x, a; x = {a: 2, b: 4, c: 6, d: 8}; a = remove$(x, "b"); assertEquals(a, {a: 2, c: 6, d: 8}); assertEquals(x, {a: 2, c: 6, d: 8}); x = {a: 2, b: 4, c: 6, d: 8}; a = remove$(x, "d"); assertEquals(a, {a: 2, b: 4, c: 6}); }); Deno.test("removePath$", () => { let a; const x: Dictionary = {a: {b: 2, c: 3}, d: 4}; a = removePath$(x, ["d"]); assertEquals(a, { a: { b: 2, c: 3 } }); assertEquals(x, { a: { b: 2, c: 3 } }); a = removePath$(x, ["a", "b"]); assertEquals(a, { a: { c: 3 } }); a = removePath$(x, ["a", "b", "c"]); assertEquals(a, { a: { c: 3 } }); }) // PROPERTY // -------- Deno.test("count", () => { let a; const x = {a: 1, b: 1, c: 2, d: 2, e: 4}; a = count(x, v => (v as number) % 2 === 1); assertEquals(a, 2); a = count(x, v => (v as number) % 2 === 0); assertEquals(a, 3); }); Deno.test("countAs", () => { let x: Dictionary, a; x = {a: 1, b: 1, c: 2, d: 2, e: 4}; a = countAs(x); assertEquals(a, new Map([[1, 2], [2, 2], [4, 1]])); x = {a: 1, b: 2, c: 3, d: 4}; a = countAs(x, v => (v as number) % 2); assertEquals(a, new Map([[1, 2], [0, 2]])); }); Deno.test("min", () => { let a; const x = {a: 1, b: 2, c: -3, d: -4}; a = min(x); assertEquals(a, -4); a = min(x, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, 1); a = min(x, null, v => Math.abs(v as number)); assertEquals(a, 1); }); Deno.test("minEntry", () => { let a; const x = {a: 1, b: 2, c: -3, d: -4}; a = minEntry(x); assertEquals(a, ["d", -4]); a = minEntry(x, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, ["a", 1]); a = minEntry(x, null, v => Math.abs(v as number)); assertEquals(a, ["a", 1]); }); Deno.test("max", () => { let a; const x = {a: 1, b: 2, c: -3, d: -4}; a = max(x); assertEquals(a, 2); a = max(x, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, -4); a = max(x, null, v => Math.abs(v as number)); assertEquals(a, -4); }); Deno.test("maxEntry", () => { let a; const x = {a: 1, b: 2, c: -3, d: -4}; a = maxEntry(x); assertEquals(a, ["b", 2]); a = maxEntry(x, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, ["d", -4]); a = maxEntry(x, null, v => Math.abs(v as number)); assertEquals(a, ["d", -4]); }); Deno.test("range", () => { let a; const x = {a: 1, b: 2, c: -3, d: -4}; a = range(x); assertEquals(a, [-4, 2]); a = range(x, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, [1, -4]); a = range(x, null, v => Math.abs(v as number)); assertEquals(a, [1, -4]); }); Deno.test("rangeEntries", () => { let a; const x = {a: 1, b: 2, c: -3, d: -4}; a = rangeEntries(x); assertEquals(a, [["d", -4], ["b", 2]]); a = rangeEntries(x, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, [["a", 1], ["d", -4]]); a = rangeEntries(x, null, v => Math.abs(v as number)); assertEquals(a, [["a", 1], ["d", -4]]); }); // PART // ---- Deno.test("head", () => { let a; a = head({a: 1, b: 2, c: 3}); assertEquals(a, ["a", 1]); a = head({}); assertEquals(a, [] as unknown as [string, unknown]); }); Deno.test("tail", () => { let a; a = tail({a: 1, b: 2, c: 3}); assertEquals(a, {b: 2, c: 3}); a = tail({a: 1}); assertEquals(a, {}); }); Deno.test("take", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = take(x, 2); assertEquals(a, {a: 1, b: 2}); a = take(x, 3); assertEquals(a, {a: 1, b: 2, c: 3}); }); Deno.test("take$", () => { let x, a; x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = take$(x, 2); assertEquals(a, {a: 1, b: 2}); assertEquals(x, {a: 1, b: 2}); x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = take$(x, 3); assertEquals(a, {a: 1, b: 2, c: 3}); }); Deno.test("drop", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = drop(x, 2); assertEquals(a, {c: 3, d: 4, e: 5}); a = drop(x, 3); assertEquals(a, {d: 4, e: 5}); }); Deno.test("drop$", () => { let x, a; x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = drop$(x, 2); assertEquals(a, {c: 3, d: 4, e: 5}); assertEquals(x, {c: 3, d: 4, e: 5}); x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = drop$(x, 3); assertEquals(a, {d: 4, e: 5}); }); // ARRANGEMENTS // ------------ Deno.test("subsets", () => { let x: Dictionary, a; x = {a: 1, b: 2}; a = subsets(x); assertEquals([...a], [{}, {a: 1}, {b: 2}, {a: 1, b: 2}]); x = {a: 1, b: 2, c: 3}; a = subsets(x); assertEquals([...a], [ {}, {a: 1}, {b: 2}, {a: 1, b: 2}, {c: 3}, {a: 1, c: 3}, {b: 2, c: 3}, {a: 1, b: 2, c: 3}, ]); }); Deno.test("randomKey", () => { let a; const x = {a: 1, b: 2, c: 3}; a = randomKey(x); assertEquals(has(x, a), true); a = randomKey(x); assertEquals(has(x, a), true); }); Deno.test("randomEntry", () => { let a; const x = {a: 1, b: 2, c: 3}; a = randomEntry(x); assertEquals(hasEntry(x, a), true); a = randomEntry(x); assertEquals(hasEntry(x, a), true); }); Deno.test("randomSubset", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4}; a = randomSubset(x); assertEquals(hasSubset(x, a), true); a = randomSubset(x, 3); assertEquals(hasSubset(x, a), true); a = randomSubset(x, 2); assertEquals(hasSubset(x, a), true); }); // FIND // ---- Deno.test("has", () => { let a; const x = {a: 1, b: 2, c: -3}; a = has(x, "d"); assertEquals(a, false); a = has(x, "c"); assertEquals(a, true); }); Deno.test("hasValue", () => { let a; const x = {a: 1, b: 2, c: -3}; a = hasValue(x, 3); assertEquals(a, false); a = hasValue(x, 3, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, true); a = hasValue(x, 3, null, v => Math.abs(v as number)); assertEquals(a, true); }); Deno.test("hasEntry", () => { let a; const x = {a: 1, b: 2, c: -3}; a = hasEntry(x, ["c", 3]); assertEquals(a, false); a = hasEntry(x, ["c", 3], (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, true); a = hasEntry(x, ["c", 3], null, v => Math.abs(v as number)); assertEquals(a, true); }); Deno.test("hasSubset", () => { let y, a; const x = {a: 1, b: 2, c: 3, d: 4}; y = {b: 2, d: 4}; a = hasSubset(x, y); assertEquals(a, true); y = {b: -2, d: -4}; a = hasSubset(x, y); assertEquals(a, false); a = hasSubset(x, y, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, true); a = hasSubset(x, y, null, v => Math.abs(v as number)); assertEquals(a, true); }); Deno.test("find", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4}; a = find(x, v => (v as number) % 2 === 0); assertEquals(a, 2); a = find(x, v => (v as number) % 8 === 0); assertEquals(a, undefined); }); Deno.test("findAll", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4}; a = findAll(x, v => (v as number) % 2 === 0); assertEquals(a, [2, 4]); a = findAll(x, v => (v as number) % 8 === 0); assertEquals(a, []); }); Deno.test("search", () => { let a; const x = {a: 1, b: 2, c: 3, d: 2}; a = search(x, v => v === 2); assertEquals(a, "b"); a = search(x, v => v === 4); assertEquals(a, null); }); Deno.test("searchAll", () => { let a; const x = {a: 1, b: 2, c: 3, d: -2}; a = searchAll(x, v => (v as number) === 2); assertEquals(a, ["b"]); a = searchAll(x, v => Math.abs(v as number) === 2); assertEquals(a, ["b", "d"]); }); Deno.test("searchValue", () => { let a; const x = {a: 1, b: -2, c: 3, d: 2, e: 5}; a = searchValue(x, 2); assertEquals(a, "d"); a = searchValue(x, 2, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, "b"); a = searchValue(x, 2, null, v => Math.abs(v as number)); assertEquals(a, "b"); }); Deno.test("searchValueAll", () => { let a; const x = {a: 1, b: -2, c: 3, d: 2, e: 5}; a = searchValueAll(x, 2); assertEquals(a, ["d"]); a = searchValueAll(x, 2, (a, b) => Math.abs(a as number) - Math.abs(b as number)); assertEquals(a, ["b", "d"]); a = searchValueAll(x, 2, null, v => Math.abs(v as number)); assertEquals(a, ["b", "d"]); }); // FUNCTIONAL // ---------- Deno.test("forEach", () => { const x = {a: 1, b: 2, c: -3, d: -4}; const a: number[] = []; forEach(x, v => a.push(v as number)); assertEquals(a, [1, 2, -3, -4]); }); Deno.test("some", () => { let a; const x = {a: 1, b: 2, c: -3, d: -4}; a = some(x, v => (v as number) > 10); assertEquals(a, false); a = some(x, v => (v as number) < 0); assertEquals(a, true); }); Deno.test("every", () => { let a; const x = {a: 1, b: 2, c: -3, d: -4}; a = every(x, v => (v as number) > 0); assertEquals(a, false); a = every(x, v => (v as number) > -10); assertEquals(a, true); }); Deno.test("map", () => { const x = {a: 1, b: 2, c: 3, d: 4}; const a = map(x, v => (v as number) * 2); assertEquals(a, {a: 2, b: 4, c: 6, d: 8}); }); Deno.test("map$", () => { const x = {a: 1, b: 2, c: 3, d: 4}; const a = map$(x, v => (v as number) * 2); assertEquals(a, {a: 2, b: 4, c: 6, d: 8}); assertEquals(x, {a: 2, b: 4, c: 6, d: 8}); }); Deno.test("reduce", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4}; a = reduce(x, (acc, v) => (acc as number) + (v as number)); assertEquals(a, 10); a = reduce(x, (acc, v) => (acc as number) + (v as number), 100); assertEquals(a, 110); }); Deno.test("filter", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = filter(x, v => (v as number) % 2 === 1); assertEquals(a, {a: 1, c: 3, e: 5}); a = filter(x, v => (v as number) % 2 === 0); assertEquals(a, {b: 2, d: 4}); }); Deno.test("filter$", () => { let x, a; x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = filter$(x, v => (v as number) % 2 === 1); assertEquals(a, {a: 1, c: 3, e: 5}); assertEquals(x, {a: 1, c: 3, e: 5}); x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = filter$(x, v => (v as number) % 2 === 0); assertEquals(a, {b: 2, d: 4}); }); Deno.test("filterAt", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = filterAt(x, ["a", "c", "e"]); assertEquals(a, {a: 1, c: 3, e: 5}); a = filterAt(x, ["b", "d"]); assertEquals(a, {b: 2, d: 4}); }); Deno.test("filterAt$", () => { let x, a; x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = filterAt$(x, ["a", "c", "e"]); assertEquals(a, {a: 1, c: 3, e: 5}); assertEquals(x, {a: 1, c: 3, e: 5}); x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = filterAt$(x, ["b", "d"]); assertEquals(a, {b: 2, d: 4}); }); Deno.test("reject", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = reject(x, v => (v as number) % 2 === 1); assertEquals(a, {b: 2, d: 4}); a = reject(x, v => (v as number) % 2 === 0); assertEquals(a, {a: 1, c: 3, e: 5}); }); Deno.test("reject$", () => { let x, a; x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = reject$(x, v => (v as number) % 2 === 1); assertEquals(a, {b: 2, d: 4}); assertEquals(x, {b: 2, d: 4}); x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = reject$(x, v => (v as number) % 2 === 0); assertEquals(a, {a: 1, c: 3, e: 5}); }); Deno.test("rejectAt", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = rejectAt(x, ["a", "c", "e"]); assertEquals(a, {b: 2, d: 4}); a = rejectAt(x, ["b", "d"]); assertEquals(a, {a: 1, c: 3, e: 5}); }); Deno.test("rejectAt$", () => { let x, a; x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = rejectAt$(x, ["a", "c", "e"]); assertEquals(a, {b: 2, d: 4}); assertEquals(x, {b: 2, d: 4}); x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = rejectAt$(x, ["b", "d"]); assertEquals(a, {a: 1, c: 3, e: 5}); }); Deno.test("flat", () => { let a; const x = {ab: {a: 1, b: 2}, cde: {c: 3, de: {d: 4, e: {e: 5}}}}; a = flat(x); assertEquals(a, {a: 1, b: 2, c: 3, d: 4, e: 5}); a = flat(x, 1); assertEquals(a, {a: 1, b: 2, c: 3, de: {d: 4, e: {e: 5}}}); a = flat(x, 2); assertEquals(a, {a: 1, b: 2, c: 3, d: 4, e: {e: 5}}); }); Deno.test("flatMap", () => { let a; const x = {ab: {a: 1, b: 2}, cde: {c: 3, de: {d: 4, e: {e: 5}}}}; a = flatMap(x); assertEquals(a, {a: 1, b: 2, c: 3, de: {d: 4, e: {e: 5}}}); a = flatMap(x, v => flat(v as Dictionary, 1)); assertEquals(a, {a: 1, b: 2, c: 3, d: 4, e: {e: 5}}); a = flatMap(x, v => flat(v as Dictionary, 2)); assertEquals(a, {a: 1, b: 2, c: 3, d: 4, e: 5}); }); Deno.test("zip", () => { let a; const x = {a: 1, b: 2, c: 3}; const y = {a: 10, b: 20}; a = zip([x, y]); assertEquals(a, {a: [1, 10], b: [2, 20]}); // shortest a = zip([x, y], (([a, b]: [number, number]) => a + b) as MapFunction); assertEquals(a, {a: 11, b: 22}); a = zip([x, y], null, arraySome); assertEquals(a, {a: [1, 10], b: [2, 20]}); // shortest a = zip([x, y], null, arrayEvery, 0); assertEquals(a, {a: [1, 10], b: [2, 20], c: [3, 0]}); // longest a = zip([x, y], null, arrayHead as unknown as EndFunction, 0); assertEquals(a, {a: [1, 10], b: [2, 20], c: [3, 0]}); // first }); // MANIPULATION // ------------ Deno.test("partition", () => { let x: Dictionary, a; x = {a: 1, b: 2, c: 3, d: 4}; a = partition(x, v => (v as number) % 2 == 0); assertEquals(a, [{b: 2, d: 4}, {a: 1, c: 3}]); x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = partition(x, v => (v as number) % 2 == 1); assertEquals(a, [{a: 1, c: 3, e: 5}, {b: 2, d: 4}]); }); Deno.test("partitionAs", () => { let x: Dictionary, a; x = {a: 1, b: 2, c: 3, d: 4}; a = partitionAs(x, v => (v as number) % 2 == 0); assertEquals(a, new Map([[false, {a: 1, c: 3}], [true, {b: 2, d: 4}]])); x = {a: 1, b: 2, c: 3, d: 4, e: 5}; a = partitionAs(x, v => (v as number) % 3); assertEquals(a, new Map([[1, {a: 1, d: 4}], [2, {b: 2, e: 5}], [0, {c: 3}]])); }); Deno.test("chunk", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8}; a = chunk(x, 3); assertEquals(a, [{a: 1, b: 2, c: 3}, {d: 4, e: 5, f: 6}, {g: 7, h: 8}]); a = chunk(x, 2, 3); assertEquals(a, [{a: 1, b: 2}, {d: 4, e: 5}, {g: 7, h: 8}]); a = chunk(x, 4, 3); assertEquals(a, [ {a: 1, b: 2, c: 3, d: 4}, {d: 4, e: 5, f: 6, g: 7}, {g: 7, h: 8}, ]); }); // COMBINE // ------- Deno.test("concat", () => { let a; const x = {a: 1, b: 2}; const y = {c: 3, d: 4}; a = concat(x, y); assertEquals(a, {a: 1, b: 2, c: 3, d: 4}); const z = {d: 40, e: 50}; a = concat(x, y, z); assertEquals(a, {a: 1, b: 2, c: 3, d: 40, e: 50}); }); Deno.test("concat$", () => { let x, y, a; x = {a: 1, b: 2}; y = {c: 3, d: 4}; a = concat$(x, y); assertEquals(a, {a: 1, b: 2, c: 3, d: 4}); assertEquals(x, {a: 1, b: 2, c: 3, d: 4}); x = {a: 1, b: 2}; y = {c: 3, d: 4}; const z = {d: 40, e: 50}; a = concat$(x, y, z); assertEquals(a, {a: 1, b: 2, c: 3, d: 40, e: 50}); }); Deno.test("join", () => { let a; const x = {a: 1, b: 2, c: 3}; a = join(x); assertEquals(a, "a=1,b=2,c=3"); a = join(x, ", ", " => "); assertEquals(a, "a => 1, b => 2, c => 3"); }); // SET OPERATIONS // -------------- Deno.test("isDisjoint", () => { let a; const x = {a: 1, b: 2, c: 3}; a = isDisjoint(x, {c: 3, d: 4}); assertEquals(a, false); a = isDisjoint(x, {d: 4}); assertEquals(a, true); }); Deno.test("unionKeys", () => { const x = {a: 1, b: 2, c: 3, d: 4}; const y = {b: 20, c: 30, e: 50}; const a = unionKeys(x, y); assertEquals(a, new Set(["a", "b", "c", "d", "e"])); }); Deno.test("union", () => { let a; const x = {a: 1, b: 2, c: 3}; const y = {b: 20, c: 30, d: 40}; a = union(x, y); assertEquals(a, {a: 1, b: 2, c: 3, d: 40}); a = union(x, y, (_a, b) => b); assertEquals(a, {a: 1, b: 20, c: 30, d: 40}); }); Deno.test("union$", () => { let x, y, a; x = {a: 1, b: 2, c: 3}; y = {b: 20, c: 30, d: 40}; a = union$(x, y); assertEquals(a, {a: 1, b: 2, c: 3, d: 40}); assertEquals(x, {a: 1, b: 2, c: 3, d: 40}); x = {a: 1, b: 2, c: 3}; y = {b: 20, c: 30, d: 40}; a = union$(x, y, (_a, b) => b); assertEquals(a, {a: 1, b: 20, c: 30, d: 40}); }); Deno.test("intersectionKeys", () => { const x = {a: 1, b: 2, c: 3, d: 4}; const y = {b: 20, c: 30, e: 50}; const a = intersectionKeys(x, y); assertEquals(a, new Set(["b", "c"])); }); Deno.test("intersection", () => { let a; const x = {a: 1, b: 2, c: 3, d: 4}; const y = {b: 20, c: 30, e: 50}; a = intersection(x, y); assertEquals(a, {b: 2, c: 3}); a = intersection(x, y, (_a, b) => b); assertEquals(a, {b: 20, c: 30}); }); Deno.test("intersection$", () => { let x, y, a; x = {a: 1, b: 2, c: 3, d: 4}; y = {b: 20, c: 30, e: 50}; a = intersection$(x, y); assertEquals(a, {b: 2, c: 3}); assertEquals(x, {b: 2, c: 3}); x = {a: 1, b: 2, c: 3, d: 4}; y = {b: 20, c: 30, e: 50}; a = intersection$(x, y, (_a, b) => b); assertEquals(a, {b: 20, c: 30}); }); Deno.test("difference", () => { let y, a; const x = {a: 1, b: 2, c: 3, d: 4, e: 5}; y = {b: 2, d: 4}; a = difference(x, y); assertEquals(a, {a: 1, c: 3, e: 5}); y = {b: -2, d: -4}; a = difference(x, y); assertEquals(a, {a: 1, c: 3, e: 5}); }); Deno.test("difference$", () => { let x, y, a; x = {a: 1, b: 2, c: 3, d: 4, e: 5}; y = {b: 2, d: 4}; a = difference$(x, y); assertEquals(a, {a: 1, c: 3, e: 5}); assertEquals(x, {a: 1, c: 3, e: 5}); x = {a: 1, b: 2, c: 3, d: 4, e: 5}; y = {b: -2, d: -4}; a = difference$(x, y); assertEquals(a, {a: 1, c: 3, e: 5}); }); Deno.test("symmetricDifference", () => { let y, a; const x = {a: 1, b: 2, c: 3, d: 4}; y = {c: 30, d: 40, e: 50, f: 60}; a = symmetricDifference(x, y); assertEquals(a, {a: 1, b: 2, e: 50, f: 60}); y = {d: 40, e: 50, f: 60}; a = symmetricDifference(x, y); assertEquals(a, {a: 1, b: 2, c: 3, e: 50, f: 60}); }); Deno.test("symmetricDifference$", () => { let x, y, a; x = {a: 1, b: 2, c: 3, d: 4}; y = {c: 30, d: 40, e: 50, f: 60}; a = symmetricDifference$(x, y); assertEquals(a, {a: 1, b: 2, e: 50, f: 60}); assertEquals(x, {a: 1, b: 2, e: 50, f: 60}); x = {a: 1, b: 2, c: 3, d: 4}; y = {d: 40, e: 50, f: 60}; a = symmetricDifference$(x, y); assertEquals(a, {a: 1, b: 2, c: 3, e: 50, f: 60}); }); Deno.test("cartesianProduct", () => { let a; const x = {a: 1, b: 2, c: 3}; const y = {d: 10, e: 20}; a = cartesianProduct([x, y]); assertEquals([...a], [ {a: 1, d: 10}, {a: 1, e: 20}, {b: 2, d: 10}, {b: 2, e: 20}, {c: 3, d: 10}, {c: 3, e: 20}, ]); a = cartesianProduct([x, y], a => max(a as Dictionary)); assertEquals([...a], [10, 20, 10, 20, 10, 20]); });