aran
Version:
JavaScript instrumenter
1,207 lines (1,123 loc) • 24.4 kB
JavaScript
/* eslint-disable local/no-impure */
const {
Math: { min, floor },
Array,
Array: {
from: toArray,
prototype: { flat: flatArray },
},
Set,
Reflect: { apply },
} = globalThis;
/**
* @type {(
* length: number,
* ) => ArrayLike<undefined>}
*/
const makeEmptyArrayLike = (length) =>
/** @type {any} */ ({ __proto__: null, length });
/** @type {never[] | []} */
export const EMPTY = [];
/** @type {<X, Y> (xs: X[], f: (x: X) => Y) => Y[]} */
export const map = toArray;
/**
* @type {<X>(
* xs: X[],
* ) => xs is []}
*/
export const isEmptyArray = (xs) => xs.length === 0;
/** @type {<X>(xs: X[]) => X[]}*/
export const reverse = (xs1) => {
const { length: l } = xs1;
return toArray(makeEmptyArrayLike(xs1.length), (_, i) => xs1[l - 1 - i]);
};
/** @type {(ss: string[], s: string) => string} */
export const join = (ss, s) => {
const { length: l } = ss;
if (l === 0) {
return "";
} else {
let r = ss[0];
for (let i = 1; i < l; i++) {
r += `${s}${ss[i]}`;
}
return r;
}
};
/** @type {(l: number) => number[]} */
export const enumerate = (l) => toArray(makeEmptyArrayLike(l), (_, i) => i);
/** @type {(l: number) => number[]} */
export const enumerateReverse = (l) =>
toArray(makeEmptyArrayLike(l), (_, i) => l - 1 - i);
/**
* @type {<X>(xs: X[]) => [X, X][]}
*/
export const pairupArray = (xs) =>
toArray(makeEmptyArrayLike(floor(xs.length / 2)), (_, i) => [
xs[2 * i],
xs[2 * i + 1],
]);
/** @type {<X>(xs: X[]) => X[]} */
export const removeDuplicate = (xs) => toArray(new Set(xs));
/** @type {<X>(xs1: X[], i: number, j: number) => X[]} */
export const slice = (xs, i, j) =>
toArray(makeEmptyArrayLike(j - i), (_, k) => xs[i + k]);
/**
* @type {<X, Y extends X>(
* xs: X[],
* p: (x: X) => x is Y,
* ) => null | Y}
*/
export const findNarrow = (xs, p) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
const x = xs[i];
if (p(x)) {
return x;
}
}
return null;
};
/**
* @type {<X>(
* xs: X[],
* p: (x: X) => boolean,
* ) => null | X}
*/
export const find = (xs, p) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
const x = xs[i];
if (p(x)) {
return x;
}
}
return null;
};
/**
* @type {<X, Y>(
* xs: X[],
* p: (x: X) => null | Y,
* ) => null | Y}
*/
export const findMap = (xs, p) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
const y = p(xs[i]);
if (y !== null) {
return y;
}
}
return null;
};
/** @type {<X>(xss: X[][]) => X[]} */
export const flat = (xss) => apply(flatArray, xss, EMPTY);
/** @type {<X>(xs: X[]) => X} */
export const getLast = (xs) => xs[xs.length - 1];
/** @type {<X, T extends X>(xs: X[], x: T) => boolean} */
export const includes = (xs, x) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
if (xs[i] === x) {
return true;
}
}
return false;
};
/** @type {<X, T extends X>(xs: X[], x: T) => boolean} */
export const isRepeat = (xs, x) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
if (xs[i] !== x) {
return false;
}
}
return true;
};
/**
* @type {<X, T extends X>(
* xs: X[],
* x: T,
* ) => number}
*/
export const count = (xs, x) => {
const { length: l } = xs;
let c = 0;
for (let i = 0; i < l; i++) {
if (xs[i] === x) {
c++;
}
}
return c;
};
/** @type {<X>(xs: X[], f: (x: X) => boolean) => boolean} */
export const some = (xs, f) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
if (f(xs[i])) {
return true;
}
}
return false;
};
/** @type {(l: number, f: (i: number) => boolean) => boolean} */
export const someIndex = (l, f) => {
for (let i = 0; i < l; i++) {
if (f(i)) {
return true;
}
}
return false;
};
/** @type {<X, Y extends X>(xs: X[], f: (x: X) => x is Y) => xs is Y[]} */
export const everyNarrow = (xs, f) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
if (!f(xs[i])) {
return false;
}
}
return true;
};
/** @type {<X>(xs: X[], f: (x: X) => boolean) => boolean} */
export const every = /** @type {any} */ (everyNarrow);
/**
* @type {<X, Y, Z> (
* xs: X[],
* f: (x: X, z: Z) => import("./pair.d.ts").Pair<Y, Z>,
* z: Z,
* ) => import("./pair.d.ts").Pair<Y[], Z>}
*/
export const mapReduce = (xs, f, z) => {
const { length: l } = xs;
const ys = new Array(l);
for (let i = 0; i < l; i++) {
const { fst, snd } = f(xs[i], z);
ys[i] = fst;
z = snd;
}
return { fst: ys, snd: z };
};
/** @type {<Y> (l: number, f: (i: number) => Y) => Y[]} */
export const mapIndex = (l, f) =>
toArray(makeEmptyArrayLike(l), (_, i) => f(i));
/** @type {<X, Y> (xs: X[], f: (x: X) => Y[]) => Y[]} */
export const flatMap = (xs, f) => {
const ys1 = [];
const { length: k } = xs;
let c = 0;
for (let i = 0; i < k; i++) {
const ys2 = f(xs[i]);
const { length: l } = ys2;
for (let j = 0; j < l; j++) {
ys1[c++] = ys2[j];
}
}
return ys1;
};
/** @type {<Y> (k: number, f: (i: number) => Y[]) => Y[]} */
export const flatMapIndex = (k, f) => {
const ys1 = [];
let c = 0;
for (let i = 0; i < k; i++) {
const ys2 = f(i);
const { length: l } = ys2;
for (let j = 0; j < l; j++) {
ys1[c++] = ys2[j];
}
}
return ys1;
};
/**
* @type {<X>(
* ... arrays: X[][]
* ) => X[]}
*/
export const concat = (...xss) => {
const ys = [];
let l = 0;
for (const xs of xss) {
for (const x of xs) {
ys[l++] = x;
}
}
return ys;
};
/** @type {<X>(xs: X[], f: (x: X) => boolean) => X[]} */
export const filter = (xs1, f) => {
const xs2 = [];
let l2 = 0;
const { length: l1 } = xs1;
for (let i = 0; i < l1; i++) {
const x = xs1[i];
if (f(x)) {
xs2[l2++] = x;
}
}
return xs2;
};
/** @type {<X, Y>(xs: X[], f: (x: X) => null | Y) => Y[]} */
export const filterMap = (xs1, f) => {
const ys = [];
let l2 = 0;
const { length: l1 } = xs1;
for (let i = 0; i < l1; i++) {
const y = f(xs1[i]);
if (y !== null) {
ys[l2++] = y;
}
}
return ys;
};
export const filterNarrow =
/** @type {<X, Y extends X>(xs: X[], f: (x: X) => x is Y) => Y[]} */ (filter);
/** @type {<X>(xs1: X[], f: (x: X) => boolean) => X[]} */
export const filterOut = (xs1, f) => {
const xs2 = [];
let l2 = 0;
const { length: l1 } = xs1;
for (let i = 0; i < l1; i++) {
const x = xs1[i];
if (!f(x)) {
xs2[l2++] = x;
}
}
return xs2;
};
/** @type {<X>(xs1: X[], xs2: X[]) => X[]} */
export const removeAll = (xs1, xs2) => filterOut(xs1, (x) => includes(xs2, x));
/** @type {<X>(xs: X[], x1: X) => X[]} */
export const remove = (xs, x1) => filter(xs, (x2) => x1 !== x2);
/** @type {<X, Y> (xs: X[], f: (y: Y, x: X) => Y, y: Y) => Y} */
export const reduce = (xs, f, y) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
y = f(y, xs[i]);
}
return y;
};
/** @type {<Y> (l: number, f: (y: Y, i: number) => Y, y: Y) => Y} */
export const reduceIndex = (l, f, y) => {
for (let i = 0; i < l; i++) {
y = f(y, i);
}
return y;
};
/** @type {<X, Y> (xs: X[], f: (y: Y, x: X) => Y, y: Y) => Y} */
export const reduceReverse = (xs, f, y) => {
for (let i = xs.length - 1; i >= 0; i -= 1) {
y = f(y, xs[i]);
}
return y;
};
/** @type {<X, T extends X>(xs: X[], x: T) => number} */
export const indexOf = (xs, x) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
if (xs[i] === x) {
return i;
}
}
return -1;
};
/** @type {<X, T extends X>(xs: X[], x: T) => number} */
export const lastIndexOf = (xs, x) => {
for (let i = xs.length - 1; i >= 0; i -= 1) {
if (xs[i] === x) {
return i;
}
}
return -1;
};
/** @type {<X>(xs: X[], p: (x: X) => boolean) => number} */
export const findFirstIndex = (xs, p) => {
const { length: l } = xs;
for (let i = 0; i < l; i++) {
if (p(xs[i])) {
return i;
}
}
return -1;
};
/** @type {<X>(xs: X[], p: (x: X) => boolean) => number} */
export const findLastIndex = (xs, p) => {
const { length: l } = xs;
for (let i = l - 1; i >= 0; i -= 1) {
if (p(xs[i])) {
return i;
}
}
return -1;
};
/**
* @type {<X, Y>(
* xs: X[],
* ys: Y[],
* ) => [X, Y][]}
*/
export const zip = (xs, ys) =>
toArray(makeEmptyArrayLike(min(xs.length, ys.length)), (_, i) => [
xs[i],
ys[i],
]);
/**
* @type {<X>(
* xs: X[],
* ) => [X, boolean][]}
*/
export const zipLast = (xs) => {
const { length: l } = xs;
return toArray(makeEmptyArrayLike(l), (_, i) => [xs[i], i === l - 1]);
};
/**
* @type {<X, Y>(
* ps: [X, Y][],
* ) => [X[], Y[]]}
*/
export const unzip = (ps) => {
const empty = makeEmptyArrayLike(ps.length);
return [
toArray(empty, (_, i) => ps[i][0]),
toArray(empty, (_, i) => ps[i][1]),
];
};
/**
* @template X
* @template {PropertyKey} K
* @template V
* @param {X[]} array
* @param {(leaf: X) => K} getKey
* @param {(leaf: X) => V} getVal
* @returns {{ [key in K]?: V }}
*/
export const recordArray = (array, getKey, getVal) => {
/** @type {{ [key in K]?: V }} */
const record = /** @type {any} */ ({ __proto__: null });
const { length } = array;
for (let index = 0; index < length; index++) {
const item = array[index];
record[getKey(item)] = getVal(item);
}
return record;
};
export const recordArrayTotal = /**
* @type {<X, K extends PropertyKey, V>(
* array: X[],
* getKey: (item: X) => K,
* getVal: (item: X) => V,
* ) => { [key in K]: V }}
*/ (recordArray);
////////////
// Concat //
////////////
// 1 //
/**
* @type {<X1>(
* xs: X1[],
* ) => X1[]}
*/
export const concatX = (xs1) => xs1;
/**
* @type {<X1>(
* xs: X1,
* ) => X1[]}
*/
export const concat_ = (x1) => [x1];
// 2 //
/**
* @type {<X1, X2>(
* xs1: X1[],
* xs2: X2[],
* ) => (X1 | X2)[]}
*/
export const concatXX = (xs1, xs2) => {
const { length: l1 } = xs1;
const { length: l2 } = xs2;
if (l1 === 0) {
return xs2;
} else if (l2 === 0) {
return xs1;
} else {
const xs = new Array(l1 + l2);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + l1] = xs2[i2];
}
return xs;
}
};
/**
* @type {<X1, X2>(
* x1: X1,
* xs2: X2[],
* ) => (X1 | X2)[]}
*/
export const concat_X = (x1, xs2) => {
const { length: l2 } = xs2;
if (l2 === 0) {
return [x1];
} else {
const xs = new Array(1 + l2);
xs[0] = x1;
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + 1] = xs2[i2];
}
return xs;
}
};
/**
* @type {<X1, X2>(
* xs1: X1[],
* x2: X2,
* ) => (X1 | X2)[]}
*/
export const concatX_ = (xs1, x2) => {
const { length: l1 } = xs1;
if (l1 === 0) {
return [x2];
} else {
const xs = new Array(l1 + 1);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
xs[l1] = x2;
return xs;
}
};
/**
* @type {<X1, X2>(
* x1: X1,
* x2: X2,
* ) => (X1 | X2)[]}
*/
export const concat__ = (x1, x2) => [x1, x2];
// 3 //
/**
* @type {<X1, X2, X3>(
* x1: X1,
* x2: X2,
* x3: X3,
* ) => (X1 | X2 | X3)[]}
*/
export const concat___ = (x1, x2, x3) => [x1, x2, x3];
/**
* @type {<X1, X2, X3>(
* x1: X1,
* xs2: X2[],
* x3: X3,
* ) => (X1 | X2 | X3)[]}
*/
export const concat_X_ = (x1, xs2, x3) => {
const { length: l2 } = xs2;
if (l2 === 0) {
return [x1, x3];
} else {
const xs = new Array(1 + l2 + 1);
xs[0] = x1;
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + 1] = xs2[i2];
}
xs[l2 + 1] = x3;
return xs;
}
};
/**
* @type {<X1, X2, X3>(
* x1: X1,
* xs2: X2[],
* xs3: X3[],
* ) => (X1 | X2 | X3)[]}
*/
export const concat_XX = (x1, xs2, xs3) => {
const { length: l2 } = xs2;
const { length: l3 } = xs3;
if (l2 === 0 && l3 === 0) {
return [x1];
} else {
const xs = new Array(1 + l2 + l3);
xs[0] = x1;
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + 1] = xs2[i2];
}
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + 1 + l2] = xs3[i3];
}
return xs;
}
};
/**
* @type {<X1, X2, X3>(
* xs1: X1[],
* xs2: X2,
* xs3: X3[],
* ) => (X1 | X2 | X3)[]}
*/
export const concatX_X = (xs1, xs2, xs3) => {
const { length: l1 } = xs1;
const { length: l3 } = xs3;
if (l1 === 0 && l3 === 0) {
return [xs2];
} else {
const xs = new Array(l1 + 1 + l3);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
xs[l1] = xs2;
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + l1 + 1] = xs3[i3];
}
return xs;
}
};
/**
* @type {<X1, X2, X3>(
* xs1: X1[],
* xs2: X2[],
* xs3: X3[],
* ) => (X1 | X2 | X3)[]}
*/
export const concatXXX = (xs1, xs2, xs3) => {
const { length: l1 } = xs1;
const { length: l2 } = xs2;
const { length: l3 } = xs3;
if (l1 === 0) {
if (l2 === 0) {
return xs3;
}
if (l3 === 0) {
return xs2;
}
} else if (l2 === 0 && l3 === 0) {
return xs1;
}
const xs = new Array(l1 + l2 + l3);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + l1] = xs2[i2];
}
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + l1 + l2] = xs3[i3];
}
return xs;
};
/**
* @type {<X1, X2, X3>(
* xs1: X1[],
* xs2: X2[],
* x3: X3,
* ) => (X1 | X2 | X3)[]}
*/
export const concatXX_ = (xs1, xs2, x3) => {
const { length: l1 } = xs1;
const { length: l2 } = xs2;
if (l1 === 0 && l2 === 0) {
return [x3];
} else {
const xs = new Array(l1 + l2 + 1);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + l1] = xs2[i2];
}
xs[l1 + l2] = x3;
return xs;
}
};
/**
* @type {<X1, X2, X3>(
* xs1: X1[],
* x2: X2,
* x3: X3,
* ) => (X1 | X2 | X3)[]}
*/
export const concatX__ = (xs1, x2, x3) => {
const { length: l1 } = xs1;
if (l1 === 0) {
return [x2, x3];
} else {
const xs = new Array(l1 + 1 + 1);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
xs[l1] = x2;
xs[l1 + 1] = x3;
return xs;
}
};
/**
* @type {<X1, X2, X3>(
* x1: X1,
* x2: X2,
* xs3: X3[],
* ) => (X1 | X2 | X3)[]}
*/
export const concat__X = (x1, x2, xs3) => {
const { length: l3 } = xs3;
if (l3 === 0) {
return [x1, x2];
} else {
const xs = new Array(1 + 1 + l3);
xs[0] = x1;
xs[1] = x2;
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + 2] = xs3[i3];
}
return xs;
}
};
// 4 //
/**
* @type {<X1, X2, X3, X4>(
* x1: X1,
* x2: X2,
* x3: X3,
* x4: X4,
* ) => (X1 | X2 | X3 | X4)[]}
*/
export const concat____ = (x1, x2, x3, x4) => [x1, x2, x3, x4];
/**
* @type {<X1, X2, X3, X4>(
* x1: X1,
* x2: X2,
* x3: X3[],
* x4: X4,
* ) => (X1 | X2 | X3 | X4)[]}
*/
export const concat__X_ = (x1, x2, xs3, x4) => {
const { length: l3 } = xs3;
if (l3 === 0) {
return [x1, x2, x4];
} else {
const xs = new Array(1 + 1 + l3 + 1);
xs[0] = x1;
xs[1] = x2;
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + 2] = xs3[i3];
}
xs[l3 + 2] = x4;
return xs;
}
};
/**
* @type {<X1, X2, X3, X4>(
* x1: X1,
* x2: X2[],
* x3: X3,
* x4: X4[],
* ) => (X1 | X2 | X3 | X4)[]}
*/
export const concat_X_X = (x1, xs2, x3, xs4) => {
const { length: l2 } = xs2;
const { length: l4 } = xs4;
if (l2 === 0 && l4 === 0) {
return [x1, x3];
} else {
const xs = new Array(1 + l2 + 1 + l4);
xs[0] = x1;
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + 1] = xs2[i2];
}
xs[l2 + 1] = x3;
for (let i4 = 0; i4 < l4; i4++) {
xs[i4 + 2 + l2] = xs4[i4];
}
return xs;
}
};
/**
* @type {<X1, X2, X3, X4>(
* x1: X1,
* x2: X2,
* x3: X3,
* xs4: X4[],
* ) => (X1 | X2 | X3 | X4)[]}
*/
export const concat___X = (x1, x2, x3, xs4) => {
const { length: l4 } = xs4;
if (l4 === 0) {
return [x1, x2, x3];
} else {
const xs = new Array(3 + l4);
xs[0] = x1;
xs[1] = x2;
xs[2] = x3;
for (let i4 = 0; i4 < l4; i4++) {
xs[i4 + 3] = xs4[i4];
}
return xs;
}
};
/**
* @type {<X1, X2, X3, X4>(
* xs1: X1[],
* xs2: X2[],
* xs3: X3[],
* x4: X4,
* ) => (X1 | X2 | X3 | X4)[]}
*/
export const concatXXX_ = (xs1, xs2, xs3, x4) => {
const { length: l1 } = xs1;
const { length: l2 } = xs2;
const { length: l3 } = xs3;
const xs = new Array(l1 + l2 + l3 + 1);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + l1] = xs2[i2];
}
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + l1 + l2] = xs3[i3];
}
xs[l1 + l2 + l3] = x4;
return xs;
};
/**
* @type {<X1, X2, X3, X4>(
* x1: X1,
* xs2: X2[],
* xs3: X3[],
* xs4: X4[],
* ) => (X1 | X2 | X3 | X4)[]}
*/
export const concat_XXX = (x1, xs2, xs3, xs4) => {
const { length: l2 } = xs2;
const { length: l3 } = xs3;
const { length: l4 } = xs4;
const xs = new Array(1 + l2 + l3 + l4);
xs[0] = x1;
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + 1] = xs2[i2];
}
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + 1 + l2] = xs3[i3];
}
for (let i4 = 0; i4 < l4; i4++) {
xs[i4 + 1 + l2 + l3] = xs4[i4];
}
return xs;
};
/**
* @type {<X1, X2, X3, X4>(
* xs1: X1[],
* xs2: X2[],
* xs3: X3[],
* xs4: X4[],
* ) => (X1 | X2 | X3 | X4)[]}
*/
export const concatXXXX = (xs1, xs2, xs3, xs4) => {
const { length: l1 } = xs1;
const { length: l2 } = xs2;
const { length: l3 } = xs3;
const { length: l4 } = xs4;
if (l1 === 0) {
if (l2 === 0) {
if (l3 === 0) {
return xs4;
}
if (l4 === 0) {
return xs3;
}
}
if (l3 === 0 && l4 === 0) {
return xs2;
}
} else if (l2 === 0 && l3 === 0 && l4 === 0) {
return xs1;
}
const xs = new Array(l1 + l2 + l3 + l4);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + l1] = xs2[i2];
}
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + l1 + l2] = xs3[i3];
}
for (let i4 = 0; i4 < l4; i4++) {
xs[i4 + l1 + l2 + l3] = xs4[i4];
}
return xs;
};
// 5 //
/**
* @type {<X1, X2, X3, X4, X5>(
* x1: X1,
* xs2: X2[],
* xs3: X3[],
* xs4: X4[],
* xs5: X5[],
* ) => (X1 | X2 | X3 | X4 | X5)[]}
*/
export const concat_XXXX = (x1, xs2, xs3, xs4, xs5) => {
const { length: l2 } = xs2;
const { length: l3 } = xs3;
const { length: l4 } = xs4;
const { length: l5 } = xs5;
const xs = new Array(1 + l2 + l3 + l4 + l5);
xs[0] = x1;
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + 1] = xs2[i2];
}
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + 1 + l2] = xs3[i3];
}
for (let i4 = 0; i4 < l4; i4++) {
xs[i4 + 1 + l2 + l3] = xs4[i4];
}
for (let i5 = 0; i5 < l5; i5++) {
xs[i5 + 1 + l2 + l3 + l4] = xs5[i5];
}
return xs;
};
/**
* @type {<X1, X2, X3, X4, X5>(
* x1: X1,
* x2: X2,
* x3: X3,
* x4: X4,
* x5: X5[],
* ) => (X1 | X2 | X3 | X4 | X5)[]}
*/
export const concat____X = (x1, x2, x3, x4, xs5) => {
const { length: l5 } = xs5;
if (l5 === 0) {
return [x1, x2, x3, x4];
} else {
const xs = new Array(4 + l5);
xs[0] = x1;
xs[1] = x2;
xs[2] = x3;
xs[3] = x4;
for (let i5 = 0; i5 < l5; i5++) {
xs[i5 + 4] = xs5[i5];
}
return xs;
}
};
/**
* @type {<X1, X2, X3, X4, X5>(
* x1: X1,
* x2: X2,
* x3: X3,
* x4: X4,
* x5: X5,
* ) => (X1 | X2 | X3 | X4 | X5)[]}
*/
export const concat_____ = (x1, x2, x3, x4, x5) => [x1, x2, x3, x4, x5];
/**
* @type {<X1, X2, X3, X4, X5>(
* x1: X1,
* x2: X2,
* x3: X3,
* xs4: X4[],
* x5: X5[],
* ) => (X1 | X2 | X3 | X4 | X5)[]}
*/
export const concat___XX = (x1, x2, x3, xs4, xs5) => {
const { length: l4 } = xs4;
const { length: l5 } = xs5;
if (l4 === 0 && l5 === 0) {
return [x1, x2, x3];
} else {
const xs = new Array(3 + l4 + l5);
xs[0] = x1;
xs[1] = x2;
xs[2] = x3;
for (let i4 = 0; i4 < l4; i4++) {
xs[i4 + 3] = xs4[i4];
}
for (let i5 = 0; i5 < l5; i5++) {
xs[i5 + 3 + l4] = xs5[i5];
}
return xs;
}
};
/**
* @type {<X1, X2, X3, X4, X5, X6>(
* xs1: X1[],
* xs2: X2[],
* x3: X3,
* xs4: X4[],
* x5: X5,
* x6: X6,
* ) => (X1 | X2 | X3 | X4 | X5 | X6)[]}
*/
export const concatXX_X__ = (xs1, xs2, x3, xs4, x5, x6) => {
const { length: l1 } = xs1;
const { length: l2 } = xs2;
const { length: l4 } = xs4;
if (l1 === 0 && l2 === 0 && l4 === 0) {
return [x3, x5, x6];
} else {
const xs = new Array(l1 + l2 + 1 + l4 + 1 + 1);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + l1] = xs2[i2];
}
xs[l1 + l2] = x3;
for (let i4 = 0; i4 < l4; i4++) {
xs[i4 + 1 + l1 + l2] = xs4[i4];
}
xs[l1 + l2 + 1 + l4] = x5;
xs[l1 + l2 + 1 + l4 + 1] = x6;
return xs;
}
};
/**
* @type {<X1, X2, X3, X4, X5>(
* xs1: X1[],
* x2: X2,
* xs3: X3[],
* x4: X4,
* x5: X5[],
* ) => (X1 | X2 | X3 | X4 | X5)[]}
*/
export const concatX_X_X = (xs1, x2, xs3, x4, xs5) => {
const { length: l1 } = xs1;
const { length: l3 } = xs3;
const { length: l5 } = xs5;
if (l1 === 0 && l3 === 0 && l5 === 0) {
return [x2, x4];
} else {
const xs = new Array(l1 + 1 + l3 + 1 + l5);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
xs[l1] = x2;
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + 1 + l1] = xs3[i3];
}
xs[l1 + 1 + l3] = x4;
for (let i5 = 0; i5 < l5; i5++) {
xs[i5 + 1 + l1 + l3 + 1] = xs5[i5];
}
return xs;
}
};
/**
* @type {<X1, X2, X3, X4, X5, X6, X7>(
* xs1: X1,
* xs2: X2,
* xs3: X3,
* xs4: X4,
* xs5: X5,
* xs6: X6,
* xs7: X7[],
* ) => (X1 | X2 | X3 | X4 | X5 | X6 | X7)[]}
*/
export const concat______X = (x1, x2, x3, x4, x5, x6, xs7) => {
const { length: l7 } = xs7;
if (l7 === 0) {
return [x1, x2, x3, x4, x5, x6];
} else {
const xs = new Array(6 + l7);
xs[0] = x1;
xs[1] = x2;
xs[2] = x3;
xs[3] = x4;
xs[4] = x5;
xs[5] = x6;
for (let i7 = 0; i7 < l7; i7++) {
xs[i7 + 6] = xs7[i7];
}
return xs;
}
};
/**
* @type {<X1, X2, X3, X4, X5>(
* xs1: X1[],
* xs2: X2[],
* xs3: X3[],
* xs4: X4[],
* xs5: X5[],
* ) => (X1 | X2 | X3 | X4 | X5)[]}
*/
export const concatXXXXX = (xs1, xs2, xs3, xs4, xs5) => {
const { length: l1 } = xs1;
const { length: l2 } = xs2;
const { length: l3 } = xs3;
const { length: l4 } = xs4;
const { length: l5 } = xs5;
if (l1 === 0) {
if (l2 === 0) {
if (l3 === 0) {
if (l4 === 0) {
return xs5;
}
if (l5 === 0) {
return xs4;
}
} else if (l4 === 0 && l5 === 0) {
return xs3;
}
} else if (l3 === 0 && l4 === 0 && l5 === 0) {
return xs2;
}
} else if (l2 === 0 && l3 === 0 && l4 === 0 && l5 === 0) {
return xs1;
}
const xs = new Array(l1 + l2 + l3 + l4 + l5);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + l1] = xs2[i2];
}
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + l1 + l2] = xs3[i3];
}
for (let i4 = 0; i4 < l4; i4++) {
xs[i4 + l1 + l2 + l3] = xs4[i4];
}
for (let i5 = 0; i5 < l5; i5++) {
xs[i5 + l1 + l2 + l3 + l4] = xs5[i5];
}
return xs;
};
/**
* @type {<X1, X2, X3, X4, X5, X6>(
* xs1: X1[],
* xs2: X2[],
* xs3: X3[],
* xs4: X4[],
* xs5: X5[],
* xs6: X6[],
* ) => (X1 | X2 | X3 | X4 | X5 | X6)[]}
*/
export const concatXXXXXX = (xs1, xs2, xs3, xs4, xs5, xs6) => {
const { length: l1 } = xs1;
const { length: l2 } = xs2;
const { length: l3 } = xs3;
const { length: l4 } = xs4;
const { length: l5 } = xs5;
const { length: l6 } = xs6;
const xs = new Array(l1 + l2 + l3 + l4 + l5);
for (let i1 = 0; i1 < l1; i1++) {
xs[i1] = xs1[i1];
}
for (let i2 = 0; i2 < l2; i2++) {
xs[i2 + l1] = xs2[i2];
}
for (let i3 = 0; i3 < l3; i3++) {
xs[i3 + l1 + l2] = xs3[i3];
}
for (let i4 = 0; i4 < l4; i4++) {
xs[i4 + l1 + l2 + l3] = xs4[i4];
}
for (let i5 = 0; i5 < l5; i5++) {
xs[i5 + l1 + l2 + l3 + l4] = xs5[i5];
}
for (let i6 = 0; i6 < l6; i6++) {
xs[i6 + l1 + l2 + l3 + l4 + l5] = xs6[i6];
}
return xs;
};