sink
Version:
Untangle async code
21 lines (18 loc) • 647 B
text/coffeescript
(window? or exports).q = q = (func, args..., cb) ->
(q.callbacks or= []).push ->
call func, args, cb, (cb, results) ->
[callbacks, q.callbacks] = [q.callbacks,[null]]
cb results...
q.callbacks = q.callbacks[1..].concat callbacks[1..]
q.callbacks[0]?()
q.callbacks[0]() if q.callbacks.length == 1
q.parallel = (body) ->
parallel = (done) -> body (func, args..., cb) ->
q.i = (q.i or 0) + 1
call func, args, cb, (cb, results) ->
cb results...
done() if --q.i == 0
q parallel, ->
call = (func, args, cb, body) ->
if cb then func args..., (results...) -> body cb, results
else body func