File: dynamic-queue.js

package info (click to toggle)
node-tad 3.1.1%2B~cs11.22.49-1
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 3,400 kB
  • sloc: javascript: 25,549; makefile: 6
file content (54 lines) | stat: -rw-r--r-- 1,487 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
// Dynamic queue handler
// Allows to create a promise queue, where new promises can be added to queue until last promise in
// a queue resolves. Queue promise resolves with `undefined` value, when last promises resolves.

"use strict";

var aFrom          = require("es5-ext/array/from")
  , ensureIterable = require("es5-ext/iterable/validate-object")
  , assign         = require("es5-ext/object/assign")
  , deferred       = require("./deferred")
  , isPromise      = require("./is-promise")
  , assimilate     = require("./assimilate");

var DynamicQueue;

module.exports = DynamicQueue = function (list) {
	if (!(this instanceof DynamicQueue)) return new DynamicQueue(list);
	list = aFrom(ensureIterable(list));

	assign(this, deferred());
	list.every(this.add, this);
	if (!this.waiting) {
		this.resolve();
		return null;
	}
	this.initialized = true;
	return null;
};

DynamicQueue.prototype = {
	waiting: 0,
	initialized: false,
	add: function (value) {
		if (this.promise.resolved) throw new Error("Queue was already resolved");
		++this.waiting;
		value = assimilate(value);
		if (isPromise(value)) {
			if (!value.resolved) {
				value.done(this._processValue.bind(this), this.reject);
				return true;
			}
			if (value.failed) {
				this.reject(value.value);
				return false;
			}
		}
		return this._processValue();
	},
	_processValue: function () {
		if (this.promise.resolved) return null;
		if (!--this.waiting && this.initialized) this.resolve();
		return true;
	}
};