UNPKG

@fable-org/fable-library-js

Version:

Core library used by F# projects compiled with fable.io

1,244 lines (1,243 loc) 39 kB
import { Helpers_allocateArrayFromCons } from "./Native.js"; import { setItem as setItem_1, item as item_2 } from "./Array.js"; import { value as value_2, map as map_1, defaultArg, some } from "./Option.js"; import { min as min_1, max as max_1 } from "./Double.js"; import { disposeSafe, getEnumerator, copyToArray, defaultOf } from "./Util.js"; import { SR_indexOutOfBounds } from "./Global.js"; import { Operators_IsNull } from "./FSharp.Core.js"; function indexNotFound() { throw new Error("An index satisfying the predicate was not found in the collection."); } function differentLengths() { throw new Error("Arrays had different lengths"); } export function append(array1, array2, cons) { const len1 = array1.length | 0; const len2 = array2.length | 0; const newArray = Helpers_allocateArrayFromCons(cons, len1 + len2); for (let i = 0; i <= (len1 - 1); i++) { setItem_1(newArray, i, item_2(i, array1)); } for (let i_1 = 0; i_1 <= (len2 - 1); i_1++) { setItem_1(newArray, i_1 + len1, item_2(i_1, array2)); } return newArray; } export function filter(predicate, array) { return array.filter(predicate); } export function fill(target, targetIndex, count, value) { const start = targetIndex | 0; return target.fill(value, start, (start + count)); } export function getSubArray(array, start, count) { const start_1 = start | 0; return array.slice(start_1, (start_1 + count)); } export function last(array) { if (array.length === 0) { throw new Error("The input array was empty\\nParameter name: array"); } return item_2(array.length - 1, array); } export function tryLast(array) { if (array.length === 0) { return undefined; } else { return some(item_2(array.length - 1, array)); } } export function mapIndexed(f, source, cons) { const len = source.length | 0; const target = Helpers_allocateArrayFromCons(cons, len); for (let i = 0; i <= (len - 1); i++) { setItem_1(target, i, f(i, item_2(i, source))); } return target; } export function map(f, source, cons) { const len = source.length | 0; const target = Helpers_allocateArrayFromCons(cons, len); for (let i = 0; i <= (len - 1); i++) { setItem_1(target, i, f(item_2(i, source))); } return target; } export function mapIndexed2(f, source1, source2, cons) { if (source1.length !== source2.length) { throw new Error("Arrays had different lengths"); } const result = Helpers_allocateArrayFromCons(cons, source1.length); for (let i = 0; i <= (source1.length - 1); i++) { setItem_1(result, i, f(i, item_2(i, source1), item_2(i, source2))); } return result; } export function map2(f, source1, source2, cons) { if (source1.length !== source2.length) { throw new Error("Arrays had different lengths"); } const result = Helpers_allocateArrayFromCons(cons, source1.length); for (let i = 0; i <= (source1.length - 1); i++) { setItem_1(result, i, f(item_2(i, source1), item_2(i, source2))); } return result; } export function mapIndexed3(f, source1, source2, source3, cons) { if ((source1.length !== source2.length) ? true : (source2.length !== source3.length)) { throw new Error("Arrays had different lengths"); } const result = Helpers_allocateArrayFromCons(cons, source1.length); for (let i = 0; i <= (source1.length - 1); i++) { setItem_1(result, i, f(i, item_2(i, source1), item_2(i, source2), item_2(i, source3))); } return result; } export function map3(f, source1, source2, source3, cons) { if ((source1.length !== source2.length) ? true : (source2.length !== source3.length)) { throw new Error("Arrays had different lengths"); } const result = Helpers_allocateArrayFromCons(cons, source1.length); for (let i = 0; i <= (source1.length - 1); i++) { setItem_1(result, i, f(item_2(i, source1), item_2(i, source2), item_2(i, source3))); } return result; } export function mapFold(mapping, state, array, cons) { const matchValue = array.length | 0; if (matchValue === 0) { return [[], state]; } else { let acc = state; const res = Helpers_allocateArrayFromCons(cons, matchValue); for (let i = 0; i <= (array.length - 1); i++) { const patternInput = mapping(acc, item_2(i, array)); setItem_1(res, i, patternInput[0]); acc = patternInput[1]; } return [res, acc]; } } export function mapFoldBack(mapping, array, state, cons) { const matchValue = array.length | 0; if (matchValue === 0) { return [[], state]; } else { let acc = state; const res = Helpers_allocateArrayFromCons(cons, matchValue); for (let i = array.length - 1; i >= 0; i--) { const patternInput = mapping(item_2(i, array), acc); setItem_1(res, i, patternInput[0]); acc = patternInput[1]; } return [res, acc]; } } export function indexed(source) { const len = source.length | 0; const target = new Array(len); for (let i = 0; i <= (len - 1); i++) { setItem_1(target, i, [i, item_2(i, source)]); } return target; } export function truncate(count, array) { const count_1 = max_1(0, count) | 0; return array.slice(0, (0 + count_1)); } export function concat(arrays, cons) { const arrays_1 = Array.isArray(arrays) ? arrays : (Array.from(arrays)); const matchValue = arrays_1.length | 0; switch (matchValue) { case 0: return Helpers_allocateArrayFromCons(cons, 0); case 1: return item_2(0, arrays_1); default: { let totalIdx = 0; let totalLength = 0; for (let idx = 0; idx <= (arrays_1.length - 1); idx++) { const arr_1 = item_2(idx, arrays_1); totalLength = ((totalLength + arr_1.length) | 0); } const result = Helpers_allocateArrayFromCons(cons, totalLength); for (let idx_1 = 0; idx_1 <= (arrays_1.length - 1); idx_1++) { const arr_2 = item_2(idx_1, arrays_1); for (let j = 0; j <= (arr_2.length - 1); j++) { setItem_1(result, totalIdx, item_2(j, arr_2)); totalIdx = ((totalIdx + 1) | 0); } } return result; } } } export function collect(mapping, array, cons) { return concat(map(mapping, array, defaultOf()), cons); } export function where(predicate, array) { return array.filter(predicate); } export function indexOf(array, item_1, start, count, eq) { const start_1 = defaultArg(start, 0) | 0; const end$0027 = defaultArg(map_1((c) => ((start_1 + c) | 0), count), array.length) | 0; const loop = (i_mut) => { loop: while (true) { const i = i_mut; if (i >= end$0027) { return -1; } else if (eq.Equals(item_1, item_2(i, array))) { return i | 0; } else { i_mut = (i + 1); continue loop; } break; } }; return loop(start_1) | 0; } export function contains(value, array, eq) { return indexOf(array, value, undefined, undefined, eq) >= 0; } export function empty(cons) { return Helpers_allocateArrayFromCons(cons, 0); } export function singleton(value, cons) { const ar = Helpers_allocateArrayFromCons(cons, 1); setItem_1(ar, 0, value); return ar; } export function initialize(count, initializer, cons) { if (count < 0) { throw new Error("The input must be non-negative\\nParameter name: count"); } const result = Helpers_allocateArrayFromCons(cons, count); for (let i = 0; i <= (count - 1); i++) { setItem_1(result, i, initializer(i)); } return result; } export function pairwise(array) { if (array.length < 2) { return []; } else { const count = (array.length - 1) | 0; const result = new Array(count); for (let i = 0; i <= (count - 1); i++) { setItem_1(result, i, [item_2(i, array), item_2(i + 1, array)]); } return result; } } export function replicate(count, initial, cons) { if (count < 0) { throw new Error("The input must be non-negative\\nParameter name: count"); } const result = Helpers_allocateArrayFromCons(cons, count); for (let i = 0; i <= (result.length - 1); i++) { setItem_1(result, i, initial); } return result; } export function copy(array) { return array.slice(); } export function copyTo(source, sourceIndex, target, targetIndex, count) { copyToArray(source, sourceIndex, target, targetIndex, count); } export function reverse(array) { const array_2 = array.slice(); return array_2.reverse(); } export function scan(folder, state, array, cons) { const res = Helpers_allocateArrayFromCons(cons, array.length + 1); setItem_1(res, 0, state); for (let i = 0; i <= (array.length - 1); i++) { setItem_1(res, i + 1, folder(item_2(i, res), item_2(i, array))); } return res; } export function scanBack(folder, array, state, cons) { const res = Helpers_allocateArrayFromCons(cons, array.length + 1); setItem_1(res, array.length, state); for (let i = array.length - 1; i >= 0; i--) { setItem_1(res, i, folder(item_2(i, array), item_2(i + 1, res))); } return res; } export function skip(count, array, cons) { if (count > array.length) { throw new Error("count is greater than array length\\nParameter name: count"); } if (count === array.length) { return Helpers_allocateArrayFromCons(cons, 0); } else { const count_1 = ((count < 0) ? 0 : count) | 0; return array.slice(count_1); } } export function skipWhile(predicate, array, cons) { let count = 0; while ((count < array.length) && predicate(item_2(count, array))) { count = ((count + 1) | 0); } if (count === array.length) { return Helpers_allocateArrayFromCons(cons, 0); } else { const count_1 = count | 0; return array.slice(count_1); } } export function take(count, array, cons) { if (count < 0) { throw new Error("The input must be non-negative\\nParameter name: count"); } if (count > array.length) { throw new Error("count is greater than array length\\nParameter name: count"); } if (count === 0) { return Helpers_allocateArrayFromCons(cons, 0); } else { return array.slice(0, (0 + count)); } } export function takeWhile(predicate, array, cons) { let count = 0; while ((count < array.length) && predicate(item_2(count, array))) { count = ((count + 1) | 0); } if (count === 0) { return Helpers_allocateArrayFromCons(cons, 0); } else { const count_1 = count | 0; return array.slice(0, (0 + count_1)); } } export function addInPlace(x, array) { array.push(x); } export function addRangeInPlace(range, array) { const enumerator = getEnumerator(range); try { while (enumerator["System.Collections.IEnumerator.MoveNext"]()) { addInPlace(enumerator["System.Collections.Generic.IEnumerator`1.get_Current"](), array); } } finally { disposeSafe(enumerator); } } export function insertRangeInPlace(index, range, array) { let i = index; const enumerator = getEnumerator(range); try { while (enumerator["System.Collections.IEnumerator.MoveNext"]()) { let index_1; const x = enumerator["System.Collections.Generic.IEnumerator`1.get_Current"](); (index_1 = (i | 0), array.splice(index_1, 0, x)); i = ((i + 1) | 0); } } finally { disposeSafe(enumerator); } } export function removeInPlace(item_1, array, eq) { const i = indexOf(array, item_1, undefined, undefined, eq) | 0; if (i > -1) { array.splice(i, 1); return true; } else { return false; } } export function removeAllInPlace(predicate, array) { const countRemoveAll = (count) => { const i = (array.findIndex(predicate)) | 0; if (i > -1) { array.splice(i, 1); return (countRemoveAll(count) + 1) | 0; } else { return count | 0; } }; return countRemoveAll(0) | 0; } export function partition(f, source, cons) { const len = source.length | 0; const res1 = Helpers_allocateArrayFromCons(cons, len); const res2 = Helpers_allocateArrayFromCons(cons, len); let iTrue = 0; let iFalse = 0; for (let i = 0; i <= (len - 1); i++) { if (f(item_2(i, source))) { setItem_1(res1, iTrue, item_2(i, source)); iTrue = ((iTrue + 1) | 0); } else { setItem_1(res2, iFalse, item_2(i, source)); iFalse = ((iFalse + 1) | 0); } } return [truncate(iTrue, res1), truncate(iFalse, res2)]; } export function find(predicate, array) { const matchValue = array.find(predicate); if (matchValue == null) { return indexNotFound(); } else { return value_2(matchValue); } } export function tryFind(predicate, array) { return array.find(predicate); } export function findIndex(predicate, array) { const matchValue = (array.findIndex(predicate)) | 0; if (matchValue > -1) { return matchValue | 0; } else { indexNotFound(); return -1; } } export function tryFindIndex(predicate, array) { const matchValue = (array.findIndex(predicate)) | 0; if (matchValue > -1) { return matchValue; } else { return undefined; } } export function pick(chooser, array) { const loop = (i_mut) => { loop: while (true) { const i = i_mut; if (i >= array.length) { return indexNotFound(); } else { const matchValue = chooser(item_2(i, array)); if (matchValue != null) { return value_2(matchValue); } else { i_mut = (i + 1); continue loop; } } break; } }; return loop(0); } export function tryPick(chooser, array) { const loop = (i_mut) => { loop: while (true) { const i = i_mut; if (i >= array.length) { return undefined; } else { const matchValue = chooser(item_2(i, array)); if (matchValue == null) { i_mut = (i + 1); continue loop; } else { return matchValue; } } break; } }; return loop(0); } export function findBack(predicate, array) { const loop = (i_mut) => { loop: while (true) { const i = i_mut; if (i < 0) { return indexNotFound(); } else if (predicate(item_2(i, array))) { return item_2(i, array); } else { i_mut = (i - 1); continue loop; } break; } }; return loop(array.length - 1); } export function tryFindBack(predicate, array) { const loop = (i_mut) => { loop: while (true) { const i = i_mut; if (i < 0) { return undefined; } else if (predicate(item_2(i, array))) { return some(item_2(i, array)); } else { i_mut = (i - 1); continue loop; } break; } }; return loop(array.length - 1); } export function findLastIndex(predicate, array) { const loop = (i_mut) => { loop: while (true) { const i = i_mut; if (i < 0) { return -1; } else if (predicate(item_2(i, array))) { return i | 0; } else { i_mut = (i - 1); continue loop; } break; } }; return loop(array.length - 1) | 0; } export function findIndexBack(predicate, array) { const loop = (i_mut) => { loop: while (true) { const i = i_mut; if (i < 0) { indexNotFound(); return -1; } else if (predicate(item_2(i, array))) { return i | 0; } else { i_mut = (i - 1); continue loop; } break; } }; return loop(array.length - 1) | 0; } export function tryFindIndexBack(predicate, array) { const loop = (i_mut) => { loop: while (true) { const i = i_mut; if (i < 0) { return undefined; } else if (predicate(item_2(i, array))) { return i; } else { i_mut = (i - 1); continue loop; } break; } }; return loop(array.length - 1); } export function choose(chooser, array, cons) { const res = []; for (let i = 0; i <= (array.length - 1); i++) { const matchValue = chooser(item_2(i, array)); if (matchValue != null) { const y = value_2(matchValue); res.push(y); } } if (cons == null) { return res; } else { return map((x) => x, res, cons); } } export function foldIndexed(folder, state, array) { return array.reduce(((delegateArg, delegateArg_1, delegateArg_2) => folder(delegateArg_2, delegateArg, delegateArg_1)), state); } export function fold(folder, state, array) { const folder_1 = folder; return array.reduce((folder_1), state); } export function iterate(action, array) { for (let i = 0; i <= (array.length - 1); i++) { action(item_2(i, array)); } } export function iterateIndexed(action, array) { for (let i = 0; i <= (array.length - 1); i++) { action(i, item_2(i, array)); } } export function iterate2(action, array1, array2) { if (array1.length !== array2.length) { differentLengths(); } for (let i = 0; i <= (array1.length - 1); i++) { action(item_2(i, array1), item_2(i, array2)); } } export function iterateIndexed2(action, array1, array2) { if (array1.length !== array2.length) { differentLengths(); } for (let i = 0; i <= (array1.length - 1); i++) { action(i, item_2(i, array1), item_2(i, array2)); } } export function isEmpty(array) { return array.length === 0; } export function forAll(predicate, array) { return array.every(predicate); } export function permute(f, array) { const size = array.length | 0; const res = array.slice(); const checkFlags = new Array(size); iterateIndexed((i, x) => { const j = f(i) | 0; if ((j < 0) ? true : (j >= size)) { throw new Error("Not a valid permutation"); } setItem_1(res, j, x); setItem_1(checkFlags, j, 1); }, array); if (!(checkFlags.every((y) => (1 === y)))) { throw new Error("Not a valid permutation"); } return res; } export function setSlice(target, lower, upper, source) { const lower_1 = defaultArg(lower, 0) | 0; const upper_1 = defaultArg(upper, -1) | 0; const length = (((upper_1 >= 0) ? upper_1 : (target.length - 1)) - lower_1) | 0; for (let i = 0; i <= length; i++) { setItem_1(target, i + lower_1, item_2(i, source)); } } export function sortInPlaceBy(projection, xs, comparer) { xs.sort((x, y) => (comparer.Compare(projection(x), projection(y)) | 0)); } export function sortInPlace(xs, comparer) { xs.sort((x, y) => (comparer.Compare(x, y) | 0)); } export function sort(xs, comparer) { const xs_1 = xs.slice(); xs_1.sort((x, y) => (comparer.Compare(x, y) | 0)); return xs_1; } export function sortBy(projection, xs, comparer) { const xs_1 = xs.slice(); xs_1.sort((x, y) => (comparer.Compare(projection(x), projection(y)) | 0)); return xs_1; } export function sortDescending(xs, comparer) { const xs_1 = xs.slice(); xs_1.sort((x, y) => ((comparer.Compare(x, y) * -1) | 0)); return xs_1; } export function sortByDescending(projection, xs, comparer) { const xs_1 = xs.slice(); xs_1.sort((x, y) => ((comparer.Compare(projection(x), projection(y)) * -1) | 0)); return xs_1; } export function sortWith(comparer, xs) { const comparer_1 = comparer; const xs_1 = xs.slice(); xs_1.sort(comparer_1); return xs_1; } export function allPairs(xs, ys) { const len1 = xs.length | 0; const len2 = ys.length | 0; const res = new Array(len1 * len2); for (let i = 0; i <= (xs.length - 1); i++) { for (let j = 0; j <= (ys.length - 1); j++) { setItem_1(res, (i * len2) + j, [item_2(i, xs), item_2(j, ys)]); } } return res; } export function unfold(generator, state) { const res = []; const loop = (state_1_mut) => { loop: while (true) { const state_1 = state_1_mut; const matchValue = generator(state_1); if (matchValue != null) { const x = value_2(matchValue)[0]; const s = value_2(matchValue)[1]; res.push(x); state_1_mut = s; continue loop; } break; } }; loop(state); return res; } export function unzip(array) { const len = array.length | 0; const res1 = new Array(len); const res2 = new Array(len); iterateIndexed((i, tupledArg) => { setItem_1(res1, i, tupledArg[0]); setItem_1(res2, i, tupledArg[1]); }, array); return [res1, res2]; } export function unzip3(array) { const len = array.length | 0; const res1 = new Array(len); const res2 = new Array(len); const res3 = new Array(len); iterateIndexed((i, tupledArg) => { setItem_1(res1, i, tupledArg[0]); setItem_1(res2, i, tupledArg[1]); setItem_1(res3, i, tupledArg[2]); }, array); return [res1, res2, res3]; } export function zip(array1, array2) { if (array1.length !== array2.length) { differentLengths(); } const result = new Array(array1.length); for (let i = 0; i <= (array1.length - 1); i++) { setItem_1(result, i, [item_2(i, array1), item_2(i, array2)]); } return result; } export function zip3(array1, array2, array3) { if ((array1.length !== array2.length) ? true : (array2.length !== array3.length)) { differentLengths(); } const result = new Array(array1.length); for (let i = 0; i <= (array1.length - 1); i++) { setItem_1(result, i, [item_2(i, array1), item_2(i, array2), item_2(i, array3)]); } return result; } export function chunkBySize(chunkSize, array) { if (chunkSize < 1) { throw new Error("The input must be positive.\\nParameter name: size"); } if (array.length === 0) { return [[]]; } else { const result = []; for (let x = 0; x <= (~~Math.ceil(array.length / chunkSize) - 1); x++) { let slice; const start_1 = (x * chunkSize) | 0; slice = (array.slice(start_1, (start_1 + chunkSize))); result.push(slice); } return result; } } export function splitAt(index, array) { if ((index < 0) ? true : (index > array.length)) { throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return [array.slice(0, (0 + index)), array.slice(index)]; } export function compareWith(comparer, source1, source2) { if (Operators_IsNull(source1)) { if (Operators_IsNull(source2)) { return 0; } else { return -1; } } else if (Operators_IsNull(source2)) { return 1; } else { const len1 = source1.length | 0; const len2 = source2.length | 0; const len = ((len1 < len2) ? len1 : len2) | 0; let i = 0; let res = 0; while ((res === 0) && (i < len)) { res = (comparer(item_2(i, source1), item_2(i, source2)) | 0); i = ((i + 1) | 0); } if (res !== 0) { return res | 0; } else if (len1 > len2) { return 1; } else if (len1 < len2) { return -1; } else { return 0; } } } export function compareTo(comparer, source1, source2) { if (Operators_IsNull(source1)) { if (Operators_IsNull(source2)) { return 0; } else { return -1; } } else if (Operators_IsNull(source2)) { return 1; } else { const len1 = source1.length | 0; const len2 = source2.length | 0; if (len1 > len2) { return 1; } else if (len1 < len2) { return -1; } else { let i = 0; let res = 0; while ((res === 0) && (i < len1)) { res = (comparer(item_2(i, source1), item_2(i, source2)) | 0); i = ((i + 1) | 0); } return res | 0; } } } export function equalsWith(equals, source1, source2) { if (Operators_IsNull(source1)) { if (Operators_IsNull(source2)) { return true; } else { return false; } } else if (Operators_IsNull(source2)) { return false; } else { let i = 0; let result = true; const length1 = source1.length | 0; const length2 = source2.length | 0; if (length1 > length2) { return false; } else if (length1 < length2) { return false; } else { while ((i < length1) && result) { result = equals(item_2(i, source1), item_2(i, source2)); i = ((i + 1) | 0); } return result; } } } export function exactlyOne(array) { switch (array.length) { case 1: return item_2(0, array); case 0: throw new Error("The input sequence was empty\\nParameter name: array"); default: throw new Error("Input array too long\\nParameter name: array"); } } export function tryExactlyOne(array) { if (array.length === 1) { return some(item_2(0, array)); } else { return undefined; } } export function head(array) { if (array.length === 0) { throw new Error("The input array was empty\\nParameter name: array"); } else { return item_2(0, array); } } export function tryHead(array) { if (array.length === 0) { return undefined; } else { return some(item_2(0, array)); } } export function tail(array) { if (array.length === 0) { throw new Error("Not enough elements\\nParameter name: array"); } return array.slice(1); } export function item(index, array) { if ((index < 0) ? true : (index >= array.length)) { throw new Error("Index was outside the bounds of the array.\\nParameter name: index"); } else { return array[index]; } } export function setItem(array, index, value) { if ((index < 0) ? true : (index >= array.length)) { throw new Error("Index was outside the bounds of the array.\\nParameter name: index"); } else { array[index] = value; } } export function tryItem(index, array) { if ((index < 0) ? true : (index >= array.length)) { return undefined; } else { return some(array[index]); } } export function foldBackIndexed(folder, array, state) { return array.reduceRight(((delegateArg, delegateArg_1, delegateArg_2) => folder(delegateArg_2, delegateArg_1, delegateArg)), state); } export function foldBack(folder, array, state) { return array.reduceRight(((delegateArg, delegateArg_1) => folder(delegateArg_1, delegateArg)), state); } export function foldIndexed2(folder, state, array1, array2) { let acc = state; if (array1.length !== array2.length) { throw new Error("Arrays have different lengths"); } for (let i = 0; i <= (array1.length - 1); i++) { acc = folder(i, acc, item_2(i, array1), item_2(i, array2)); } return acc; } export function fold2(folder, state, array1, array2) { return foldIndexed2((_arg, acc, x, y) => folder(acc, x, y), state, array1, array2); } export function foldBackIndexed2(folder, array1, array2, state) { let acc = state; if (array1.length !== array2.length) { differentLengths(); } const size = array1.length | 0; for (let i = 1; i <= size; i++) { acc = folder(i - 1, item_2(size - i, array1), item_2(size - i, array2), acc); } return acc; } export function foldBack2(f, array1, array2, state) { return foldBackIndexed2((_arg, x, y, acc) => f(x, y, acc), array1, array2, state); } export function reduce(reduction, array) { if (array.length === 0) { throw new Error("The input array was empty"); } const reduction_1 = reduction; return array.reduce(reduction_1); } export function reduceBack(reduction, array) { if (array.length === 0) { throw new Error("The input array was empty"); } const reduction_1 = reduction; return array.reduceRight(reduction_1); } export function forAll2(predicate, array1, array2) { return fold2((acc, x, y) => (acc && predicate(x, y)), true, array1, array2); } export function existsOffset(predicate_mut, array_mut, index_mut) { existsOffset: while (true) { const predicate = predicate_mut, array = array_mut, index = index_mut; if (index === array.length) { return false; } else if (predicate(item_2(index, array))) { return true; } else { predicate_mut = predicate; array_mut = array; index_mut = (index + 1); continue existsOffset; } break; } } export function exists(predicate, array) { return existsOffset(predicate, array, 0); } export function existsOffset2(predicate_mut, array1_mut, array2_mut, index_mut) { existsOffset2: while (true) { const predicate = predicate_mut, array1 = array1_mut, array2 = array2_mut, index = index_mut; if (index === array1.length) { return false; } else if (predicate(item_2(index, array1), item_2(index, array2))) { return true; } else { predicate_mut = predicate; array1_mut = array1; array2_mut = array2; index_mut = (index + 1); continue existsOffset2; } break; } } export function exists2(predicate, array1, array2) { if (array1.length !== array2.length) { differentLengths(); } return existsOffset2(predicate, array1, array2, 0); } export function sum(array, adder) { let acc = adder.GetZero(); for (let i = 0; i <= (array.length - 1); i++) { acc = adder.Add(acc, item_2(i, array)); } return acc; } export function sumBy(projection, array, adder) { let acc = adder.GetZero(); for (let i = 0; i <= (array.length - 1); i++) { acc = adder.Add(acc, projection(item_2(i, array))); } return acc; } export function maxBy(projection, xs, comparer) { return reduce((x, y) => ((comparer.Compare(projection(y), projection(x)) > 0) ? y : x), xs); } export function max(xs, comparer) { return reduce((x, y) => ((comparer.Compare(y, x) > 0) ? y : x), xs); } export function minBy(projection, xs, comparer) { return reduce((x, y) => ((comparer.Compare(projection(y), projection(x)) > 0) ? x : y), xs); } export function min(xs, comparer) { return reduce((x, y) => ((comparer.Compare(y, x) > 0) ? x : y), xs); } export function average(array, averager) { if (array.length === 0) { throw new Error("The input array was empty\\nParameter name: array"); } let total = averager.GetZero(); for (let i = 0; i <= (array.length - 1); i++) { total = averager.Add(total, item_2(i, array)); } return averager.DivideByInt(total, array.length); } export function averageBy(projection, array, averager) { if (array.length === 0) { throw new Error("The input array was empty\\nParameter name: array"); } let total = averager.GetZero(); for (let i = 0; i <= (array.length - 1); i++) { total = averager.Add(total, projection(item_2(i, array))); } return averager.DivideByInt(total, array.length); } export function windowed(windowSize, source) { if (windowSize <= 0) { throw new Error("windowSize must be positive"); } let res; const len = max_1(0, (source.length - windowSize) + 1) | 0; res = (new Array(len)); for (let i = windowSize; i <= source.length; i++) { setItem_1(res, i - windowSize, source.slice(i - windowSize, (i - 1) + 1)); } return res; } export function splitInto(chunks, array) { if (chunks < 1) { throw new Error("The input must be positive.\\nParameter name: chunks"); } if (array.length === 0) { return [[]]; } else { const result = []; const chunks_1 = min_1(chunks, array.length) | 0; const minChunkSize = ~~(array.length / chunks_1) | 0; const chunksWithExtraItem = (array.length % chunks_1) | 0; for (let i = 0; i <= (chunks_1 - 1); i++) { const chunkSize = ((i < chunksWithExtraItem) ? (minChunkSize + 1) : minChunkSize) | 0; let slice; const start_1 = ((i * minChunkSize) + min_1(chunksWithExtraItem, i)) | 0; slice = (array.slice(start_1, (start_1 + chunkSize))); result.push(slice); } return result; } } export function transpose(arrays, cons) { const arrays_1 = Array.isArray(arrays) ? arrays : (Array.from(arrays)); const len = arrays_1.length | 0; if (len === 0) { return new Array(0); } else { const firstArray = item_2(0, arrays_1); const lenInner = firstArray.length | 0; if (!forAll((a) => (a.length === lenInner), arrays_1)) { differentLengths(); } const result = new Array(lenInner); for (let i = 0; i <= (lenInner - 1); i++) { setItem_1(result, i, Helpers_allocateArrayFromCons(cons, len)); for (let j = 0; j <= (len - 1); j++) { item_2(i, result)[j] = item_2(i, item_2(j, arrays_1)); } } return result; } } export function insertAt(index, y, xs, cons) { const len = xs.length | 0; if ((index < 0) ? true : (index > len)) { throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } const target = Helpers_allocateArrayFromCons(cons, len + 1); for (let i = 0; i <= (index - 1); i++) { setItem_1(target, i, item_2(i, xs)); } setItem_1(target, index, y); for (let i_1 = index; i_1 <= (len - 1); i_1++) { setItem_1(target, i_1 + 1, item_2(i_1, xs)); } return target; } export function insertManyAt(index, ys, xs, cons) { const len = xs.length | 0; if ((index < 0) ? true : (index > len)) { throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } const ys_1 = Array.from(ys); const len2 = ys_1.length | 0; const target = Helpers_allocateArrayFromCons(cons, len + len2); for (let i = 0; i <= (index - 1); i++) { setItem_1(target, i, item_2(i, xs)); } for (let i_1 = 0; i_1 <= (len2 - 1); i_1++) { setItem_1(target, index + i_1, item_2(i_1, ys_1)); } for (let i_2 = index; i_2 <= (len - 1); i_2++) { setItem_1(target, i_2 + len2, item_2(i_2, xs)); } return target; } export function removeAt(index, xs) { if ((index < 0) ? true : (index >= xs.length)) { throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } let i = -1; return filter((_arg) => { i = ((i + 1) | 0); return i !== index; }, xs); } export function removeManyAt(index, count, xs) { let i = -1; let status = -1; const ys = filter((_arg) => { i = ((i + 1) | 0); if (i === index) { status = 0; return false; } else if (i > index) { if (i < (index + count)) { return false; } else { status = 1; return true; } } else { return true; } }, xs); const status_1 = (((status === 0) && ((i + 1) === (index + count))) ? 1 : status) | 0; if (status_1 < 1) { throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + ((status_1 < 0) ? "index" : "count")); } return ys; } export function updateAt(index, y, xs, cons) { const len = xs.length | 0; if ((index < 0) ? true : (index >= len)) { throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } const target = Helpers_allocateArrayFromCons(cons, len); for (let i = 0; i <= (len - 1); i++) { setItem_1(target, i, (i === index) ? y : item_2(i, xs)); } return target; } export function resize(xs, newSize, zero, cons) { let array, array_1, start_2, count_2; if (newSize < 0) { throw new Error("The input must be non-negative.\\nParameter name: newSize"); } const zero_1 = defaultArg(zero, defaultOf()); if (Operators_IsNull(xs.contents)) { xs.contents = ((array = Helpers_allocateArrayFromCons(cons, newSize), array.fill(zero_1, 0, (0 + newSize)))); } else { const len = xs.contents.length | 0; if (newSize < len) { xs.contents = ((array_1 = xs.contents, array_1.slice(0, (0 + newSize)))); } else if (newSize > len) { const target = Helpers_allocateArrayFromCons(cons, newSize); if (len > 0) { copyTo(xs.contents, 0, target, 0, len); } xs.contents = ((start_2 = (len | 0), (count_2 = ((newSize - len) | 0), target.fill(zero_1, start_2, (start_2 + count_2))))); } } }