var Q = require("./q"); module.exports = Queue; function Queue() { var ends = Q.defer(); var closed = Q.defer(); return { put: function (value) { var next = Q.defer(); ends.resolve({ head: value, tail: next.promise }); ends.resolve = next.resolve; }, get: function () { var result = ends.promise.get("head"); ends.promise = ends.promise.get("tail"); return result.fail(function (error) { closed.resolve(error); throw error; }); }, closed: closed.promise, close: function (error) { error = error || new Error("Can't get value from closed queue"); var end = {head: Q.reject(error)}; end.tail = end; ends.resolve(end); return closed.promise; } }; }