UNPKG

1.88 kBJavaScriptView Raw
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);