@softwareventures/array
Version:
Pure functional array manipulation and traversal
336 lines • 13.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ava_1 = tslib_1.__importDefault(require("ava"));
const index_1 = require("./index");
(0, ava_1.default)("isArray", t => {
t.true((0, index_1.isArray)([1, 2, 3]));
t.false((0, index_1.isArray)({ length: 3 }));
});
(0, ava_1.default)("isArrayLike", t => {
t.true((0, index_1.isArrayLike)([1, 2, 3]));
t.true((0, index_1.isArrayLike)({ length: 3 }));
t.false((0, index_1.isArrayLike)({}));
t.false((0, index_1.isArrayLike)(3));
});
(0, ava_1.default)("first", t => {
t.is((0, index_1.first)([1, 2, 3]), 1);
t.is((0, index_1.first)([]), null);
});
(0, ava_1.default)("tail", t => {
t.deepEqual((0, index_1.tail)([1, 2, 3, 4]), [2, 3, 4]);
t.deepEqual((0, index_1.tail)([]), []);
});
(0, ava_1.default)("initial", t => {
t.deepEqual((0, index_1.initial)([1, 2, 3, 4]), [1, 2, 3]);
t.deepEqual((0, index_1.initial)([]), []);
});
(0, ava_1.default)("last", t => {
t.is((0, index_1.last)([]), null);
t.is((0, index_1.last)([1, 2, 3]), 3);
});
(0, ava_1.default)("only", t => {
t.is((0, index_1.only)([]), null);
t.is((0, index_1.only)([4]), 4);
t.is((0, index_1.only)([3, 4, 5]), null);
});
(0, ava_1.default)("empty", t => {
t.true((0, index_1.empty)([]));
t.false((0, index_1.empty)([1, 2, 3]));
});
(0, ava_1.default)("reverse", t => {
const a = [1, 2, 4, 3];
t.deepEqual((0, index_1.reverse)(a), [3, 4, 2, 1]);
t.deepEqual(a, [1, 2, 4, 3]); // Ensure original array is untouched.
});
(0, ava_1.default)("slice", t => {
t.deepEqual((0, index_1.slice)([1, 2, 3, 4], 1), [2, 3, 4]);
t.deepEqual((0, index_1.slice)([1, 2, 3, 4, 5], 1, 4), [2, 3, 4]);
t.deepEqual((0, index_1.slice)([1, 2, 3], 2), [3]);
t.deepEqual((0, index_1.slice)([1, 2, 3], 0, 2), [1, 2]);
t.deepEqual((0, index_1.slice)([], 3, 5), []);
});
(0, ava_1.default)("takeWhile", t => {
t.deepEqual((0, index_1.takeWhile)([1, 2, 3, 4, 3, 2, 1], e => e < 4), [1, 2, 3]);
t.deepEqual((0, index_1.takeWhile)([1, 2, 3], (_, i) => i < 2), [1, 2]);
});
(0, ava_1.default)("dropWhile", t => {
t.deepEqual((0, index_1.dropWhile)([1, 2, 3, 4, 3, 2, 1], e => e < 4), [4, 3, 2, 1]);
t.deepEqual((0, index_1.dropWhile)([1, 2, 3], (_, i) => i < 2), [3]);
});
(0, ava_1.default)("equal", t => {
t.true((0, index_1.equal)([1, 2, 3], [1, 2, 3]));
t.false((0, index_1.equal)([1, 2, 3], [1, 2, 3, 4]));
t.false((0, index_1.equal)([1, 2, 3, 4], [1, 2, 3]));
t.false((0, index_1.equal)([1, 3, 3], [1, 2, 3]));
t.true((0, index_1.equal)([
[1, 2],
[3, 4]
], [
[1, 2],
[3, 4]
], index_1.equal));
t.false((0, index_1.equal)([
[1, 2],
[3, 4]
], [
[1, 2],
[3, 4]
]));
});
(0, ava_1.default)("prefixMatch", t => {
t.true((0, index_1.prefixMatch)([], []));
t.true((0, index_1.prefixMatch)([1, 2, 3], []));
t.true((0, index_1.prefixMatch)([1, 2, 3, 4], [1, 2]));
t.false((0, index_1.prefixMatch)([1, 3, 4], [1, 2]));
t.false((0, index_1.prefixMatch)([], [1]));
});
(0, ava_1.default)("map", t => {
t.deepEqual((0, index_1.map)([1, 2, 3], e => e + 1), [2, 3, 4]);
t.deepEqual((0, index_1.map)([1, 2, 3], (e, i) => (i === 1 ? e * 10 : e)), [1, 20, 3]);
});
(0, ava_1.default)("filter", t => {
t.deepEqual((0, index_1.filter)([1, 2, 3], e => e % 2 === 1), [1, 3]);
t.deepEqual((0, index_1.filter)([1, 3, 2, 4, 5], (_, i) => i % 2 === 0), [1, 2, 5]);
});
(0, ava_1.default)("exclude", t => {
t.deepEqual((0, index_1.exclude)([1, 2, 3, 4, 3, 2, 1], n => n < 3), [3, 4, 3]);
});
(0, ava_1.default)("excludeNull", t => {
t.deepEqual((0, index_1.excludeNull)(["a", null, "b"]), ["a", "b"]);
});
(0, ava_1.default)("excludeFirst", t => {
t.deepEqual((0, index_1.excludeFirst)([1, 2, 3, 4, 3, 2, 1], n => n > 2), [1, 2, 4, 3, 2, 1]);
});
(0, ava_1.default)("remove", t => {
t.deepEqual((0, index_1.remove)([1, 2, 3, 4, 3, 2, 1], 3), [1, 2, 4, 2, 1]);
});
(0, ava_1.default)("removeFirst", t => {
t.deepEqual((0, index_1.removeFirst)([1, 2, 3, 4, 3, 2, 1], 3), [1, 2, 4, 3, 2, 1]);
});
(0, ava_1.default)("fold", t => {
t.is((0, index_1.fold)([1, 2, 3], (a, e, i) => a + e * i, 0), 8);
});
(0, ava_1.default)("fold1", t => {
t.is((0, index_1.fold1)([1, 2, 3], (a, e, i) => a + e * i), 9);
});
(0, ava_1.default)("foldMap", t => {
t.is((0, index_1.foldMap)(["2", "3", "4"], (a, b) => a + b, parseFloat, 2), 11);
t.is((0, index_1.foldMap)([true, false, false], (a, b) => a.substr(0, a.length - 1) + b.substr(1), String, "jam"), "jarualsalse");
t.is((0, index_1.foldMap)(["2"], (a, b) => a + b, parseFloat, 0), 2);
});
(0, ava_1.default)("contains", t => {
t.true((0, index_1.contains)([1, 2, 3], 1));
t.false((0, index_1.contains)([1, 2, 3], 0));
});
(0, ava_1.default)("lastIndexOf", t => {
t.is((0, index_1.lastIndexOf)([1, 2, 3, 4, 3, 2, 1], 3), 4);
});
(0, ava_1.default)("findIndex", t => {
t.is((0, index_1.findIndex)([1, 2, 3, 4, 3, 2, 1], n => n >= 3), 2);
});
(0, ava_1.default)("findLastIndex", t => {
t.is((0, index_1.findLastIndex)([1, 2, 3, 4, 3, 2, 1], n => n >= 3), 4);
});
(0, ava_1.default)("find", t => {
t.is((0, index_1.find)([1, 2, 3, 4, 3, 2, 1], n => n >= 3), 3);
});
(0, ava_1.default)("findLast", t => {
t.is((0, index_1.findLast)([1, 2, 3, 4, 5, 2, 1], n => n >= 3), 5);
});
(0, ava_1.default)("maximum", t => {
t.is((0, index_1.maximum)([1, 2, 3]), 3);
t.is((0, index_1.maximum)([1, 2, 3, 4, 3, 2, 1]), 4);
t.is((0, index_1.maximum)([]), null);
});
(0, ava_1.default)("minimum", t => {
t.is((0, index_1.minimum)([1, 2, 3]), 1);
t.is((0, index_1.minimum)([2, 3, 4, 1, 2, 3]), 1);
t.is((0, index_1.minimum)([]), null);
});
(0, ava_1.default)("sum", t => {
t.is((0, index_1.sum)([1, 2, 3]), 6);
t.is((0, index_1.sum)([]), 0);
});
(0, ava_1.default)("product", t => {
t.is((0, index_1.product)([1, 2, 3]), 6);
t.is((0, index_1.product)([]), 1);
});
(0, ava_1.default)("and", t => {
t.true((0, index_1.and)([true, true, true]));
t.false((0, index_1.and)([true, false, true]));
t.true((0, index_1.and)([]));
});
(0, ava_1.default)("or", t => {
t.true((0, index_1.or)([true, false, true]));
t.false((0, index_1.or)([false, false, false]));
t.false((0, index_1.or)([]));
});
(0, ava_1.default)("any", t => {
t.true((0, index_1.any)([1, 2, 3], e => e > 2));
t.false((0, index_1.any)([1, 2, 3], e => e > 4));
});
(0, ava_1.default)("all", t => {
t.true((0, index_1.all)([1, 2, 3], e => e < 4));
t.false((0, index_1.all)([1, 2, 3], e => e > 2));
const mixed1 = [1, 2, "hello", 3, "goodbye"];
const mixed2 = [1, 2, 3];
const acceptNumbers = (array) => true;
const isNumber = (v) => typeof v === "number";
t.false((0, index_1.all)(mixed1, isNumber));
t.true((0, index_1.all)(mixed2, isNumber));
t.false((0, index_1.all)(mixed1, isNumber) ? acceptNumbers(mixed1) : false);
t.true((0, index_1.all)(mixed2, isNumber) ? acceptNumbers(mixed2) : false);
});
(0, ava_1.default)("concat", t => {
t.deepEqual((0, index_1.concat)([[1, 2], [], [3], [4, 5]]), [1, 2, 3, 4, 5]);
t.deepEqual((0, index_1.concat)([[], []]), []);
});
(0, ava_1.default)("prepend", t => {
t.deepEqual((0, index_1.prepend)([1, 2, 3])([4, 5, 6]), [1, 2, 3, 4, 5, 6]);
t.deepEqual((0, index_1.prepend)([])([4, 5, 6]), [4, 5, 6]);
t.deepEqual((0, index_1.prepend)([1, 2, 3])([]), [1, 2, 3]);
});
(0, ava_1.default)("append", t => {
t.deepEqual((0, index_1.append)([4, 5, 6])([1, 2, 3]), [1, 2, 3, 4, 5, 6]);
t.deepEqual((0, index_1.append)([])([1, 2, 3]), [1, 2, 3]);
t.deepEqual((0, index_1.append)([4, 5, 6])([]), [4, 5, 6]);
});
(0, ava_1.default)("concatMap", t => {
t.deepEqual((0, index_1.concatMap)(["1,2,3", "4,5,6"], s => s.split(",")), ["1", "2", "3", "4", "5", "6"]);
});
(0, ava_1.default)("scan", t => {
t.deepEqual((0, index_1.scan)([1, 2, 3], (a, e, i) => a + e * i, 0), [0, 2, 8]);
t.deepEqual((0, index_1.scan)(["a", "b", "c"], (a, e, i) => `${a} ${i} ${e}`, "_"), ["_ 0 a", "_ 0 a 1 b", "_ 0 a 1 b 2 c"]);
});
(0, ava_1.default)("scan1", t => {
t.deepEqual((0, index_1.scan1)([1, 2, 3], (a, e, i) => a + e * i), [1, 3, 9]);
});
(0, ava_1.default)("scanRight", t => {
t.deepEqual((0, index_1.scanRight)(["a", "b", "c"], (a, e, i) => `${a} ${i} ${e}`, "_"), ["_ 2 c 1 b 0 a", "_ 2 c 1 b", "_ 2 c"]);
});
(0, ava_1.default)("scanRight1", t => {
t.deepEqual((0, index_1.scanRight1)(["a", "b", "c"], (a, e, i) => `${a} ${i} ${e}`), ["c 1 b 0 a", "c 1 b", "c"]);
});
(0, ava_1.default)("split", t => {
t.deepEqual((0, index_1.split)([2, 1, 3, 4, 5, 6], 2), [
[2, 1],
[3, 4, 5, 6]
]);
t.deepEqual((0, index_1.split)([2, 1, 3, 4, 5, 6], 0), [[], [2, 1, 3, 4, 5, 6]]);
t.deepEqual((0, index_1.split)([2, 1, 3, 4, 5, 6], 10), [[2, 1, 3, 4, 5, 6], []]);
});
function isSuccess(result) {
return result.type === "success";
}
(0, ava_1.default)("partition", t => {
t.deepEqual((0, index_1.partition)([2, 1, 3, 4, 5, 6], e => e % 2 === 1), [
[1, 3, 5],
[2, 4, 6]
]);
t.deepEqual((0, index_1.partition)(["abc", "def", "ghi"], (_, i) => i % 2 === 0), [["abc", "ghi"], ["def"]]);
const results = [
{ type: "success", value: "hello" },
{ type: "error" },
{ type: "success", value: "goodbye" }
];
const partitionedResults = (0, index_1.partition)(results, isSuccess);
t.deepEqual(partitionedResults, [
[
{ type: "success", value: "hello" },
{ type: "success", value: "goodbye" }
],
[{ type: "error" }]
]);
});
(0, ava_1.default)("partitionWhile", t => {
t.deepEqual((0, index_1.partitionWhile)([1, 3, 2, 4, 5, 6], e => e % 2 === 1), [
[1, 3],
[2, 4, 5, 6]
]);
t.deepEqual((0, index_1.partitionWhile)(["abc", "def", "ghi"], (_, i) => i % 2 === 0), [["abc"], ["def", "ghi"]]);
const results = [
{ type: "success", value: "hello" },
{ type: "error" },
{ type: "success", value: "goodbye" }
];
const partitionedResults = (0, index_1.partitionWhile)(results, isSuccess);
t.deepEqual(partitionedResults, [
[{ type: "success", value: "hello" }],
[{ type: "error" }, { type: "success", value: "goodbye" }]
]);
});
(0, ava_1.default)("zip", t => {
t.deepEqual((0, index_1.zip)([1, 2, 3], [6, 5, 4, 3, 2, 1]), [
[1, 6],
[2, 5],
[3, 4]
]);
});
(0, ava_1.default)("keyBy", t => {
const map = (0, index_1.keyBy)([1, 3, 4, 2, 5, 6], e => (e % 2 === 0 ? "even" : "odd"));
t.deepEqual(map.get("even"), [4, 2, 6]);
t.deepEqual(map.get("odd"), [1, 3, 5]);
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
});
(0, ava_1.default)("keyFirstBy", t => {
const map = (0, index_1.keyFirstBy)([1, 3, 4, 2, 5, 6], e => (e % 2 === 0 ? "even" : "odd"));
t.is(map.get("even"), 4);
t.is(map.get("odd"), 1);
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
});
(0, ava_1.default)("keyLastBy", t => {
const map = (0, index_1.keyLastBy)([1, 3, 4, 2, 5, 6], e => (e % 2 === 0 ? "even" : "odd"));
t.is(map.get("even"), 6);
t.is(map.get("odd"), 5);
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
});
(0, ava_1.default)("mapKeyBy", t => {
const map = (0, index_1.mapKeyBy)([1, 3, 4, 2, 5, 6], e => [e % 2 === 0 ? "even" : "odd", String(e)]);
t.deepEqual(map.get("even"), ["4", "2", "6"]);
t.deepEqual(map.get("odd"), ["1", "3", "5"]);
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
});
(0, ava_1.default)("mapKeyFirstBy", t => {
const map = (0, index_1.mapKeyFirstBy)([1, 3, 4, 2, 5, 6], e => [e % 2 === 0 ? "even" : "odd", String(e)]);
t.is(map.get("even"), "4");
t.is(map.get("odd"), "1");
t.deepEqual(Array.from(map.keys()), ["odd", "even"]);
});
(0, ava_1.default)("mapKeyLastBy", t => {
const map = (0, index_1.mapKeyLastBy)([1, 3, 4, 2, 5, 6], e => [e % 2 === 0 ? "even" : "odd", String(e)]);
t.deepEqual(Array.from(map.entries()), [
["odd", "5"],
["even", "6"]
]);
});
(0, ava_1.default)("groupByIdentity", t => {
t.deepEqual((0, index_1.groupByIdentity)(["abc", "adef", "bghi"], a => a.substr(0, 1)), [["abc", "adef"], ["bghi"]]);
});
(0, ava_1.default)("sort", t => {
t.deepEqual((0, index_1.sort)([2, 4, 3, 1]), [1, 2, 3, 4]);
t.deepEqual((0, index_1.sort)(["hello", "goodbye"]), ["goodbye", "hello"]);
t.deepEqual((0, index_1.sort)([-2, 4, -3, 1], (a, b) => Math.abs(a) - Math.abs(b)), [1, -2, -3, 4]);
});
(0, ava_1.default)("sortBy", t => {
t.deepEqual((0, index_1.sortBy)([
{ x: "a", y: 2 },
{ x: "b", y: 4 },
{ x: "c", y: 3 },
{ x: "d", y: 1 }
], ({ y }) => y), [
{ x: "d", y: 1 },
{ x: "a", y: 2 },
{ x: "c", y: 3 },
{ x: "b", y: 4 }
]);
t.deepEqual((0, index_1.sortBy)([-2, 4, -3, 1], e => Math.abs(e)), [1, -2, -3, 4]);
});
(0, ava_1.default)("forEach", t => {
const a = ["a", "b", "c"];
let s = "";
const b = (0, index_1.forEach)(a, c => (s += c));
t.is(b, a);
t.is(s, "abc");
});
//# sourceMappingURL=index.test.js.map