UNPKG

@zkochan/pnpm

Version:

Fast, disk space efficient package manager

69 lines (55 loc) 1.6 kB
/** @license MIT License (c) copyright 2010-2014 original author or authors */ /** @author Brian Cavalier */ /** @author John Hann */ import Stream from '../Stream' import * as base from '@most/prelude' /** * Compute a stream using an *async* generator, which yields promises * to control event times. * @param f * @returns {Stream} */ export function generate (f /*, ...args */) { return new Stream(new GenerateSource(f, base.tail(arguments))) } function GenerateSource (f, args) { this.f = f this.args = args } GenerateSource.prototype.run = function (sink, scheduler) { return new Generate(this.f.apply(void 0, this.args), sink, scheduler) } function Generate (iterator, sink, scheduler) { this.iterator = iterator this.sink = sink this.scheduler = scheduler this.active = true var self = this function err (e) { self.sink.error(self.scheduler.now(), e) } Promise.resolve(this).then(next).catch(err) } function next (generate, x) { return generate.active ? handle(generate, generate.iterator.next(x)) : x } function handle (generate, result) { if (result.done) { return generate.sink.end(generate.scheduler.now(), result.value) } return Promise.resolve(result.value).then(function (x) { return emit(generate, x) }, function (e) { return error(generate, e) }) } function emit (generate, x) { generate.sink.event(generate.scheduler.now(), x) return next(generate, x) } function error (generate, e) { return handle(generate, generate.iterator.throw(e)) } Generate.prototype.dispose = function () { this.active = false }