UNPKG

@fable-org/fable-library-js

Version:

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

1,371 lines (1,370 loc) 43.7 kB
import { InvalidOperationException_$ctor_Z721C83C5, NotSupportedException_$ctor_Z721C83C5 } from "./System.js"; import { clear, Exception, isDisposable, isArrayLike, toIterator, disposeSafe, getEnumerator } from "./Util.js"; import { toString } from "./Types.js"; import { class_type } from "./Reflection.js"; import { some, value as value_1 } from "./Option.js"; import { KeyNotFoundException_$ctor_Z721C83C5 } from "./System.Collections.Generic.js"; import { Operators_Lock, Operators_NullArgCheck } from "./FSharp.Core.js"; import { chunkBySize as chunkBySize_1, permute as permute_1, transpose as transpose_1, map as map_1, windowed as windowed_1, splitInto as splitInto_1, pairwise as pairwise_1, scanBack as scanBack_1, reverse as reverse_1, mapFoldBack as mapFoldBack_1, mapFold as mapFold_1, tryItem as tryItem_1, tryHead as tryHead_1, foldBack2 as foldBack2_1, foldBack as foldBack_1, tryFindIndexBack as tryFindIndexBack_1, tryFindBack as tryFindBack_1, singleton as singleton_1 } from "./Array.js"; import { length as length_1, tryItem as tryItem_2, isEmpty as isEmpty_1, tryHead as tryHead_2, ofSeq as ofSeq_1, ofArray as ofArray_1, toArray as toArray_1, FSharpList } from "./List.js"; import { SR_indexOutOfBounds } from "./Global.js"; export const SR_enumerationAlreadyFinished = "Enumeration already finished."; export const SR_enumerationNotStarted = "Enumeration has not started. Call MoveNext."; export const SR_inputSequenceEmpty = "The input sequence was empty."; export const SR_inputSequenceTooLong = "The input sequence contains more than one element."; export const SR_keyNotFoundAlt = "An index satisfying the predicate was not found in the collection."; export const SR_notEnoughElements = "The input sequence has an insufficient number of elements."; export const SR_resetNotSupported = "Reset is not supported on this enumerator."; export function Enumerator_noReset() { throw NotSupportedException_$ctor_Z721C83C5(SR_resetNotSupported); } export function Enumerator_notStarted() { throw InvalidOperationException_$ctor_Z721C83C5(SR_enumerationNotStarted); } export function Enumerator_alreadyFinished() { throw InvalidOperationException_$ctor_Z721C83C5(SR_enumerationAlreadyFinished); } export class Enumerator_Seq { constructor(f) { this.f = f; } toString() { const xs = this; let i = 0; let str = "seq ["; const e = getEnumerator(xs); try { while ((i < 4) && e["System.Collections.IEnumerator.MoveNext"]()) { if (i > 0) { str = (str + "; "); } str = (str + toString(e["System.Collections.Generic.IEnumerator`1.get_Current"]())); i = ((i + 1) | 0); } if (i === 4) { str = (str + "; ..."); } return str + "]"; } finally { disposeSafe(e); } } GetEnumerator() { const x = this; return x.f(); } [Symbol.iterator]() { return toIterator(getEnumerator(this)); } "System.Collections.IEnumerable.GetEnumerator"() { const x = this; return x.f(); } } export function Enumerator_Seq_$reflection(gen0) { return class_type("SeqModule.Enumerator.Seq", [gen0], Enumerator_Seq); } export function Enumerator_Seq_$ctor_673A07F2(f) { return new Enumerator_Seq(f); } export class Enumerator_FromFunctions$1 { constructor(current, next, dispose) { this.current = current; this.next = next; this.dispose = dispose; } "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; return _.next(); } "System.Collections.IEnumerator.Reset"() { Enumerator_noReset(); } Dispose() { const _ = this; _.dispose(); } } export function Enumerator_FromFunctions$1_$reflection(gen0) { return class_type("SeqModule.Enumerator.FromFunctions`1", [gen0], Enumerator_FromFunctions$1); } export function Enumerator_FromFunctions$1_$ctor_58C54629(current, next, dispose) { return new Enumerator_FromFunctions$1(current, next, dispose); } export function Enumerator_cast(e) { return Enumerator_FromFunctions$1_$ctor_58C54629(() => e["System.Collections.Generic.IEnumerator`1.get_Current"](), () => e["System.Collections.IEnumerator.MoveNext"](), () => { disposeSafe(e); }); } export function Enumerator_concat(sources) { let outerOpt = undefined; let innerOpt = undefined; let started = false; let finished = false; let curr = undefined; const finish = () => { finished = true; if (innerOpt != null) { const inner = value_1(innerOpt); try { disposeSafe(inner); } finally { innerOpt = undefined; } } if (outerOpt != null) { const outer = value_1(outerOpt); try { disposeSafe(outer); } finally { outerOpt = undefined; } } }; return Enumerator_FromFunctions$1_$ctor_58C54629(() => { if (!started) { Enumerator_notStarted(); } else if (finished) { Enumerator_alreadyFinished(); } if (curr != null) { return value_1(curr); } else { return Enumerator_alreadyFinished(); } }, () => { if (!started) { started = true; } if (finished) { return false; } else { let res = undefined; while (res == null) { let copyOfStruct = undefined; const outerOpt_1 = outerOpt; const innerOpt_1 = innerOpt; if (outerOpt_1 != null) { if (innerOpt_1 != null) { const inner_1 = value_1(innerOpt_1); if (inner_1["System.Collections.IEnumerator.MoveNext"]()) { curr = some(inner_1["System.Collections.Generic.IEnumerator`1.get_Current"]()); res = true; } else { try { disposeSafe(inner_1); } finally { innerOpt = undefined; } } } else { const outer_1 = value_1(outerOpt_1); if (outer_1["System.Collections.IEnumerator.MoveNext"]()) { const ie = outer_1["System.Collections.Generic.IEnumerator`1.get_Current"](); innerOpt = ((copyOfStruct = ie, getEnumerator(copyOfStruct))); } else { finish(); res = false; } } } else { outerOpt = getEnumerator(sources); } } return value_1(res); } }, () => { if (!finished) { finish(); } }); } export function Enumerator_enumerateThenFinally(f, e) { return Enumerator_FromFunctions$1_$ctor_58C54629(() => e["System.Collections.Generic.IEnumerator`1.get_Current"](), () => e["System.Collections.IEnumerator.MoveNext"](), () => { try { disposeSafe(e); } finally { f(); } }); } export function Enumerator_generateWhileSome(openf, compute, closef) { let started = false; let curr = undefined; let state = some(openf()); const dispose = () => { if (state != null) { const x_1 = value_1(state); try { closef(x_1); } finally { state = undefined; } } }; const finish = () => { try { dispose(); } finally { curr = undefined; } }; return Enumerator_FromFunctions$1_$ctor_58C54629(() => { if (!started) { Enumerator_notStarted(); } if (curr != null) { return value_1(curr); } else { return Enumerator_alreadyFinished(); } }, () => { if (!started) { started = true; } if (state != null) { const s = value_1(state); let matchValue_1; try { matchValue_1 = compute(s); } catch (matchValue) { finish(); throw matchValue; } if (matchValue_1 != null) { curr = matchValue_1; return true; } else { finish(); return false; } } else { return false; } }, dispose); } export function Enumerator_unfold(f, state) { let curr = undefined; let acc = state; return Enumerator_FromFunctions$1_$ctor_58C54629(() => { if (curr != null) { const x = value_1(curr)[0]; const st = value_1(curr)[1]; return x; } else { return Enumerator_notStarted(); } }, () => { curr = f(acc); if (curr != null) { const x_1 = value_1(curr)[0]; const st_1 = value_1(curr)[1]; acc = st_1; return true; } else { return false; } }, () => { }); } export function indexNotFound() { throw KeyNotFoundException_$ctor_Z721C83C5(SR_keyNotFoundAlt); } export function mkSeq(f) { return Enumerator_Seq_$ctor_673A07F2(f); } export function ofSeq(xs) { return getEnumerator(Operators_NullArgCheck("source", xs)); } export function delay(generator) { return mkSeq(() => getEnumerator(generator())); } export function concat(sources) { return mkSeq(() => Enumerator_concat(sources)); } export function unfold(generator, state) { return mkSeq(() => Enumerator_unfold(generator, state)); } export function empty() { return delay(() => (new Array(0))); } export function singleton(x) { return delay(() => singleton_1(x)); } export function ofArray(arr) { return arr; } export function toArray(xs) { if (xs instanceof FSharpList) { const a = xs; return toArray_1(a); } else { return Array.from(xs); } } export function ofList(xs) { return xs; } export function toList(xs) { if (isArrayLike(xs)) { return ofArray_1(xs); } else if (xs instanceof FSharpList) { return xs; } else { return ofSeq_1(xs); } } export function generate(create, compute, dispose) { return mkSeq(() => Enumerator_generateWhileSome(create, compute, dispose)); } export function generateIndexed(create, compute, dispose) { return mkSeq(() => { let i = -1; return Enumerator_generateWhileSome(create, (x) => { i = ((i + 1) | 0); return compute(i, x); }, dispose); }); } export function append(xs, ys) { return concat([xs, ys]); } export function cast(xs) { return mkSeq(() => Enumerator_cast(getEnumerator(Operators_NullArgCheck("source", xs)))); } export function choose(chooser, xs) { return generate(() => ofSeq(xs), (e) => { let curr = undefined; while ((curr == null) && e["System.Collections.IEnumerator.MoveNext"]()) { curr = chooser(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } return curr; }, (e_1) => { disposeSafe(e_1); }); } export function compareWith(comparer, xs, ys) { const e1 = ofSeq(xs); try { const e2 = ofSeq(ys); try { let c = 0; let b1 = e1["System.Collections.IEnumerator.MoveNext"](); let b2 = e2["System.Collections.IEnumerator.MoveNext"](); while (((c === 0) && b1) && b2) { c = (comparer(e1["System.Collections.Generic.IEnumerator`1.get_Current"](), e2["System.Collections.Generic.IEnumerator`1.get_Current"]()) | 0); if (c === 0) { b1 = e1["System.Collections.IEnumerator.MoveNext"](); b2 = e2["System.Collections.IEnumerator.MoveNext"](); } } return ((c !== 0) ? c : (b1 ? 1 : (b2 ? -1 : 0))) | 0; } finally { disposeSafe(e2); } } finally { disposeSafe(e1); } } export function contains(value, xs, comparer) { const e = ofSeq(xs); try { let found = false; while (!found && e["System.Collections.IEnumerator.MoveNext"]()) { found = comparer.Equals(value, e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } return found; } finally { disposeSafe(e); } } export function enumerateFromFunctions(create, moveNext, current) { return generate(create, (x) => (moveNext(x) ? some(current(x)) : undefined), (x_1) => { const matchValue = x_1; if (isDisposable(matchValue)) { const id = matchValue; disposeSafe(id); } }); } export function enumerateThenFinally(source, compensation) { const compensation_1 = compensation; return mkSeq(() => { try { return Enumerator_enumerateThenFinally(compensation_1, ofSeq(source)); } catch (matchValue) { compensation_1(); throw matchValue; } }); } export function enumerateUsing(resource, source) { const compensation = () => { if (resource == null) { } else { let copyOfStruct = resource; disposeSafe(copyOfStruct); } }; return mkSeq(() => { try { return Enumerator_enumerateThenFinally(compensation, ofSeq(source(resource))); } catch (matchValue_1) { compensation(); throw matchValue_1; } }); } export function enumerateWhile(guard, xs) { return concat(unfold((i) => (guard() ? [xs, i + 1] : undefined), 0)); } export function filter(f, xs) { return choose((x) => { if (f(x)) { return some(x); } else { return undefined; } }, xs); } export function exists(predicate, xs) { const e = ofSeq(xs); try { let found = false; while (!found && e["System.Collections.IEnumerator.MoveNext"]()) { found = predicate(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } return found; } finally { disposeSafe(e); } } export function exists2(predicate, xs, ys) { const e1 = ofSeq(xs); try { const e2 = ofSeq(ys); try { let found = false; while ((!found && e1["System.Collections.IEnumerator.MoveNext"]()) && e2["System.Collections.IEnumerator.MoveNext"]()) { found = predicate(e1["System.Collections.Generic.IEnumerator`1.get_Current"](), e2["System.Collections.Generic.IEnumerator`1.get_Current"]()); } return found; } finally { disposeSafe(e2); } } finally { disposeSafe(e1); } } export function exactlyOne(xs) { const e = ofSeq(xs); try { if (e["System.Collections.IEnumerator.MoveNext"]()) { const v = e["System.Collections.Generic.IEnumerator`1.get_Current"](); if (e["System.Collections.IEnumerator.MoveNext"]()) { throw new Exception((SR_inputSequenceTooLong + "\\nParameter name: ") + "source"); } else { return v; } } else { throw new Exception((SR_inputSequenceEmpty + "\\nParameter name: ") + "source"); } } finally { disposeSafe(e); } } export function tryExactlyOne(xs) { const e = ofSeq(xs); try { if (e["System.Collections.IEnumerator.MoveNext"]()) { const v = e["System.Collections.Generic.IEnumerator`1.get_Current"](); return e["System.Collections.IEnumerator.MoveNext"]() ? undefined : some(v); } else { return undefined; } } finally { disposeSafe(e); } } export function tryFind(predicate, xs) { const e = ofSeq(xs); try { let res = undefined; while ((res == null) && e["System.Collections.IEnumerator.MoveNext"]()) { const c = e["System.Collections.Generic.IEnumerator`1.get_Current"](); if (predicate(c)) { res = some(c); } } return res; } finally { disposeSafe(e); } } export function find(predicate, xs) { const matchValue = tryFind(predicate, xs); if (matchValue == null) { return indexNotFound(); } else { return value_1(matchValue); } } export function tryFindBack(predicate, xs) { return tryFindBack_1(predicate, toArray(xs)); } export function findBack(predicate, xs) { const matchValue = tryFindBack(predicate, xs); if (matchValue == null) { return indexNotFound(); } else { return value_1(matchValue); } } export function tryFindIndex(predicate, xs) { const e = ofSeq(xs); try { const loop = (i_mut) => { loop: while (true) { const i = i_mut; if (e["System.Collections.IEnumerator.MoveNext"]()) { if (predicate(e["System.Collections.Generic.IEnumerator`1.get_Current"]())) { return i; } else { i_mut = (i + 1); continue loop; } } else { return undefined; } break; } }; return loop(0); } finally { disposeSafe(e); } } export function findIndex(predicate, xs) { const matchValue = tryFindIndex(predicate, xs); if (matchValue == null) { indexNotFound(); return -1; } else { return value_1(matchValue) | 0; } } export function tryFindIndexBack(predicate, xs) { return tryFindIndexBack_1(predicate, toArray(xs)); } export function findIndexBack(predicate, xs) { const matchValue = tryFindIndexBack(predicate, xs); if (matchValue == null) { indexNotFound(); return -1; } else { return value_1(matchValue) | 0; } } export function fold(folder, state, xs) { const e = ofSeq(xs); try { let acc = state; while (e["System.Collections.IEnumerator.MoveNext"]()) { acc = folder(acc, e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } return acc; } finally { disposeSafe(e); } } export function foldBack(folder, xs, state) { return foldBack_1(folder, toArray(xs), state); } export function fold2(folder, state, xs, ys) { const e1 = ofSeq(xs); try { const e2 = ofSeq(ys); try { let acc = state; while (e1["System.Collections.IEnumerator.MoveNext"]() && e2["System.Collections.IEnumerator.MoveNext"]()) { acc = folder(acc, e1["System.Collections.Generic.IEnumerator`1.get_Current"](), e2["System.Collections.Generic.IEnumerator`1.get_Current"]()); } return acc; } finally { disposeSafe(e2); } } finally { disposeSafe(e1); } } export function foldBack2(folder, xs, ys, state) { return foldBack2_1(folder, toArray(xs), toArray(ys), state); } export function forAll(predicate, xs) { return !exists((x) => !predicate(x), xs); } export function forAll2(predicate, xs, ys) { return !exists2((x, y) => !predicate(x, y), xs, ys); } export function tryHead(xs) { if (isArrayLike(xs)) { return tryHead_1(xs); } else if (xs instanceof FSharpList) { return tryHead_2(xs); } else { const e = ofSeq(xs); try { return e["System.Collections.IEnumerator.MoveNext"]() ? some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()) : undefined; } finally { disposeSafe(e); } } } export function head(xs) { const matchValue = tryHead(xs); if (matchValue == null) { throw new Exception((SR_inputSequenceEmpty + "\\nParameter name: ") + "source"); } else { return value_1(matchValue); } } export function initialize(count, f) { return unfold((i) => ((i < count) ? [f(i), i + 1] : undefined), 0); } export function initializeInfinite(f) { return initialize(2147483647, f); } export function isEmpty(xs) { if (isArrayLike(xs)) { const a = xs; return a.length === 0; } else if (xs instanceof FSharpList) { return isEmpty_1(xs); } else { const e = ofSeq(xs); try { return !e["System.Collections.IEnumerator.MoveNext"](); } finally { disposeSafe(e); } } } export function tryItem(index, xs) { if (isArrayLike(xs)) { return tryItem_1(index, xs); } else if (xs instanceof FSharpList) { return tryItem_2(index, xs); } else { const e = ofSeq(xs); try { const loop = (index_1_mut) => { loop: while (true) { const index_1 = index_1_mut; if (!e["System.Collections.IEnumerator.MoveNext"]()) { return undefined; } else if (index_1 === 0) { return some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } else { index_1_mut = (index_1 - 1); continue loop; } break; } }; return loop(index); } finally { disposeSafe(e); } } } export function item(index, xs) { const matchValue = tryItem(index, xs); if (matchValue == null) { throw new Exception((SR_notEnoughElements + "\\nParameter name: ") + "index"); } else { return value_1(matchValue); } } 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 tryLast(xs) { const e = ofSeq(xs); try { const loop = (acc_mut) => { loop: while (true) { const acc = acc_mut; if (!e["System.Collections.IEnumerator.MoveNext"]()) { return acc; } else { acc_mut = e["System.Collections.Generic.IEnumerator`1.get_Current"](); continue loop; } break; } }; return e["System.Collections.IEnumerator.MoveNext"]() ? some(loop(e["System.Collections.Generic.IEnumerator`1.get_Current"]())) : undefined; } finally { disposeSafe(e); } } export function last(xs) { const matchValue = tryLast(xs); if (matchValue == null) { throw new Exception((SR_notEnoughElements + "\\nParameter name: ") + "source"); } else { return value_1(matchValue); } } export function length(xs) { if (isArrayLike(xs)) { const a = xs; return a.length | 0; } else if (xs instanceof FSharpList) { return length_1(xs) | 0; } else { const e = ofSeq(xs); try { let count = 0; while (e["System.Collections.IEnumerator.MoveNext"]()) { count = ((count + 1) | 0); } return count | 0; } finally { disposeSafe(e); } } } export function map(mapping, xs) { return generate(() => ofSeq(xs), (e) => (e["System.Collections.IEnumerator.MoveNext"]() ? some(mapping(e["System.Collections.Generic.IEnumerator`1.get_Current"]())) : undefined), (e_1) => { disposeSafe(e_1); }); } export function mapIndexed(mapping, xs) { return generateIndexed(() => ofSeq(xs), (i, e) => (e["System.Collections.IEnumerator.MoveNext"]() ? some(mapping(i, e["System.Collections.Generic.IEnumerator`1.get_Current"]())) : undefined), (e_1) => { disposeSafe(e_1); }); } export function indexed(xs) { return mapIndexed((i, x) => [i, x], xs); } export function map2(mapping, xs, ys) { return generate(() => [ofSeq(xs), ofSeq(ys)], (tupledArg) => { const e1 = tupledArg[0]; const e2 = tupledArg[1]; return (e1["System.Collections.IEnumerator.MoveNext"]() && e2["System.Collections.IEnumerator.MoveNext"]()) ? some(mapping(e1["System.Collections.Generic.IEnumerator`1.get_Current"](), e2["System.Collections.Generic.IEnumerator`1.get_Current"]())) : undefined; }, (tupledArg_1) => { try { disposeSafe(tupledArg_1[0]); } finally { disposeSafe(tupledArg_1[1]); } }); } export function mapIndexed2(mapping, xs, ys) { return generateIndexed(() => [ofSeq(xs), ofSeq(ys)], (i, tupledArg) => { const e1 = tupledArg[0]; const e2 = tupledArg[1]; return (e1["System.Collections.IEnumerator.MoveNext"]() && e2["System.Collections.IEnumerator.MoveNext"]()) ? some(mapping(i, e1["System.Collections.Generic.IEnumerator`1.get_Current"](), e2["System.Collections.Generic.IEnumerator`1.get_Current"]())) : undefined; }, (tupledArg_1) => { try { disposeSafe(tupledArg_1[0]); } finally { disposeSafe(tupledArg_1[1]); } }); } export function map3(mapping, xs, ys, zs) { return generate(() => [ofSeq(xs), ofSeq(ys), ofSeq(zs)], (tupledArg) => { const e1 = tupledArg[0]; const e2 = tupledArg[1]; const e3 = tupledArg[2]; return ((e1["System.Collections.IEnumerator.MoveNext"]() && e2["System.Collections.IEnumerator.MoveNext"]()) && e3["System.Collections.IEnumerator.MoveNext"]()) ? some(mapping(e1["System.Collections.Generic.IEnumerator`1.get_Current"](), e2["System.Collections.Generic.IEnumerator`1.get_Current"](), e3["System.Collections.Generic.IEnumerator`1.get_Current"]())) : undefined; }, (tupledArg_1) => { try { disposeSafe(tupledArg_1[0]); } finally { try { disposeSafe(tupledArg_1[1]); } finally { disposeSafe(tupledArg_1[2]); } } }); } export function readOnly(xs) { return map((x) => x, Operators_NullArgCheck("source", xs)); } export class CachedSeq$1 { constructor(cleanup, res) { this.cleanup = cleanup; this.res = res; } Dispose() { const _ = this; _.cleanup(); } GetEnumerator() { const _ = this; return getEnumerator(_.res); } [Symbol.iterator]() { return toIterator(getEnumerator(this)); } "System.Collections.IEnumerable.GetEnumerator"() { const _ = this; return getEnumerator(_.res); } } export function CachedSeq$1_$reflection(gen0) { return class_type("SeqModule.CachedSeq`1", [gen0], CachedSeq$1); } export function CachedSeq$1_$ctor_Z7A8347D4(cleanup, res) { return new CachedSeq$1(cleanup, res); } export function CachedSeq$1__Clear(_) { _.cleanup(); } export function cache(source) { const source_1 = Operators_NullArgCheck("source", source); const prefix = []; let enumeratorR = undefined; return CachedSeq$1_$ctor_Z7A8347D4(() => { Operators_Lock(prefix, () => { clear(prefix); let matchResult = undefined, e = undefined; if (enumeratorR != null) { if (value_1(enumeratorR) != null) { matchResult = 0; e = value_1(value_1(enumeratorR)); } else { matchResult = 1; } } else { matchResult = 1; } switch (matchResult) { case 0: { disposeSafe(e); break; } } enumeratorR = undefined; }); }, unfold((i_1) => Operators_Lock(prefix, () => { if (i_1 < prefix.length) { return [prefix[i_1], i_1 + 1]; } else { if (i_1 >= prefix.length) { let optEnumerator_2; if (enumeratorR != null) { optEnumerator_2 = value_1(enumeratorR); } else { const optEnumerator = getEnumerator(source_1); enumeratorR = some(optEnumerator); optEnumerator_2 = optEnumerator; } if (optEnumerator_2 == null) { } else { const enumerator = value_1(optEnumerator_2); if (enumerator["System.Collections.IEnumerator.MoveNext"]()) { void (prefix.push(enumerator["System.Collections.Generic.IEnumerator`1.get_Current"]())); } else { disposeSafe(enumerator); enumeratorR = some(undefined); } } } if (i_1 < prefix.length) { return [prefix[i_1], i_1 + 1]; } else { return undefined; } } }), 0)); } export function allPairs(xs, ys) { const ysCache = cache(ys); return delay(() => concat(map((x) => map((y) => [x, y], ysCache), xs))); } export function mapFold(mapping, state, xs) { const patternInput = mapFold_1(mapping, state, toArray(xs)); return [readOnly(patternInput[0]), patternInput[1]]; } export function mapFoldBack(mapping, xs, state) { const patternInput = mapFoldBack_1(mapping, toArray(xs), state); return [readOnly(patternInput[0]), patternInput[1]]; } export function tryPick(chooser, xs) { const e = ofSeq(xs); try { let res = undefined; while ((res == null) && e["System.Collections.IEnumerator.MoveNext"]()) { res = chooser(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } return res; } finally { disposeSafe(e); } } export function pick(chooser, xs) { const matchValue = tryPick(chooser, xs); if (matchValue == null) { return indexNotFound(); } else { return value_1(matchValue); } } export function reduce(folder, xs) { const e = ofSeq(xs); try { const loop = (acc_mut) => { loop: while (true) { const acc = acc_mut; if (e["System.Collections.IEnumerator.MoveNext"]()) { acc_mut = folder(acc, e["System.Collections.Generic.IEnumerator`1.get_Current"]()); continue loop; } else { return acc; } break; } }; if (e["System.Collections.IEnumerator.MoveNext"]()) { return loop(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } else { throw new Exception(SR_inputSequenceEmpty); } } finally { disposeSafe(e); } } export function reduceBack(folder, xs) { const arr = toArray(xs); if (arr.length > 0) { return arr.reduceRight(folder); } else { throw new Exception(SR_inputSequenceEmpty); } } export function replicate(n, x) { return initialize(n, (_arg) => x); } export function reverse(xs) { return delay(() => ofArray(reverse_1(toArray(xs)))); } export function scan(folder, state, xs) { return delay(() => { let acc = state; return concat([singleton(state), map((x) => { acc = folder(acc, x); return acc; }, xs)]); }); } export function scanBack(folder, xs, state) { return delay(() => ofArray(scanBack_1(folder, toArray(xs), state))); } export function skip(count, source) { return mkSeq(() => { const e = ofSeq(source); try { for (let _ = 1; _ <= count; _++) { if (!e["System.Collections.IEnumerator.MoveNext"]()) { throw new Exception((SR_notEnoughElements + "\\nParameter name: ") + "source"); } } return Enumerator_enumerateThenFinally(() => { }, e); } catch (matchValue) { disposeSafe(e); throw matchValue; } }); } export function skipWhile(predicate, xs) { return delay(() => { let skipped = true; return filter((x) => { if (skipped) { skipped = predicate(x); } return !skipped; }, xs); }); } export function tail(xs) { return skip(1, xs); } export function take(count, xs) { return generateIndexed(() => ofSeq(xs), (i, e) => { if (i < count) { if (e["System.Collections.IEnumerator.MoveNext"]()) { return some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } else { throw new Exception((SR_notEnoughElements + "\\nParameter name: ") + "source"); } } else { return undefined; } }, (e_1) => { disposeSafe(e_1); }); } export function takeWhile(predicate, xs) { return generate(() => ofSeq(xs), (e) => ((e["System.Collections.IEnumerator.MoveNext"]() && predicate(e["System.Collections.Generic.IEnumerator`1.get_Current"]())) ? some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()) : undefined), (e_1) => { disposeSafe(e_1); }); } export function truncate(count, xs) { return generateIndexed(() => ofSeq(xs), (i, e) => (((i < count) && e["System.Collections.IEnumerator.MoveNext"]()) ? some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()) : undefined), (e_1) => { disposeSafe(e_1); }); } 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 collect(mapping, xs) { return delay(() => concat(map(mapping, xs))); } export function where(predicate, xs) { return filter(predicate, xs); } export function pairwise(xs) { return delay(() => ofArray(pairwise_1(toArray(xs)))); } export function splitInto(chunks, xs) { return delay(() => ofArray(splitInto_1(chunks, toArray(xs)))); } export function windowed(windowSize, xs) { return delay(() => ofArray(windowed_1(windowSize, toArray(xs)))); } export function transpose(xss) { return delay(() => ofArray(map_1(ofArray, transpose_1(map_1(toArray, toArray(xss)))))); } export function sortWith(comparer, xs) { return delay(() => { 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); if (count === 0) { throw new Exception((SR_inputSequenceEmpty + "\\nParameter name: ") + "source"); } else { 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); if (count === 0) { throw new Exception((SR_inputSequenceEmpty + "\\nParameter name: ") + "source"); } else { return averager.DivideByInt(total, count); } } export function permute(f, xs) { return delay(() => ofArray(permute_1(f, toArray(xs)))); } export function chunkBySize(chunkSize, xs) { return delay(() => ofArray(chunkBySize_1(chunkSize, toArray(xs)))); } export function insertAt(index, y, xs) { let isDone = false; if (index < 0) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return generateIndexed(() => ofSeq(xs), (i, e) => { if ((isDone ? true : (i < index)) && e["System.Collections.IEnumerator.MoveNext"]()) { return some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } else if (i === index) { isDone = true; return some(y); } else { if (!isDone) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return undefined; } }, (e_1) => { disposeSafe(e_1); }); } export function insertManyAt(index, ys, xs) { let status = -1; if (index < 0) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return generateIndexed(() => [ofSeq(xs), ofSeq(ys)], (i, tupledArg) => { const e1 = tupledArg[0]; const e2 = tupledArg[1]; if (i === index) { status = 0; } let inserted; if (status === 0) { if (e2["System.Collections.IEnumerator.MoveNext"]()) { inserted = some(e2["System.Collections.Generic.IEnumerator`1.get_Current"]()); } else { status = 1; inserted = undefined; } } else { inserted = undefined; } if (inserted == null) { if (e1["System.Collections.IEnumerator.MoveNext"]()) { return some(e1["System.Collections.Generic.IEnumerator`1.get_Current"]()); } else { if (status < 1) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return undefined; } } else { return some(value_1(inserted)); } }, (tupledArg_1) => { disposeSafe(tupledArg_1[0]); disposeSafe(tupledArg_1[1]); }); } export function removeAt(index, xs) { let isDone = false; if (index < 0) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return generateIndexed(() => ofSeq(xs), (i, e) => { if ((isDone ? true : (i < index)) && e["System.Collections.IEnumerator.MoveNext"]()) { return some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } else if ((i === index) && e["System.Collections.IEnumerator.MoveNext"]()) { isDone = true; return e["System.Collections.IEnumerator.MoveNext"]() ? some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()) : undefined; } else { if (!isDone) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return undefined; } }, (e_1) => { disposeSafe(e_1); }); } export function removeManyAt(index, count, xs) { if (index < 0) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return generateIndexed(() => ofSeq(xs), (i, e) => { if (i < index) { if (e["System.Collections.IEnumerator.MoveNext"]()) { return some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } else { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } } else { if (i === index) { for (let _ = 1; _ <= count; _++) { if (!e["System.Collections.IEnumerator.MoveNext"]()) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "count"); } } } return e["System.Collections.IEnumerator.MoveNext"]() ? some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()) : undefined; } }, (e_1) => { disposeSafe(e_1); }); } export function updateAt(index, y, xs) { let isDone = false; if (index < 0) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return generateIndexed(() => ofSeq(xs), (i, e) => { if ((isDone ? true : (i < index)) && e["System.Collections.IEnumerator.MoveNext"]()) { return some(e["System.Collections.Generic.IEnumerator`1.get_Current"]()); } else if ((i === index) && e["System.Collections.IEnumerator.MoveNext"]()) { isDone = true; return some(y); } else { if (!isDone) { throw new Exception((SR_indexOutOfBounds + "\\nParameter name: ") + "index"); } return undefined; } }, (e_1) => { disposeSafe(e_1); }); }