Skip to content

Instantly share code, notes, and snippets.

@mattpodwysocki
Created June 2, 2017 21:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mattpodwysocki/fcc5f4071e821cfc4e4de88e488c5baf to your computer and use it in GitHub Desktop.
Save mattpodwysocki/fcc5f4071e821cfc4e4de88e488c5baf to your computer and use it in GitHub Desktop.
'use strict';
import { AsyncIterableX } from '../asynciterable';
import { bindCallback } from '../internal/bindcallback';
class MapAsyncIterable<TSource, TResult> extends AsyncIterableX<TResult> {
private _source: AsyncIterable<TSource>;
private _selector: (value: TSource, index: number) => Promise<TResult> | TResult;
constructor(
source: AsyncIterable<TSource>,
selector: (value: TSource, index: number) => Promise<TResult> | TResult) {
super();
this._source = source;
this._selector = selector;
}
async *[Symbol.asyncIterator]() {
let i = 0;
for await (let item of <AsyncIterable<TSource>>(this._source)) {
let result = await this._selector(item, i++);
yield result;
}
}
}
export function map<TSource, TResult>(
source: AsyncIterable<TSource>,
selector: (value: TSource, index: number) => Promise<TResult> | TResult,
thisArg?: any): AsyncIterableX<TResult> {
return new MapAsyncIterable<TSource, TResult>(source, bindCallback(selector, thisArg, 2));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment