1 | (function() {
|
2 | var create, createFake,
|
3 | slice = [].slice;
|
4 |
|
5 | exports.create = create = function(cb) {
|
6 | var children, complete, completed, opened, savedArgs, savedErr;
|
7 | opened = false;
|
8 | completed = false;
|
9 | children = 0;
|
10 | savedErr = false;
|
11 | savedArgs = [];
|
12 | complete = function() {
|
13 | var args, isErr;
|
14 | isErr = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : [];
|
15 | completed = true;
|
16 | savedErr = isErr;
|
17 | savedArgs = args;
|
18 | if (children === 0) {
|
19 | return cb.apply(null, [isErr].concat(slice.call(args)));
|
20 | }
|
21 | };
|
22 | return {
|
23 | error: function() {
|
24 | var args;
|
25 | args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
26 | if (completed || opened) {
|
27 | return;
|
28 | }
|
29 | return complete.apply(null, [true].concat(slice.call(args)));
|
30 | },
|
31 | open: function() {
|
32 | if (completed) {
|
33 | return;
|
34 | }
|
35 | return opened = true;
|
36 | },
|
37 | close: function() {
|
38 | var args;
|
39 | args = 1 <= arguments.length ? slice.call(arguments, 0) : [];
|
40 | if (completed) {
|
41 | return;
|
42 | }
|
43 | return complete.apply(null, [false].concat(slice.call(args)));
|
44 | },
|
45 | branch: function() {
|
46 | var child;
|
47 | if (completed || !opened) {
|
48 | return createFake();
|
49 | }
|
50 | ++children;
|
51 | child = create(function(isErr) {
|
52 | --children;
|
53 | savedErr = savedErr || isErr;
|
54 | if (completed && children === 0) {
|
55 | return cb.apply(null, [savedErr].concat(slice.call(savedArgs)));
|
56 | }
|
57 | });
|
58 | return child;
|
59 | }
|
60 | };
|
61 | };
|
62 |
|
63 | createFake = function() {
|
64 | return {
|
65 | error: function() {},
|
66 | open: function() {},
|
67 | close: function() {},
|
68 | branch: function() {
|
69 | return createFake();
|
70 | }
|
71 | };
|
72 | };
|
73 |
|
74 | }).call(this);
|