import { assert } from "tsafe/assert"; import { every, allEqualsTo, allEquals, removeDuplicates, partition, allUniq, and, count, includes, or, sameAs, diff } from "./index"; import { arrEvery } from "./every"; import { arrPartition } from "./partition"; import { same } from "../inDepth/same"; assert(["foo", "foo", "foo"].reduce(...every(e => e === "foo")) === true); assert(["foo", "foo", "bar"].reduce(...every(e => e === "foo")) === false); assert(arrEvery([], (e: string) => e === "foo") === true); assert([].reduce(...every(e => e === "foo")) === true); assert(["foo", "foo", "foo"].reduce(...allEqualsTo("foo")) === true); assert(["foo"].reduce(...allEqualsTo("foo")) === true); assert([].reduce(...allEqualsTo("foo")) === true); assert(["foo", "bar", "foo"].reduce(...allEqualsTo("foo")) === false); assert(["bar", "bar", "foo"].reduce(...allEqualsTo("foo")) === false); assert(["bar"].reduce(...allEqualsTo("foo")) === false); assert( ["foo", "foo_", "foo__"].reduce( ...allEqualsTo( "foo", (e1, to) => e1.startsWith(to)) ) === true ); assert( ["foo", "foo_", "foo__", "_foo"].reduce( ...allEqualsTo( "foo", (e1, to) => e1.startsWith(to) ) ) === false ); assert(["foo", "foo"].reduce(...allEquals()) === true); assert(["foo"].reduce(...allEquals()) === true); assert([].reduce(...allEquals()) === true); assert(["foo", "bar"].reduce(...allEquals()) === false); assert(["foo", "bar", "baz"].reduce(...allEquals()) === false); assert( [ ["a", "b", "c"], ["a", "b", "c"], ["a", "b", "c"] ].reduce(...allEquals( (e1, e2) => JSON.stringify(e1) === JSON.stringify(e2) )) === true ); const areSameStringArr = (arr1: string[], arr2: string[]) => JSON.stringify(arr1) === JSON.stringify(arr2) ; assert( [ ["a", "b", "c"], ["a", "b", "c", "d"], ].reduce(...allEquals( areSameStringArr )) === false ); assert( [["foo", "bar"], ["foo", "bar"]].reduce( ...allEquals( (e1, e2) => [e1, e2].map(e => JSON.stringify(e)).reduce(...allEquals()) ) ) === true ); assert(areSameStringArr( ["foo", "foo", "bar", "baz"].reduce(...removeDuplicates()), ["foo", "bar", "baz"] )); assert(areSameStringArr( ["foo", "foo"].reduce(...removeDuplicates()), ["foo"] )); assert(areSameStringArr( ["foo", "foo", "bar", "bar"].reduce(...removeDuplicates()), ["foo", "bar"] )); assert(areSameStringArr( ["foo"].reduce(...removeDuplicates()), ["foo"] )); assert(areSameStringArr( [].reduce(...removeDuplicates()), [] )); assert( JSON.stringify( [["a", "b", "c"], ["a", "b", "c", "d"], ["a", "b", "c"]].reduce(...removeDuplicates(areSameStringArr)) ) === JSON.stringify( [["a", "b", "c"], ["a", "b", "c", "d"]] ) ); { const [arr1, arr2] = (["FOO", "BAR", "FOO"] as const).reduce(...partition((e: "FOO" | "BAR"): e is "BAR" => e === "BAR")); assert(areSameStringArr(arr1, ["BAR"])); assert(areSameStringArr(arr2, ["FOO", "FOO"])); } { const [arr1, arr2] = arrPartition(["FOO", "BAR", "FOO"] as const, (e): e is "BAR" => e === "BAR"); assert(areSameStringArr(arr1, ["BAR"])); assert(areSameStringArr(arr2, ["FOO", "FOO"])); } assert(["foo", "bar", "baz"].reduce(...allUniq()) === true); assert([].reduce(...allUniq()) === true); assert(["foo", "bar", "foo"].reduce(...allUniq()) === false); { const check = (arr: string[]) => arr .reduce(...and([ arr => arr.length !== 0, arr => arr.reduce(...allUniq()), arr => !arr.reduce(...includes("me")) ])) ; assert(check(["alice", "bob", "louis"]) === true); assert(check([]) === false); assert(check(["alice", "bob", "alice", "louis"]) === false); assert(check(["alice", "bob", "louis", "me"]) === false); } assert(["foo", "bar", "baz", "hello"].reduce(...count(e => e.startsWith("b"))) === 2); assert( [] .reduce(...or([ arr => arr.length === 0, arr => arr.length >= 3 ])) === true ); assert( ["a", "b", "c", "d"] .reduce(...or([ arr => arr.length === 0, arr => arr.length >= 3 ])) === true ); assert( ["a", "b"] .reduce(...or([ arr => arr.length === 0, arr => arr.length >= 3 ])) === false ); assert(["a", "b"].reduce(...sameAs(["a", "b"])) === true); assert(["a", "b"].reduce(...sameAs(["a", "bc"])) === false); assert(["a", "b"].reduce(...sameAs(["a", "b", "c"])) === false); assert( same( ["bob", "alice"].reduce(...diff(["bob", "louis"])), { "added": ["louis"], "removed": ["alice"] }, { "takeIntoAccountArraysOrdering": false } ) ); console.log("PASS reducers");