@fable-org/fable-library-js
Version:
Core library used by F# projects compiled with fable.io
1,284 lines (1,283 loc) • 40.4 kB
JavaScript
import { join } from "./String.js";
import { defaultArg, some, value as value_1 } from "./Option.js";
import { disposeSafe, isArrayLike, defaultOf, toIterator, getEnumerator, compare, structuralHash, equals } from "./Util.js";
import { Record } from "./Types.js";
import { class_type, record_type, option_type } from "./Reflection.js";
import { SR_inputSequenceTooLong, SR_inputSequenceEmpty, SR_inputMustBeNonNegative, SR_notEnoughElements, SR_differentLengths, SR_keyNotFoundAlt, SR_indexOutOfBounds, SR_inputWasEmpty } from "./Global.js";
import { transpose as transpose_1, splitInto as splitInto_1, windowed as windowed_1, pairwise as pairwise_1, chunkBySize as chunkBySize_1, map as map_1, permute as permute_1, tryFindIndexBack as tryFindIndexBack_1, tryFindBack as tryFindBack_1, scanBack as scanBack_1, item as item_1, foldBack2 as foldBack2_1, foldBack as foldBack_1, setItem, fill } from "./Array.js";
export class FSharpList extends Record {
constructor(head, tail) {
super();
this.head = head;
this.tail = tail;
}
toString() {
const xs = this;
return ("[" + join("; ", xs)) + "]";
}
Equals(other) {
const xs = this;
if (xs === other) {
return true;
}
else if (other instanceof FSharpList) {
const ys = other;
const loop = (xs_1_mut, ys_1_mut) => {
loop: while (true) {
const xs_1 = xs_1_mut, ys_1 = ys_1_mut;
const matchValue = xs_1.tail;
const matchValue_1 = ys_1.tail;
if (matchValue != null) {
if (matchValue_1 != null) {
const xt = value_1(matchValue);
const yt = value_1(matchValue_1);
if (equals(xs_1.head, ys_1.head)) {
xs_1_mut = xt;
ys_1_mut = yt;
continue loop;
}
else {
return false;
}
}
else {
return false;
}
}
else if (matchValue_1 != null) {
return false;
}
else {
return true;
}
break;
}
};
return loop(xs, ys);
}
else {
return false;
}
}
GetHashCode() {
const xs = this;
const loop = (i_mut, h_mut, xs_1_mut) => {
loop: while (true) {
const i = i_mut, h = h_mut, xs_1 = xs_1_mut;
const matchValue = xs_1.tail;
if (matchValue != null) {
const t = value_1(matchValue);
if (i > 18) {
return h | 0;
}
else {
i_mut = (i + 1);
h_mut = (((h << 1) + structuralHash(xs_1.head)) + (631 * i));
xs_1_mut = t;
continue loop;
}
}
else {
return h | 0;
}
break;
}
};
return loop(0, 0, xs) | 0;
}
toJSON() {
const this$ = this;
return Array.from(this$);
}
CompareTo(other) {
const xs = this;
if (other instanceof FSharpList) {
const ys = other;
const loop = (xs_1_mut, ys_1_mut) => {
loop: while (true) {
const xs_1 = xs_1_mut, ys_1 = ys_1_mut;
const matchValue = xs_1.tail;
const matchValue_1 = ys_1.tail;
if (matchValue != null) {
if (matchValue_1 != null) {
const xt = value_1(matchValue);
const yt = value_1(matchValue_1);
const c = compare(xs_1.head, ys_1.head) | 0;
if (c === 0) {
xs_1_mut = xt;
ys_1_mut = yt;
continue loop;
}
else {
return c | 0;
}
}
else {
return 1;
}
}
else if (matchValue_1 != null) {
return -1;
}
else {
return 0;
}
break;
}
};
return loop(xs, ys) | 0;
}
else {
return 1;
}
}
GetEnumerator() {
const xs = this;
return ListEnumerator$1_$ctor_3002E699(xs);
}
[Symbol.iterator]() {
return toIterator(getEnumerator(this));
}
"System.Collections.IEnumerable.GetEnumerator"() {
const xs = this;
return getEnumerator(xs);
}
}
export function FSharpList_$reflection(gen0) {
return record_type("ListModule.FSharpList", [gen0], FSharpList, () => [["head", gen0], ["tail", option_type(FSharpList_$reflection(gen0))]]);
}
export class ListEnumerator$1 {
constructor(xs) {
this.xs = xs;
this.it = this.xs;
this.current = defaultOf();
}
"System.Collections.Generic.IEnumerator`1.get_Current"() {
const _ = this;
return _.current;
}
"System.Collections.IEnumerator.get_Current"() {
const _ = this;
return _.current;
}
"System.Collections.IEnumerator.MoveNext"() {
const _ = this;
const matchValue = _.it.tail;
if (matchValue != null) {
const t = value_1(matchValue);
_.current = _.it.head;
_.it = t;
return true;
}
else {
return false;
}
}
"System.Collections.IEnumerator.Reset"() {
const _ = this;
_.it = _.xs;
_.current = defaultOf();
}
Dispose() {
}
}
export function ListEnumerator$1_$reflection(gen0) {
return class_type("ListModule.ListEnumerator`1", [gen0], ListEnumerator$1);
}
export function ListEnumerator$1_$ctor_3002E699(xs) {
return new ListEnumerator$1(xs);
}
export function FSharpList_get_Empty() {
return new FSharpList(defaultOf(), undefined);
}
export function FSharpList_Cons_305B8EAC(x, xs) {
return new FSharpList(x, xs);
}
export function FSharpList__get_IsEmpty(xs) {
return xs.tail == null;
}
export function FSharpList__get_Length(xs) {
const loop = (i_mut, xs_1_mut) => {
loop: while (true) {
const i = i_mut, xs_1 = xs_1_mut;
const matchValue = xs_1.tail;
if (matchValue != null) {
i_mut = (i + 1);
xs_1_mut = value_1(matchValue);
continue loop;
}
else {
return i | 0;
}
break;
}
};
return loop(0, xs) | 0;
}
export function FSharpList__get_Head(xs) {
const matchValue = xs.tail;
if (matchValue != null) {
return xs.head;
}
else {
throw new Error((SR_inputWasEmpty + "\\nParameter name: ") + "list");
}
}
export function FSharpList__get_Tail(xs) {
const matchValue = xs.tail;
if (matchValue != null) {
return value_1(matchValue);
}
else {
throw new Error((SR_inputWasEmpty + "\\nParameter name: ") + "list");
}
}
export function FSharpList__get_Item_Z524259A4(xs, index) {
const loop = (i_mut, xs_1_mut) => {
loop: while (true) {
const i = i_mut, xs_1 = xs_1_mut;
const matchValue = xs_1.tail;
if (matchValue != null) {
if (i === index) {
return xs_1.head;
}
else {
i_mut = (i + 1);
xs_1_mut = value_1(matchValue);
continue loop;
}
}
else {
throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index");
}
break;
}
};
return loop(0, xs);
}
export function indexNotFound() {
throw new Error(SR_keyNotFoundAlt);
}
export function empty() {
return FSharpList_get_Empty();
}
export function cons(x, xs) {
return FSharpList_Cons_305B8EAC(x, xs);
}
export function singleton(x) {
return FSharpList_Cons_305B8EAC(x, FSharpList_get_Empty());
}
export function isEmpty(xs) {
return FSharpList__get_IsEmpty(xs);
}
export function length(xs) {
return FSharpList__get_Length(xs) | 0;
}
export function head(xs) {
return FSharpList__get_Head(xs);
}
export function tryHead(xs) {
if (FSharpList__get_IsEmpty(xs)) {
return undefined;
}
else {
return some(FSharpList__get_Head(xs));
}
}
export function tail(xs) {
return FSharpList__get_Tail(xs);
}
export function tryLast(xs_mut) {
tryLast: while (true) {
const xs = xs_mut;
if (FSharpList__get_IsEmpty(xs)) {
return undefined;
}
else {
const t = FSharpList__get_Tail(xs);
if (FSharpList__get_IsEmpty(t)) {
return some(FSharpList__get_Head(xs));
}
else {
xs_mut = t;
continue tryLast;
}
}
break;
}
}
export function last(xs) {
const matchValue = tryLast(xs);
if (matchValue == null) {
throw new Error(SR_inputWasEmpty);
}
else {
return value_1(matchValue);
}
}
export function compareWith(comparer, xs, ys) {
const loop = (xs_1_mut, ys_1_mut) => {
loop: while (true) {
const xs_1 = xs_1_mut, ys_1 = ys_1_mut;
const matchValue = FSharpList__get_IsEmpty(xs_1);
const matchValue_1 = FSharpList__get_IsEmpty(ys_1);
if (matchValue) {
if (matchValue_1) {
return 0;
}
else {
return -1;
}
}
else if (matchValue_1) {
return 1;
}
else {
const c = comparer(FSharpList__get_Head(xs_1), FSharpList__get_Head(ys_1)) | 0;
if (c === 0) {
xs_1_mut = FSharpList__get_Tail(xs_1);
ys_1_mut = FSharpList__get_Tail(ys_1);
continue loop;
}
else {
return c | 0;
}
}
break;
}
};
return loop(xs, ys) | 0;
}
export function toArray(xs) {
const len = FSharpList__get_Length(xs) | 0;
const res = fill(new Array(len), 0, len, null);
const loop = (i_mut, xs_1_mut) => {
loop: while (true) {
const i = i_mut, xs_1 = xs_1_mut;
if (!FSharpList__get_IsEmpty(xs_1)) {
setItem(res, i, FSharpList__get_Head(xs_1));
i_mut = (i + 1);
xs_1_mut = FSharpList__get_Tail(xs_1);
continue loop;
}
break;
}
};
loop(0, xs);
return res;
}
export function fold(folder, state, xs) {
let acc = state;
let xs_1 = xs;
while (!FSharpList__get_IsEmpty(xs_1)) {
acc = folder(acc, head(xs_1));
xs_1 = FSharpList__get_Tail(xs_1);
}
return acc;
}
export function reverse(xs) {
return fold((acc, x) => FSharpList_Cons_305B8EAC(x, acc), FSharpList_get_Empty(), xs);
}
export function foldBack(folder, xs, state) {
return foldBack_1(folder, toArray(xs), state);
}
export function foldIndexed(folder, state, xs) {
const loop = (i_mut, acc_mut, xs_1_mut) => {
loop: while (true) {
const i = i_mut, acc = acc_mut, xs_1 = xs_1_mut;
if (FSharpList__get_IsEmpty(xs_1)) {
return acc;
}
else {
i_mut = (i + 1);
acc_mut = folder(i, acc, FSharpList__get_Head(xs_1));
xs_1_mut = FSharpList__get_Tail(xs_1);
continue loop;
}
break;
}
};
return loop(0, state, xs);
}
export function fold2(folder, state, xs, ys) {
let acc = state;
let xs_1 = xs;
let ys_1 = ys;
while (!FSharpList__get_IsEmpty(xs_1) && !FSharpList__get_IsEmpty(ys_1)) {
acc = folder(acc, FSharpList__get_Head(xs_1), FSharpList__get_Head(ys_1));
xs_1 = FSharpList__get_Tail(xs_1);
ys_1 = FSharpList__get_Tail(ys_1);
}
return acc;
}
export function foldBack2(folder, xs, ys, state) {
return foldBack2_1(folder, toArray(xs), toArray(ys), state);
}
export function unfold(generator, state) {
const loop = (acc_mut, node_mut) => {
loop: while (true) {
const acc = acc_mut, node = node_mut;
let t;
const matchValue = generator(acc);
if (matchValue != null) {
acc_mut = value_1(matchValue)[1];
node_mut = ((t = (new FSharpList(value_1(matchValue)[0], undefined)), (node.tail = t, t)));
continue loop;
}
else {
return node;
}
break;
}
};
const root = FSharpList_get_Empty();
const node_1 = loop(state, root);
const t_2 = FSharpList_get_Empty();
node_1.tail = t_2;
return FSharpList__get_Tail(root);
}
export function iterate(action, xs) {
fold((unitVar, x) => {
action(x);
}, undefined, xs);
}
export function iterate2(action, xs, ys) {
fold2((unitVar, x, y) => {
action(x, y);
}, undefined, xs, ys);
}
export function iterateIndexed(action, xs) {
fold((i, x) => {
action(i, x);
return (i + 1) | 0;
}, 0, xs);
}
export function iterateIndexed2(action, xs, ys) {
fold2((i, x, y) => {
action(i, x, y);
return (i + 1) | 0;
}, 0, xs, ys);
}
export function toSeq(xs) {
return xs;
}
export function ofArrayWithTail(xs, tail_1) {
let res = tail_1;
for (let i = xs.length - 1; i >= 0; i--) {
res = FSharpList_Cons_305B8EAC(item_1(i, xs), res);
}
return res;
}
export function ofArray(xs) {
return ofArrayWithTail(xs, FSharpList_get_Empty());
}
export function ofSeq(xs) {
if (isArrayLike(xs)) {
return ofArray(xs);
}
else if (xs instanceof FSharpList) {
return xs;
}
else {
const root = FSharpList_get_Empty();
let node = root;
const enumerator = getEnumerator(xs);
try {
while (enumerator["System.Collections.IEnumerator.MoveNext"]()) {
let xs_3, t;
const x = enumerator["System.Collections.Generic.IEnumerator`1.get_Current"]();
node = ((xs_3 = node, (t = (new FSharpList(x, undefined)), (xs_3.tail = t, t))));
}
}
finally {
disposeSafe(enumerator);
}
const xs_5 = node;
const t_2 = FSharpList_get_Empty();
xs_5.tail = t_2;
return FSharpList__get_Tail(root);
}
}
export function concat(lists) {
const root = FSharpList_get_Empty();
let node = root;
const action = (xs) => {
node = fold((acc, x) => {
const t = new FSharpList(x, undefined);
acc.tail = t;
return t;
}, node, xs);
};
if (isArrayLike(lists)) {
const xs_3 = lists;
xs_3.forEach(action);
}
else if (lists instanceof FSharpList) {
iterate(action, lists);
}
else {
const enumerator = getEnumerator(lists);
try {
while (enumerator["System.Collections.IEnumerator.MoveNext"]()) {
action(enumerator["System.Collections.Generic.IEnumerator`1.get_Current"]());
}
}
finally {
disposeSafe(enumerator);
}
}
const xs_6 = node;
const t_2 = FSharpList_get_Empty();
xs_6.tail = t_2;
return FSharpList__get_Tail(root);
}
export function scan(folder, state, xs) {
const root = FSharpList_get_Empty();
let node;
const t = new FSharpList(state, undefined);
root.tail = t;
node = t;
let acc = state;
let xs_3 = xs;
while (!FSharpList__get_IsEmpty(xs_3)) {
let xs_4, t_2;
acc = folder(acc, FSharpList__get_Head(xs_3));
node = ((xs_4 = node, (t_2 = (new FSharpList(acc, undefined)), (xs_4.tail = t_2, t_2))));
xs_3 = FSharpList__get_Tail(xs_3);
}
const xs_6 = node;
const t_4 = FSharpList_get_Empty();
xs_6.tail = t_4;
return FSharpList__get_Tail(root);
}
export function scanBack(folder, xs, state) {
return ofArray(scanBack_1(folder, toArray(xs), state));
}
export function append(xs, ys) {
return fold((acc, x) => FSharpList_Cons_305B8EAC(x, acc), ys, reverse(xs));
}
export function collect(mapping, xs) {
const root = FSharpList_get_Empty();
let node = root;
let ys = xs;
while (!FSharpList__get_IsEmpty(ys)) {
let zs = mapping(FSharpList__get_Head(ys));
while (!FSharpList__get_IsEmpty(zs)) {
let xs_1, t;
node = ((xs_1 = node, (t = (new FSharpList(FSharpList__get_Head(zs), undefined)), (xs_1.tail = t, t))));
zs = FSharpList__get_Tail(zs);
}
ys = FSharpList__get_Tail(ys);
}
const xs_3 = node;
const t_2 = FSharpList_get_Empty();
xs_3.tail = t_2;
return FSharpList__get_Tail(root);
}
export function mapIndexed(mapping, xs) {
const root = FSharpList_get_Empty();
const node = foldIndexed((i, acc, x) => {
const t = new FSharpList(mapping(i, x), undefined);
acc.tail = t;
return t;
}, root, xs);
const t_2 = FSharpList_get_Empty();
node.tail = t_2;
return FSharpList__get_Tail(root);
}
export function map(mapping, xs) {
const root = FSharpList_get_Empty();
const node = fold((acc, x) => {
const t = new FSharpList(mapping(x), undefined);
acc.tail = t;
return t;
}, root, xs);
const t_2 = FSharpList_get_Empty();
node.tail = t_2;
return FSharpList__get_Tail(root);
}
export function indexed(xs) {
return mapIndexed((i, x) => [i, x], xs);
}
export function map2(mapping, xs, ys) {
const root = FSharpList_get_Empty();
const node = fold2((acc, x, y) => {
const t = new FSharpList(mapping(x, y), undefined);
acc.tail = t;
return t;
}, root, xs, ys);
const t_2 = FSharpList_get_Empty();
node.tail = t_2;
return FSharpList__get_Tail(root);
}
export function mapIndexed2(mapping, xs, ys) {
const loop = (i_mut, acc_mut, xs_1_mut, ys_1_mut) => {
loop: while (true) {
const i = i_mut, acc = acc_mut, xs_1 = xs_1_mut, ys_1 = ys_1_mut;
let t;
if (FSharpList__get_IsEmpty(xs_1) ? true : FSharpList__get_IsEmpty(ys_1)) {
return acc;
}
else {
i_mut = (i + 1);
acc_mut = ((t = (new FSharpList(mapping(i, FSharpList__get_Head(xs_1), FSharpList__get_Head(ys_1)), undefined)), (acc.tail = t, t)));
xs_1_mut = FSharpList__get_Tail(xs_1);
ys_1_mut = FSharpList__get_Tail(ys_1);
continue loop;
}
break;
}
};
const root = FSharpList_get_Empty();
const node_1 = loop(0, root, xs, ys);
const t_2 = FSharpList_get_Empty();
node_1.tail = t_2;
return FSharpList__get_Tail(root);
}
export function map3(mapping, xs, ys, zs) {
const loop = (acc_mut, xs_1_mut, ys_1_mut, zs_1_mut) => {
loop: while (true) {
const acc = acc_mut, xs_1 = xs_1_mut, ys_1 = ys_1_mut, zs_1 = zs_1_mut;
let t;
if ((FSharpList__get_IsEmpty(xs_1) ? true : FSharpList__get_IsEmpty(ys_1)) ? true : FSharpList__get_IsEmpty(zs_1)) {
return acc;
}
else {
acc_mut = ((t = (new FSharpList(mapping(FSharpList__get_Head(xs_1), FSharpList__get_Head(ys_1), FSharpList__get_Head(zs_1)), undefined)), (acc.tail = t, t)));
xs_1_mut = FSharpList__get_Tail(xs_1);
ys_1_mut = FSharpList__get_Tail(ys_1);
zs_1_mut = FSharpList__get_Tail(zs_1);
continue loop;
}
break;
}
};
const root = FSharpList_get_Empty();
const node_1 = loop(root, xs, ys, zs);
const t_2 = FSharpList_get_Empty();
node_1.tail = t_2;
return FSharpList__get_Tail(root);
}
export function mapFold(mapping, state, xs) {
const root = FSharpList_get_Empty();
const patternInput_1 = fold((tupledArg, x) => {
let t;
const patternInput = mapping(tupledArg[1], x);
return [(t = (new FSharpList(patternInput[0], undefined)), (tupledArg[0].tail = t, t)), patternInput[1]];
}, [root, state], xs);
const t_2 = FSharpList_get_Empty();
patternInput_1[0].tail = t_2;
return [FSharpList__get_Tail(root), patternInput_1[1]];
}
export function mapFoldBack(mapping, xs, state) {
return mapFold((acc, x) => mapping(x, acc), state, reverse(xs));
}
export function tryPick(f, xs) {
const loop = (xs_1_mut) => {
loop: while (true) {
const xs_1 = xs_1_mut;
if (FSharpList__get_IsEmpty(xs_1)) {
return undefined;
}
else {
const matchValue = f(FSharpList__get_Head(xs_1));
if (matchValue == null) {
xs_1_mut = FSharpList__get_Tail(xs_1);
continue loop;
}
else {
return matchValue;
}
}
break;
}
};
return loop(xs);
}
export function pick(f, xs) {
const matchValue = tryPick(f, xs);
if (matchValue == null) {
return indexNotFound();
}
else {
return value_1(matchValue);
}
}
export function tryFind(f, xs) {
return tryPick((x) => (f(x) ? some(x) : undefined), xs);
}
export function find(f, xs) {
const matchValue = tryFind(f, xs);
if (matchValue == null) {
return indexNotFound();
}
else {
return value_1(matchValue);
}
}
export function tryFindBack(f, xs) {
return tryFindBack_1(f, toArray(xs));
}
export function findBack(f, xs) {
const matchValue = tryFindBack(f, xs);
if (matchValue == null) {
return indexNotFound();
}
else {
return value_1(matchValue);
}
}
export function tryFindIndex(f, xs) {
const loop = (i_mut, xs_1_mut) => {
loop: while (true) {
const i = i_mut, xs_1 = xs_1_mut;
if (FSharpList__get_IsEmpty(xs_1)) {
return undefined;
}
else if (f(FSharpList__get_Head(xs_1))) {
return i;
}
else {
i_mut = (i + 1);
xs_1_mut = FSharpList__get_Tail(xs_1);
continue loop;
}
break;
}
};
return loop(0, xs);
}
export function findIndex(f, xs) {
const matchValue = tryFindIndex(f, xs);
if (matchValue == null) {
indexNotFound();
return -1;
}
else {
return value_1(matchValue) | 0;
}
}
export function tryFindIndexBack(f, xs) {
return tryFindIndexBack_1(f, toArray(xs));
}
export function findIndexBack(f, xs) {
const matchValue = tryFindIndexBack(f, xs);
if (matchValue == null) {
indexNotFound();
return -1;
}
else {
return value_1(matchValue) | 0;
}
}
export function tryItem(n, xs) {
const loop = (i_mut, xs_1_mut) => {
loop: while (true) {
const i = i_mut, xs_1 = xs_1_mut;
if (FSharpList__get_IsEmpty(xs_1)) {
return undefined;
}
else if (i === n) {
return some(FSharpList__get_Head(xs_1));
}
else {
i_mut = (i + 1);
xs_1_mut = FSharpList__get_Tail(xs_1);
continue loop;
}
break;
}
};
return loop(0, xs);
}
export function item(n, xs) {
return FSharpList__get_Item_Z524259A4(xs, n);
}
export function filter(f, xs) {
const root = FSharpList_get_Empty();
const node = fold((acc, x) => {
if (f(x)) {
const t = new FSharpList(x, undefined);
acc.tail = t;
return t;
}
else {
return acc;
}
}, root, xs);
const t_2 = FSharpList_get_Empty();
node.tail = t_2;
return FSharpList__get_Tail(root);
}
export function partition(f, xs) {
const matchValue = FSharpList_get_Empty();
const root2 = FSharpList_get_Empty();
const root1 = matchValue;
const patternInput_1 = fold((tupledArg, x) => {
let t, t_2;
const lacc = tupledArg[0];
const racc = tupledArg[1];
if (f(x)) {
return [(t = (new FSharpList(x, undefined)), (lacc.tail = t, t)), racc];
}
else {
return [lacc, (t_2 = (new FSharpList(x, undefined)), (racc.tail = t_2, t_2))];
}
}, [root1, root2], xs);
const t_4 = FSharpList_get_Empty();
patternInput_1[0].tail = t_4;
const t_5 = FSharpList_get_Empty();
patternInput_1[1].tail = t_5;
return [FSharpList__get_Tail(root1), FSharpList__get_Tail(root2)];
}
export function choose(f, xs) {
const root = FSharpList_get_Empty();
const node = fold((acc, x) => {
const matchValue = f(x);
if (matchValue == null) {
return acc;
}
else {
const t = new FSharpList(value_1(matchValue), undefined);
acc.tail = t;
return t;
}
}, root, xs);
const t_2 = FSharpList_get_Empty();
node.tail = t_2;
return FSharpList__get_Tail(root);
}
export function contains(value, xs, eq) {
return tryFindIndex((v) => eq.Equals(value, v), xs) != null;
}
export function initialize(n, f) {
const root = FSharpList_get_Empty();
let node = root;
for (let i = 0; i <= (n - 1); i++) {
let xs, t;
node = ((xs = node, (t = (new FSharpList(f(i), undefined)), (xs.tail = t, t))));
}
const xs_2 = node;
const t_2 = FSharpList_get_Empty();
xs_2.tail = t_2;
return FSharpList__get_Tail(root);
}
export function replicate(n, x) {
return initialize(n, (_arg) => x);
}
export function reduce(f, xs) {
if (FSharpList__get_IsEmpty(xs)) {
throw new Error(SR_inputWasEmpty);
}
else {
return fold(f, head(xs), tail(xs));
}
}
export function reduceBack(f, xs) {
if (FSharpList__get_IsEmpty(xs)) {
throw new Error(SR_inputWasEmpty);
}
else {
return foldBack(f, tail(xs), head(xs));
}
}
export function forAll(f, xs) {
return fold((acc, x) => (acc && f(x)), true, xs);
}
export function forAll2(f, xs, ys) {
return fold2((acc, x, y) => (acc && f(x, y)), true, xs, ys);
}
export function exists(f, xs) {
return tryFindIndex(f, xs) != null;
}
export function exists2(f_mut, xs_mut, ys_mut) {
exists2: while (true) {
const f = f_mut, xs = xs_mut, ys = ys_mut;
const matchValue = FSharpList__get_IsEmpty(xs);
const matchValue_1 = FSharpList__get_IsEmpty(ys);
let matchResult;
if (matchValue) {
if (matchValue_1) {
matchResult = 0;
}
else {
matchResult = 2;
}
}
else if (matchValue_1) {
matchResult = 2;
}
else {
matchResult = 1;
}
switch (matchResult) {
case 0:
return false;
case 1:
if (f(FSharpList__get_Head(xs), FSharpList__get_Head(ys))) {
return true;
}
else {
f_mut = f;
xs_mut = FSharpList__get_Tail(xs);
ys_mut = FSharpList__get_Tail(ys);
continue exists2;
}
default:
throw new Error((SR_differentLengths + "\\nParameter name: ") + "list2");
}
break;
}
}
export function unzip(xs) {
return foldBack((tupledArg, tupledArg_1) => [FSharpList_Cons_305B8EAC(tupledArg[0], tupledArg_1[0]), FSharpList_Cons_305B8EAC(tupledArg[1], tupledArg_1[1])], xs, [FSharpList_get_Empty(), FSharpList_get_Empty()]);
}
export function unzip3(xs) {
return foldBack((tupledArg, tupledArg_1) => [FSharpList_Cons_305B8EAC(tupledArg[0], tupledArg_1[0]), FSharpList_Cons_305B8EAC(tupledArg[1], tupledArg_1[1]), FSharpList_Cons_305B8EAC(tupledArg[2], tupledArg_1[2])], xs, [FSharpList_get_Empty(), FSharpList_get_Empty(), FSharpList_get_Empty()]);
}
export function zip(xs, ys) {
return map2((x, y) => [x, y], xs, ys);
}
export function zip3(xs, ys, zs) {
return map3((x, y, z) => [x, y, z], xs, ys, zs);
}
export function sortWith(comparer, xs) {
const arr = toArray(xs);
arr.sort(comparer);
return ofArray(arr);
}
export function sort(xs, comparer) {
return sortWith((x, y) => (comparer.Compare(x, y) | 0), xs);
}
export function sortBy(projection, xs, comparer) {
return sortWith((x, y) => (comparer.Compare(projection(x), projection(y)) | 0), xs);
}
export function sortDescending(xs, comparer) {
return sortWith((x, y) => ((comparer.Compare(x, y) * -1) | 0), xs);
}
export function sortByDescending(projection, xs, comparer) {
return sortWith((x, y) => ((comparer.Compare(projection(x), projection(y)) * -1) | 0), xs);
}
export function sum(xs, adder) {
return fold((acc, x) => adder.Add(acc, x), adder.GetZero(), xs);
}
export function sumBy(f, xs, adder) {
return fold((acc, x) => adder.Add(acc, f(x)), adder.GetZero(), xs);
}
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(xs, averager) {
let count = 0;
const total = fold((acc, x) => {
count = ((count + 1) | 0);
return averager.Add(acc, x);
}, averager.GetZero(), xs);
return averager.DivideByInt(total, count);
}
export function averageBy(f, xs, averager) {
let count = 0;
const total = fold((acc, x) => {
count = ((count + 1) | 0);
return averager.Add(acc, f(x));
}, averager.GetZero(), xs);
return averager.DivideByInt(total, count);
}
export function permute(f, xs) {
return ofArray(permute_1(f, toArray(xs)));
}
export function chunkBySize(chunkSize, xs) {
return ofArray(map_1(ofArray, chunkBySize_1(chunkSize, toArray(xs))));
}
export function allPairs(xs, ys) {
const root = FSharpList_get_Empty();
let node = root;
iterate((x) => {
iterate((y) => {
let xs_1, t;
node = ((xs_1 = node, (t = (new FSharpList([x, y], undefined)), (xs_1.tail = t, t))));
}, ys);
}, xs);
const xs_3 = node;
const t_2 = FSharpList_get_Empty();
xs_3.tail = t_2;
return FSharpList__get_Tail(root);
}
export function skip(count_mut, xs_mut) {
skip: while (true) {
const count = count_mut, xs = xs_mut;
if (count <= 0) {
return xs;
}
else if (FSharpList__get_IsEmpty(xs)) {
throw new Error((SR_notEnoughElements + "\\nParameter name: ") + "list");
}
else {
count_mut = (count - 1);
xs_mut = FSharpList__get_Tail(xs);
continue skip;
}
break;
}
}
export function skipWhile(predicate_mut, xs_mut) {
skipWhile: while (true) {
const predicate = predicate_mut, xs = xs_mut;
if (FSharpList__get_IsEmpty(xs)) {
return xs;
}
else if (!predicate(FSharpList__get_Head(xs))) {
return xs;
}
else {
predicate_mut = predicate;
xs_mut = FSharpList__get_Tail(xs);
continue skipWhile;
}
break;
}
}
export function take(count, xs) {
if (count < 0) {
throw new Error((SR_inputMustBeNonNegative + "\\nParameter name: ") + "count");
}
const loop = (i_mut, acc_mut, xs_1_mut) => {
loop: while (true) {
const i = i_mut, acc = acc_mut, xs_1 = xs_1_mut;
let t;
if (i <= 0) {
return acc;
}
else if (FSharpList__get_IsEmpty(xs_1)) {
throw new Error((SR_notEnoughElements + "\\nParameter name: ") + "list");
}
else {
i_mut = (i - 1);
acc_mut = ((t = (new FSharpList(FSharpList__get_Head(xs_1), undefined)), (acc.tail = t, t)));
xs_1_mut = FSharpList__get_Tail(xs_1);
continue loop;
}
break;
}
};
const root = FSharpList_get_Empty();
const node = loop(count, root, xs);
const t_2 = FSharpList_get_Empty();
node.tail = t_2;
return FSharpList__get_Tail(root);
}
export function takeWhile(predicate, xs) {
const loop = (acc_mut, xs_1_mut) => {
loop: while (true) {
const acc = acc_mut, xs_1 = xs_1_mut;
let t;
if (FSharpList__get_IsEmpty(xs_1)) {
return acc;
}
else if (!predicate(FSharpList__get_Head(xs_1))) {
return acc;
}
else {
acc_mut = ((t = (new FSharpList(FSharpList__get_Head(xs_1), undefined)), (acc.tail = t, t)));
xs_1_mut = FSharpList__get_Tail(xs_1);
continue loop;
}
break;
}
};
const root = FSharpList_get_Empty();
const node = loop(root, xs);
const t_2 = FSharpList_get_Empty();
node.tail = t_2;
return FSharpList__get_Tail(root);
}
export function truncate(count, xs) {
const loop = (i_mut, acc_mut, xs_1_mut) => {
loop: while (true) {
const i = i_mut, acc = acc_mut, xs_1 = xs_1_mut;
let t;
if (i <= 0) {
return acc;
}
else if (FSharpList__get_IsEmpty(xs_1)) {
return acc;
}
else {
i_mut = (i - 1);
acc_mut = ((t = (new FSharpList(FSharpList__get_Head(xs_1), undefined)), (acc.tail = t, t)));
xs_1_mut = FSharpList__get_Tail(xs_1);
continue loop;
}
break;
}
};
const root = FSharpList_get_Empty();
const node = loop(count, root, xs);
const t_2 = FSharpList_get_Empty();
node.tail = t_2;
return FSharpList__get_Tail(root);
}
export function getSlice(startIndex, endIndex, xs) {
const len = length(xs) | 0;
let startIndex_1;
const index = defaultArg(startIndex, 0) | 0;
startIndex_1 = ((index < 0) ? 0 : index);
let endIndex_1;
const index_1 = defaultArg(endIndex, len - 1) | 0;
endIndex_1 = ((index_1 >= len) ? (len - 1) : index_1);
if (endIndex_1 < startIndex_1) {
return FSharpList_get_Empty();
}
else {
return take((endIndex_1 - startIndex_1) + 1, skip(startIndex_1, xs));
}
}
export function splitAt(index, xs) {
if (index < 0) {
throw new Error((SR_inputMustBeNonNegative + "\\nParameter name: ") + "index");
}
if (index > FSharpList__get_Length(xs)) {
throw new Error((SR_notEnoughElements + "\\nParameter name: ") + "index");
}
return [take(index, xs), skip(index, xs)];
}
export function exactlyOne(xs) {
if (FSharpList__get_IsEmpty(xs)) {
throw new Error((SR_inputSequenceEmpty + "\\nParameter name: ") + "list");
}
else if (FSharpList__get_IsEmpty(FSharpList__get_Tail(xs))) {
return FSharpList__get_Head(xs);
}
else {
throw new Error((SR_inputSequenceTooLong + "\\nParameter name: ") + "list");
}
}
export function tryExactlyOne(xs) {
if (!FSharpList__get_IsEmpty(xs) && FSharpList__get_IsEmpty(FSharpList__get_Tail(xs))) {
return some(FSharpList__get_Head(xs));
}
else {
return undefined;
}
}
export function where(predicate, xs) {
return filter(predicate, xs);
}
export function pairwise(xs) {
return ofArray(pairwise_1(toArray(xs)));
}
export function windowed(windowSize, xs) {
return ofArray(map_1(ofArray, windowed_1(windowSize, toArray(xs))));
}
export function splitInto(chunks, xs) {
return ofArray(map_1(ofArray, splitInto_1(chunks, toArray(xs))));
}
export function transpose(lists) {
return ofArray(map_1(ofArray, transpose_1(map_1(toArray, Array.from(lists)))));
}
export function insertAt(index, y, xs) {
let i = -1;
let isDone = false;
const result = fold((acc, x) => {
i = ((i + 1) | 0);
if (i === index) {
isDone = true;
return FSharpList_Cons_305B8EAC(x, FSharpList_Cons_305B8EAC(y, acc));
}
else {
return FSharpList_Cons_305B8EAC(x, acc);
}
}, FSharpList_get_Empty(), xs);
return reverse(isDone ? result : (((i + 1) === index) ? FSharpList_Cons_305B8EAC(y, result) : (() => {
throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index");
})()));
}
export function insertManyAt(index, ys, xs) {
let i = -1;
let isDone = false;
const ys_1 = ofSeq(ys);
const result = fold((acc, x) => {
i = ((i + 1) | 0);
if (i === index) {
isDone = true;
return FSharpList_Cons_305B8EAC(x, append(ys_1, acc));
}
else {
return FSharpList_Cons_305B8EAC(x, acc);
}
}, FSharpList_get_Empty(), xs);
return reverse(isDone ? result : (((i + 1) === index) ? append(ys_1, result) : (() => {
throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index");
})()));
}
export function removeAt(index, xs) {
let i = -1;
let isDone = false;
const ys = filter((_arg) => {
i = ((i + 1) | 0);
if (i === index) {
isDone = true;
return false;
}
else {
return true;
}
}, xs);
if (!isDone) {
throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index");
}
return ys;
}
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) {
let isDone = false;
const ys = mapIndexed((i, x) => {
if (i === index) {
isDone = true;
return y;
}
else {
return x;
}
}, xs);
if (!isDone) {
throw new Error((SR_indexOutOfBounds + "\\nParameter name: ") + "index");
}
return ys;
}