@whatwg-node/promise-helpers
Advanced tools
Comparing version 0.0.1-rc-20250225130235-f3faf70dd8b2a9fa9fe1a17b9e580f4224f1b1ba to 0.0.1-rc-20250225131025-bfb95392bc8913516b467bc4f9debffaf9e06cc1
@@ -10,2 +10,3 @@ "use strict"; | ||
exports.mapMaybePromise = mapMaybePromise; | ||
exports.mapAsyncIterator = mapAsyncIterator; | ||
function isPromise(value) { | ||
@@ -131,1 +132,71 @@ return value?.then != null; | ||
} | ||
/** | ||
* Given an AsyncIterable and a callback function, return an AsyncIterator | ||
* which produces values mapped via calling the callback function. | ||
*/ | ||
function mapAsyncIterator(iterator, onNext, onError, onEnd) { | ||
if (Symbol.asyncIterator in iterator) { | ||
iterator = iterator[Symbol.asyncIterator](); | ||
} | ||
let $return; | ||
let abruptClose; | ||
let onEndWithValue; | ||
if (onEnd) { | ||
let onEndWithValueResult /** R in onEndWithValue */; | ||
onEndWithValue = value => { | ||
onEndWithValueResult ||= handleMaybePromise(onEnd, () => value, () => value); | ||
return onEndWithValueResult; | ||
}; | ||
} | ||
if (typeof iterator.return === 'function') { | ||
$return = iterator.return; | ||
abruptClose = (error) => { | ||
const rethrow = () => { | ||
throw error; | ||
}; | ||
return $return.call(iterator).then(rethrow, rethrow); | ||
}; | ||
} | ||
function mapResult(result) { | ||
if (result.done) { | ||
return onEndWithValue ? onEndWithValue(result) : result; | ||
} | ||
return handleMaybePromise(() => result.value, value => handleMaybePromise(() => onNext(value), iteratorResult, abruptClose)); | ||
} | ||
let mapReject; | ||
if (onError) { | ||
let onErrorResult; | ||
// Capture rejectCallback to ensure it cannot be null. | ||
const reject = onError; | ||
mapReject = (error) => { | ||
onErrorResult ||= handleMaybePromise(() => error, error => handleMaybePromise(() => reject(error), iteratorResult, abruptClose)); | ||
return onErrorResult; | ||
}; | ||
} | ||
return { | ||
next() { | ||
return iterator.next().then(mapResult, mapReject); | ||
}, | ||
return() { | ||
const res$ = $return | ||
? $return.call(iterator).then(mapResult, mapReject) | ||
: fakePromise({ value: undefined, done: true }); | ||
return onEndWithValue ? res$.then(onEndWithValue) : res$; | ||
}, | ||
throw(error) { | ||
if (typeof iterator.throw === 'function') { | ||
return iterator.throw(error).then(mapResult, mapReject); | ||
} | ||
if (abruptClose) { | ||
return abruptClose(error); | ||
} | ||
return fakeRejectPromise(error); | ||
}, | ||
[Symbol.asyncIterator]() { | ||
return this; | ||
}, | ||
}; | ||
} | ||
function iteratorResult(value) { | ||
return { value, done: false }; | ||
} |
@@ -121,1 +121,71 @@ export function isPromise(value) { | ||
} | ||
/** | ||
* Given an AsyncIterable and a callback function, return an AsyncIterator | ||
* which produces values mapped via calling the callback function. | ||
*/ | ||
export function mapAsyncIterator(iterator, onNext, onError, onEnd) { | ||
if (Symbol.asyncIterator in iterator) { | ||
iterator = iterator[Symbol.asyncIterator](); | ||
} | ||
let $return; | ||
let abruptClose; | ||
let onEndWithValue; | ||
if (onEnd) { | ||
let onEndWithValueResult /** R in onEndWithValue */; | ||
onEndWithValue = value => { | ||
onEndWithValueResult ||= handleMaybePromise(onEnd, () => value, () => value); | ||
return onEndWithValueResult; | ||
}; | ||
} | ||
if (typeof iterator.return === 'function') { | ||
$return = iterator.return; | ||
abruptClose = (error) => { | ||
const rethrow = () => { | ||
throw error; | ||
}; | ||
return $return.call(iterator).then(rethrow, rethrow); | ||
}; | ||
} | ||
function mapResult(result) { | ||
if (result.done) { | ||
return onEndWithValue ? onEndWithValue(result) : result; | ||
} | ||
return handleMaybePromise(() => result.value, value => handleMaybePromise(() => onNext(value), iteratorResult, abruptClose)); | ||
} | ||
let mapReject; | ||
if (onError) { | ||
let onErrorResult; | ||
// Capture rejectCallback to ensure it cannot be null. | ||
const reject = onError; | ||
mapReject = (error) => { | ||
onErrorResult ||= handleMaybePromise(() => error, error => handleMaybePromise(() => reject(error), iteratorResult, abruptClose)); | ||
return onErrorResult; | ||
}; | ||
} | ||
return { | ||
next() { | ||
return iterator.next().then(mapResult, mapReject); | ||
}, | ||
return() { | ||
const res$ = $return | ||
? $return.call(iterator).then(mapResult, mapReject) | ||
: fakePromise({ value: undefined, done: true }); | ||
return onEndWithValue ? res$.then(onEndWithValue) : res$; | ||
}, | ||
throw(error) { | ||
if (typeof iterator.throw === 'function') { | ||
return iterator.throw(error).then(mapResult, mapReject); | ||
} | ||
if (abruptClose) { | ||
return abruptClose(error); | ||
} | ||
return fakeRejectPromise(error); | ||
}, | ||
[Symbol.asyncIterator]() { | ||
return this; | ||
}, | ||
}; | ||
} | ||
function iteratorResult(value) { | ||
return { value, done: false }; | ||
} |
{ | ||
"name": "@whatwg-node/promise-helpers", | ||
"version": "0.0.1-rc-20250225130235-f3faf70dd8b2a9fa9fe1a17b9e580f4224f1b1ba", | ||
"version": "0.0.1-rc-20250225131025-bfb95392bc8913516b467bc4f9debffaf9e06cc1", | ||
"description": "Promise helpers", | ||
@@ -5,0 +5,0 @@ "sideEffects": false, |
@@ -22,1 +22,6 @@ export type MaybePromise<T> = Promise<T> | T; | ||
export declare function mapMaybePromise<TInput, TOutput>(input: MaybePromiseLike<TInput>, onSuccess: (value: TInput) => MaybePromiseLike<TOutput>, onError?: (err: any) => MaybePromiseLike<TOutput>): MaybePromiseLike<TOutput>; | ||
/** | ||
* Given an AsyncIterable and a callback function, return an AsyncIterator | ||
* which produces values mapped via calling the callback function. | ||
*/ | ||
export declare function mapAsyncIterator<T, U>(iterator: AsyncIterable<T> | AsyncIterator<T>, onNext: (value: T) => MaybePromise<U>, onError?: any, onEnd?: () => MaybePromise<void>): AsyncIterableIterator<U>; |
Sorry, the diff of this file is not supported yet
17167
416