@softwareventures/async-iterable
Version:
Pure functional AsyncIterable traversal
827 lines • 26.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.asyncContains = exports.asyncIndexFn = exports.asyncIndex = exports.asyncFold1Fn = exports.asyncFold1 = exports.asyncFoldFn = exports.asyncFold = exports.asyncRemoveFirstFn = exports.asyncRemoveFirst = exports.asyncRemoveFn = exports.asyncRemove = exports.asyncExcludeFirstFn = exports.asyncExcludeFirst = exports.asyncExcludeNull = exports.asyncExcludeFn = exports.asyncExclude = exports.asyncFilterFn = exports.asyncFilter = exports.asyncMapFn = exports.asyncMap = exports.asyncPrefixMatchFn = exports.asyncPrefixMatch = exports.asyncNotEqualFn = exports.asyncNotEqual = exports.asyncEqualFn = exports.asyncEqual = exports.asyncDropUntilFn = exports.asyncDropUntil = exports.asyncDropWhile = exports.asyncTakeUntilFn = exports.asyncTakeUntil = exports.asyncTakeWhileFn = exports.asyncTakeWhile = exports.asyncDropFn = exports.asyncDrop = exports.asyncTakeFn = exports.asyncTake = exports.asyncNotEmpty = exports.asyncEmpty = exports.asyncOnly = exports.asyncLast = exports.asyncInitial = exports.asyncUnshiftFn = exports.asyncUnshift = exports.asyncPushFn = exports.asyncPush = exports.asyncTail = exports.asyncFirst = exports.asyncToSet = exports.asyncToArray = void 0;
exports.asyncMapKeyLastByFn = exports.asyncMapKeyLastBy = exports.asyncMapKeyFirstByFn = exports.asyncMapKeyFirstBy = exports.asyncMapKeyByFn = exports.asyncMapKeyBy = exports.asyncKeyLastByFn = exports.asyncKeyLastBy = exports.asyncKeyFirstByFn = exports.asyncKeyFirstBy = exports.asyncKeyByFn = exports.asyncKeyBy = exports.asyncZipStrict = exports.asyncZipFn = exports.asyncZip = exports.asyncScan1 = exports.asyncScanFn = exports.asyncScan = exports.asyncNoneNull = exports.asyncConcatMapFn = exports.asyncConcatMap = exports.asyncAppend = exports.asyncPrepend = exports.asyncConcat = exports.asyncAll = exports.asyncAny = exports.asyncOr = exports.asyncAnd = exports.asyncAverage = exports.asyncProduct = exports.asyncSum = exports.asyncMinimumByFn = exports.asyncMinimumBy = exports.asyncMinimumFn = exports.asyncMinimum = exports.asyncMaximumByFn = exports.asyncMaximumBy = exports.asyncMaximumFn = exports.asyncMaximum = exports.asyncFindFn = exports.asyncFind = exports.asyncFindIndexFn = exports.asyncFindIndex = exports.asyncIndexOfFn = exports.asyncIndexOf = exports.asyncContainsFn = void 0;
exports.asyncIterable = asyncIterable;
exports.asyncIterator = asyncIterator;
exports.isAsyncIterable = isAsyncIterable;
exports.toArray = toArray;
exports.toSet = toSet;
exports.first = first;
exports.tail = tail;
exports.push = push;
exports.pushFn = pushFn;
exports.unshift = unshift;
exports.unshiftFn = unshiftFn;
exports.initial = initial;
exports.last = last;
exports.only = only;
exports.empty = empty;
exports.notEmpty = notEmpty;
exports.slice = slice;
exports.take = take;
exports.takeFn = takeFn;
exports.drop = drop;
exports.dropFn = dropFn;
exports.takeWhile = takeWhile;
exports.takeWhileFn = takeWhileFn;
exports.takeUntil = takeUntil;
exports.takeUntilFn = takeUntilFn;
exports.dropWhile = dropWhile;
exports.dropWhileFn = dropWhileFn;
exports.dropUntil = dropUntil;
exports.dropUntilFn = dropUntilFn;
exports.equal = equal;
exports.equalFn = equalFn;
exports.notEqual = notEqual;
exports.notEqualFn = notEqualFn;
exports.prefixMatch = prefixMatch;
exports.prefixMatchFn = prefixMatchFn;
exports.map = map;
exports.mapFn = mapFn;
exports.filter = filter;
exports.filterFn = filterFn;
exports.exclude = exclude;
exports.excludeFn = excludeFn;
exports.excludeNull = excludeNull;
exports.excludeFirst = excludeFirst;
exports.excludeFirstFn = excludeFirstFn;
exports.remove = remove;
exports.removeFn = removeFn;
exports.removeFirst = removeFirst;
exports.removeFirstFn = removeFirstFn;
exports.fold = fold;
exports.foldFn = foldFn;
exports.fold1 = fold1;
exports.fold1Fn = fold1Fn;
exports.index = index;
exports.indexFn = indexFn;
exports.contains = contains;
exports.containsFn = containsFn;
exports.indexOf = indexOf;
exports.indexOfFn = indexOfFn;
exports.findIndex = findIndex;
exports.findIndexFn = findIndexFn;
exports.find = find;
exports.findFn = findFn;
exports.maximum = maximum;
exports.maximumFn = maximumFn;
exports.maximumBy = maximumBy;
exports.maximumByFn = maximumByFn;
exports.minimum = minimum;
exports.minimumFn = minimumFn;
exports.minimumBy = minimumBy;
exports.minimumByFn = minimumByFn;
exports.sum = sum;
exports.product = product;
exports.average = average;
exports.and = and;
exports.or = or;
exports.any = any;
exports.all = all;
exports.concat = concat;
exports.prepend = prepend;
exports.append = append;
exports.concatMap = concatMap;
exports.concatMapFn = concatMapFn;
exports.noneNull = noneNull;
exports.scan = scan;
exports.scanFn = scanFn;
exports.scan1 = scan1;
exports.scan1Fn = scan1Fn;
exports.pairwise = pairwise;
exports.zip = zip;
exports.zipFn = zipFn;
exports.zipStrict = zipStrict;
exports.zipStrictFn = zipStrictFn;
exports.keyBy = keyBy;
exports.keyByFn = keyByFn;
exports.keyFirstBy = keyFirstBy;
exports.keyFirstByFn = keyFirstByFn;
exports.keyLastBy = keyLastBy;
exports.keyLastByFn = keyLastByFn;
exports.mapKeyBy = mapKeyBy;
exports.mapKeyByFn = mapKeyByFn;
exports.mapKeyFirstBy = mapKeyFirstBy;
exports.mapKeyFirstByFn = mapKeyFirstByFn;
exports.mapKeyLastBy = mapKeyLastBy;
exports.mapKeyLastByFn = mapKeyLastByFn;
const ordered_1 = require("@softwareventures/ordered");
const nullable_1 = require("@softwareventures/nullable");
async function* asyncIterable(iterable) {
for await (const element of await iterable) {
yield element;
}
}
function asyncIterator(iterable) {
return asyncIterable(iterable)[Symbol.asyncIterator]();
}
function isAsyncIterable(value) {
return typeof value === "object" && value != null && Symbol.asyncIterator in value;
}
async function toArray(iterable) {
const array = [];
for await (const element of await iterable) {
array.push(element);
}
return array;
}
exports.asyncToArray = toArray;
async function toSet(iterable) {
const set = new Set();
for await (const element of await iterable) {
set.add(element);
}
return set;
}
exports.asyncToSet = toSet;
async function first(iterable) {
const result = await asyncIterator(iterable).next();
return result.done === true ? null : result.value;
}
exports.asyncFirst = first;
async function* tail(iterable) {
const iterator = asyncIterator(iterable);
await iterator.next();
let element = await iterator.next();
while (element.done !== true) {
yield element.value;
element = await iterator.next();
}
}
exports.asyncTail = tail;
async function* push(iterable, value) {
for await (const element of await iterable) {
yield element;
}
yield await value;
}
exports.asyncPush = push;
function pushFn(value) {
return iterable => push(iterable, value);
}
exports.asyncPushFn = pushFn;
async function* unshift(iterable, value) {
yield await value;
for await (const element of await iterable) {
yield element;
}
}
exports.asyncUnshift = unshift;
function unshiftFn(value) {
return iterable => unshift(iterable, value);
}
exports.asyncUnshiftFn = unshiftFn;
async function* initial(iterable) {
const iterator = asyncIterator(iterable);
let prev = await iterator.next();
let element = prev.done === true ? prev : await iterator.next();
while (element.done !== true) {
yield prev.value;
prev = element;
element = await iterator.next();
}
}
exports.asyncInitial = initial;
async function last(iterable) {
let last = null;
for await (const element of await iterable) {
last = element;
}
return last;
}
exports.asyncLast = last;
async function only(iterable) {
const iterator = asyncIterator(iterable);
const first = await iterator.next();
return !(first.done ?? false) && ((await iterator.next()).done ?? false) ? first.value : null;
}
exports.asyncOnly = only;
async function empty(iterable) {
return (await asyncIterator(iterable).next()).done === true;
}
exports.asyncEmpty = empty;
async function notEmpty(iterable) {
return !(await empty(iterable));
}
exports.asyncNotEmpty = notEmpty;
async function* slice(iterable, start = 0, end = Infinity) {
const s = await start;
const e = await end;
if (e === s) {
return;
}
const iterator = asyncIterator(iterable);
let element = await iterator.next();
for (let i = 0; i < s && element.done !== true; ++i) {
element = await iterator.next();
}
for (let i = s; i < e && element.done !== true; ++i) {
yield element.value;
element = await iterator.next();
}
}
async function* take(iterable, count) {
const c = await count;
if (c === 0) {
return;
}
let i = 0;
for await (const element of await iterable) {
yield element;
if (++i >= c) {
return;
}
}
}
exports.asyncTake = take;
function takeFn(count) {
return iterable => take(iterable, count);
}
exports.asyncTakeFn = takeFn;
async function* drop(iterable, count) {
const iterator = asyncIterator(iterable);
const c = await count;
let element = await iterator.next();
for (let i = 0; i < c && element.done !== true; ++i) {
element = await iterator.next();
}
while (element.done !== true) {
yield element.value;
element = await iterator.next();
}
}
exports.asyncDrop = drop;
function dropFn(count) {
return iterable => drop(iterable, count);
}
exports.asyncDropFn = dropFn;
async function* takeWhile(iterable, predicate) {
let i = 0;
for await (const element of await iterable) {
if (!(await predicate(element, i))) {
return;
}
yield element;
++i;
}
}
exports.asyncTakeWhile = takeWhile;
function takeWhileFn(predicate) {
return iterable => takeWhile(iterable, predicate);
}
exports.asyncTakeWhileFn = takeWhileFn;
function takeUntil(iterable, predicate) {
return takeWhile(iterable, async (element, index) => !(await predicate(element, index)));
}
exports.asyncTakeUntil = takeUntil;
function takeUntilFn(predicate) {
return iterable => takeUntil(iterable, predicate);
}
exports.asyncTakeUntilFn = takeUntilFn;
async function* dropWhile(iterable, predicate) {
const iterator = asyncIterator(iterable);
let element = await iterator.next();
for (let i = 0; element.done !== true && (await predicate(element.value, i)); ++i) {
element = await iterator.next();
}
while (element.done !== true) {
yield element.value;
element = await iterator.next();
}
}
exports.asyncDropWhile = dropWhile;
function dropWhileFn(predicate) {
return iterable => dropWhile(iterable, predicate);
}
function dropUntil(iterable, predicate) {
return dropWhile(iterable, async (element, index) => !(await predicate(element, index)));
}
exports.asyncDropUntil = dropUntil;
function dropUntilFn(predicate) {
return iterable => dropUntil(iterable, predicate);
}
exports.asyncDropUntilFn = dropUntilFn;
async function equal(a, b, elementsEqual = ordered_1.equal) {
const ait = asyncIterator(a);
const bit = asyncIterator(b);
let ar = await ait.next();
let br = await bit.next();
while (ar.done !== true && br.done !== true) {
if (!(await elementsEqual(ar.value, br.value))) {
return false;
}
ar = await ait.next();
br = await bit.next();
}
return (ar.done ?? false) && (br.done ?? false);
}
exports.asyncEqual = equal;
function equalFn(b, elementsEqual = ordered_1.equal) {
return async (a) => equal(a, b, elementsEqual);
}
exports.asyncEqualFn = equalFn;
async function notEqual(a, b, elementsEqual = ordered_1.equal) {
return !(await equal(a, b, elementsEqual));
}
exports.asyncNotEqual = notEqual;
function notEqualFn(b, elementsEqual = ordered_1.equal) {
return async (a) => notEqual(a, b, elementsEqual);
}
exports.asyncNotEqualFn = notEqualFn;
async function prefixMatch(a, b, elementsEqual = ordered_1.equal) {
const ait = asyncIterator(a);
const bit = asyncIterator(b);
let ar = await ait.next();
let br = await bit.next();
while (ar.done !== true && br.done !== true) {
if (!(await elementsEqual(ar.value, br.value))) {
return false;
}
ar = await ait.next();
br = await bit.next();
}
return br.done ?? false;
}
exports.asyncPrefixMatch = prefixMatch;
function prefixMatchFn(b, elementsEqual = ordered_1.equal) {
return async (a) => prefixMatch(a, b, elementsEqual);
}
exports.asyncPrefixMatchFn = prefixMatchFn;
async function* map(iterable, f) {
let i = 0;
for await (const element of await iterable) {
yield await f(element, i++);
}
}
exports.asyncMap = map;
function mapFn(f) {
return iterable => map(iterable, f);
}
exports.asyncMapFn = mapFn;
async function* filter(iterable, predicate) {
let i = 0;
for await (const element of await iterable) {
if (await predicate(element, i++)) {
yield element;
}
}
}
exports.asyncFilter = filter;
function filterFn(predicate) {
return iterable => filter(iterable, predicate);
}
exports.asyncFilterFn = filterFn;
function exclude(iterable, predicate) {
return filter(iterable, async (element, index) => !(await predicate(element, index)));
}
exports.asyncExclude = exclude;
function excludeFn(predicate) {
return iterable => exclude(iterable, predicate);
}
exports.asyncExcludeFn = exclude;
function excludeNull(iterable) {
return filter(iterable, nullable_1.isNotNull);
}
exports.asyncExcludeNull = excludeNull;
async function* excludeFirst(iterable, predicate) {
const iterator = asyncIterator(iterable);
let element = await iterator.next();
for (let i = 0; element.done !== true; ++i) {
if (await predicate(element.value, i)) {
break;
}
yield element.value;
element = await iterator.next();
}
if (element.done !== true) {
element = await iterator.next();
}
while (element.done !== true) {
yield element.value;
element = await iterator.next();
}
}
exports.asyncExcludeFirst = excludeFirst;
function excludeFirstFn(predicate) {
return iterable => excludeFirst(iterable, predicate);
}
exports.asyncExcludeFirstFn = excludeFirstFn;
function remove(iterable, value) {
return exclude(iterable, element => element === value);
}
exports.asyncRemove = remove;
function removeFn(value) {
return iterable => remove(iterable, value);
}
exports.asyncRemoveFn = removeFn;
function removeFirst(iterable, value) {
return excludeFirst(iterable, element => element === value);
}
exports.asyncRemoveFirst = removeFirst;
function removeFirstFn(value) {
return iterable => removeFirst(iterable, value);
}
exports.asyncRemoveFirstFn = removeFirstFn;
async function fold(iterable, f, initial) {
let accumulator = initial;
let i = 0;
for await (const element of await iterable) {
accumulator = await f(accumulator, element, i++);
}
return accumulator;
}
exports.asyncFold = fold;
function foldFn(f, initial) {
return async (iterable) => fold(iterable, f, initial);
}
exports.asyncFoldFn = foldFn;
async function fold1(iterable, f) {
const iterator = asyncIterator(iterable);
let element = await iterator.next();
if (element.done === true) {
throw new TypeError("fold1: empty AsyncIterable");
}
let accumulator = element.value;
let i = 1;
element = await iterator.next();
while (element.done !== true) {
accumulator = await f(accumulator, element.value, i++);
element = await iterator.next();
}
return accumulator;
}
exports.asyncFold1 = fold1;
function fold1Fn(f) {
return async (iterable) => fold1(iterable, f);
}
exports.asyncFold1Fn = fold1Fn;
async function index(iterable, index) {
if (index < 0 || !isFinite(index) || Math.floor(index) !== index) {
throw new RangeError("illegal index");
}
let i = 0;
for await (const element of await iterable) {
if (i++ === index) {
return element;
}
}
return null;
}
exports.asyncIndex = index;
function indexFn(index) {
return async (iterable) => (0, exports.asyncIndex)(iterable, index);
}
exports.asyncIndexFn = indexFn;
async function contains(iterable, value) {
for await (const element of await iterable) {
if (element === value) {
return true;
}
}
return false;
}
exports.asyncContains = contains;
function containsFn(value) {
return async (iterable) => contains(iterable, value);
}
exports.asyncContainsFn = containsFn;
async function indexOf(iterable, value) {
let i = 0;
for await (const element of await iterable) {
if (element === value) {
return i;
}
++i;
}
return null;
}
exports.asyncIndexOf = indexOf;
function indexOfFn(value) {
return async (iterable) => indexOf(iterable, value);
}
exports.asyncIndexOfFn = indexOfFn;
async function findIndex(iterable, predicate) {
let i = 0;
for await (const element of await iterable) {
if (await predicate(element, i)) {
return i;
}
++i;
}
return null;
}
exports.asyncFindIndex = findIndex;
function findIndexFn(predicate) {
return async (iterable) => findIndex(iterable, predicate);
}
exports.asyncFindIndexFn = findIndexFn;
async function find(iterable, predicate) {
let i = 0;
for await (const element of await iterable) {
if (await predicate(element, i++)) {
return element;
}
}
return null;
}
exports.asyncFind = find;
function findFn(predicate) {
return async (iterable) => find(iterable, predicate);
}
exports.asyncFindFn = findFn;
async function maximum(iterable, compare) {
return internalMaximum(iterable, compare ?? ordered_1.compare);
}
exports.asyncMaximum = maximum;
function maximumFn(compare) {
return async (iterable) => maximum(iterable, compare);
}
exports.asyncMaximumFn = maximumFn;
async function internalMaximum(iterable, compare) {
const iterator = asyncIterator(iterable);
let element = await iterator.next();
if (element.done === true) {
return null;
}
let max = element.value;
element = await iterator.next();
while (element.done !== true) {
if (compare(element.value, max) > ordered_1.Comparison.equal) {
max = element.value;
}
element = await iterator.next();
}
return max;
}
async function maximumBy(iterable, select) {
const iterator = asyncIterator(iterable);
let element = await iterator.next();
if (element.done === true) {
return null;
}
let max = element.value;
let maxBy = await select(element.value, 0);
let i = 0;
element = await iterator.next();
while (element.done !== true) {
const by = await select(element.value, i++);
if (by > maxBy) {
max = element.value;
maxBy = by;
}
element = await iterator.next();
}
return max;
}
exports.asyncMaximumBy = maximumBy;
function maximumByFn(select) {
return async (iterable) => maximumBy(iterable, select);
}
exports.asyncMaximumByFn = maximumByFn;
async function minimum(iterable, compare) {
return internalMaximum(iterable, (0, ordered_1.reverse)(compare ?? ordered_1.compare));
}
exports.asyncMinimum = minimum;
function minimumFn(compare) {
return async (iterable) => minimum(iterable, compare);
}
exports.asyncMinimumFn = minimumFn;
async function minimumBy(iterable, select) {
return maximumBy(iterable, async (element, index) => -(await select(element, index)));
}
exports.asyncMinimumBy = minimumBy;
function minimumByFn(select) {
return async (iterable) => minimumBy(iterable, select);
}
exports.asyncMinimumByFn = minimumByFn;
async function sum(iterable) {
return fold(iterable, (sum, element) => sum + element, 0);
}
exports.asyncSum = sum;
async function product(iterable) {
return fold(iterable, (product, element) => product * element, 1);
}
exports.asyncProduct = product;
async function average(iterable) {
const [sum, count] = await fold(iterable, ([sum], element, index) => [sum + element, index + 1], [0, 0]);
return count === 0 ? null : sum / count;
}
exports.asyncAverage = average;
async function and(iterable) {
return (await findIndex(iterable, element => !element)) == null;
}
exports.asyncAnd = and;
async function or(iterable) {
return (await findIndex(iterable, Boolean)) != null;
}
exports.asyncOr = or;
async function any(iterable, predicate) {
return (await findIndex(iterable, predicate)) != null;
}
exports.asyncAny = any;
async function all(iterable, predicate) {
return ((await findIndex(iterable, async (element, index) => !(await predicate(element, index)))) ==
null);
}
exports.asyncAll = all;
async function* concat(iterables) {
for await (const iterable of await iterables) {
for await (const element of iterable) {
yield element;
}
}
}
exports.asyncConcat = concat;
function prepend(a) {
return b => concat([a, b]);
}
exports.asyncPrepend = prepend;
function append(b) {
return a => concat([a, b]);
}
exports.asyncAppend = append;
function concatMap(iterable, f) {
return concat(map(iterable, f));
}
exports.asyncConcatMap = concatMap;
function concatMapFn(f) {
return iterable => concatMap(iterable, f);
}
exports.asyncConcatMapFn = concatMapFn;
async function noneNull(iterable) {
const result = [];
for await (const element of await iterable) {
if (element == null) {
return null;
}
result.push(element);
}
return result;
}
exports.asyncNoneNull = noneNull;
async function* scan(iterable, f, initial) {
let i = 0;
let accumulator = initial;
for await (const element of await iterable) {
yield (accumulator = await f(accumulator, element, i++));
}
}
exports.asyncScan = scan;
function scanFn(f, initial) {
return iterable => scan(iterable, f, initial);
}
exports.asyncScanFn = scanFn;
async function* scan1(iterable, f) {
const iterator = asyncIterator(iterable);
let element = await iterator.next();
if (element.done === true) {
return;
}
let accumulator = element.value;
yield accumulator;
let i = 1;
element = await iterator.next();
while (element.done !== true) {
yield (accumulator = await f(accumulator, element.value, i++));
element = await iterator.next();
}
}
exports.asyncScan1 = scan1;
function scan1Fn(f) {
return iterable => scan1(iterable, f);
}
async function* pairwise(iterable) {
const iterator = asyncIterator(iterable);
let prev = await iterator.next();
if (prev.done === true) {
return;
}
let element = await iterator.next();
while (element.done !== true) {
yield [prev.value, element.value];
prev = element;
element = await iterator.next();
}
}
function zip(a, b) {
return zipInternal(a, b);
}
exports.asyncZip = zip;
function zipFn(b) {
return a => zip(a, b);
}
exports.asyncZipFn = zipFn;
function zipStrict(a, b) {
return zipInternal(a, b, true);
}
exports.asyncZipStrict = zipStrict;
function zipStrictFn(b) {
return a => zipStrict(a, b);
}
async function* zipInternal(a, b, strict = false) {
const ait = asyncIterator(a);
const bit = asyncIterator(b);
let ar = await ait.next();
let br = await bit.next();
while (ar.done !== true && br.done !== true) {
yield [ar.value, br.value];
ar = await ait.next();
br = await bit.next();
}
if (strict && (ar.done !== true || br.done !== true)) {
throw new RangeError("zipStrict: Iterables have different lengths");
}
}
async function keyBy(iterable, f) {
const map = new Map();
let i = 0;
for await (const element of await iterable) {
const key = f(element, i++);
const group = map.get(key) ?? [];
group.push(element);
map.set(key, group);
}
return map;
}
exports.asyncKeyBy = keyBy;
function keyByFn(f) {
return async (iterable) => keyBy(iterable, f);
}
exports.asyncKeyByFn = keyByFn;
async function keyFirstBy(iterable, f) {
const map = new Map();
let i = 0;
for await (const element of await iterable) {
const key = f(element, i++);
if (!map.has(key)) {
map.set(key, element);
}
}
return map;
}
exports.asyncKeyFirstBy = keyFirstBy;
function keyFirstByFn(f) {
return async (iterable) => keyFirstBy(iterable, f);
}
exports.asyncKeyFirstByFn = keyFirstByFn;
async function keyLastBy(iterable, f) {
const map = new Map();
let i = 0;
for await (const element of await iterable) {
map.set(f(element, i++), element);
}
return map;
}
exports.asyncKeyLastBy = keyLastBy;
function keyLastByFn(f) {
return async (iterable) => keyLastBy(iterable, f);
}
exports.asyncKeyLastByFn = keyLastByFn;
async function mapKeyBy(iterable, f) {
const map = new Map();
let i = 0;
for await (const element of await iterable) {
const [key, value] = await f(element, i++);
const group = map.get(key) ?? [];
group.push(value);
map.set(key, group);
}
return map;
}
exports.asyncMapKeyBy = mapKeyBy;
function mapKeyByFn(f) {
return async (iterable) => mapKeyBy(iterable, f);
}
exports.asyncMapKeyByFn = mapKeyByFn;
async function mapKeyFirstBy(iterable, f) {
const map = new Map();
let i = 0;
for await (const element of await iterable) {
const [key, value] = await f(element, i++);
if (!map.has(key)) {
map.set(key, value);
}
}
return map;
}
exports.asyncMapKeyFirstBy = mapKeyFirstBy;
function mapKeyFirstByFn(f) {
return async (iterable) => mapKeyFirstBy(iterable, f);
}
exports.asyncMapKeyFirstByFn = mapKeyFirstByFn;
async function mapKeyLastBy(iterable, f) {
const map = new Map();
let i = 0;
for await (const element of await iterable) {
const [key, value] = await f(element, i++);
map.set(key, value);
}
return map;
}
exports.asyncMapKeyLastBy = mapKeyLastBy;
function mapKeyLastByFn(f) {
return async (iterable) => mapKeyLastBy(iterable, f);
}
exports.asyncMapKeyLastByFn = mapKeyLastByFn;
//# sourceMappingURL=index.js.map