flow import { $$asyncIterator , getAsyncIterator } from 'iterall' ; type PromiseOrValue < T > = T | Promise < T > ; /**
 * Given an AsyncIterable and a callback function, return an AsyncIterator
 * which produces values mapped via calling the callback function.
 */ export default function mapAsyncIterator < T , U > ( iterable , callback , rejectCallback ? ) { const iterator = getAsyncIterator ( iterable ) ; let $return ; let abruptClose ; if ( typeof iterator . return === 'function' ) { $return = iterator . return ; abruptClose = ( error ) => { const rethrow = ( ) => Promise . reject ( error ) ; return $return . call ( iterator ) . then ( rethrow , rethrow ) ; } ; } function mapResult ( result ) { return result . done ? result : asyncMapValue ( result . value , callback ) . then ( iteratorResult , abruptClose ) ; } let mapReject ; if ( rejectCallback ) { const reject = rejectCallback ; mapReject = ( error ) => asyncMapValue ( error , reject ) . then ( iteratorResult , abruptClose ) ; } const mappedIterator = { next ( ) { return iterator . next ( ) . then ( mapResult , mapReject ) ; } , return ( ) { return $return ? $return . call ( iterator ) . then ( mapResult , mapReject ) : Promise . resolve ( { value : undefined , done : true } ) ; } , throw ( error ) { if ( typeof iterator . throw === 'function' ) { return iterator . throw ( error ) . then ( mapResult , mapReject ) ; } return Promise . reject ( error ) . catch ( abruptClose ) ; } , [ $$asyncIterator ] ( ) { return this ; } , } ; return mappedIterator ; } function asyncMapValue < T , U > ( value , callback ) { return new Promise ( resolve => resolve ( callback ( value ) ) ) ; } function iteratorResult < T > ( value ) { return { value , done : false } ; }