/** * Module dependencies. */ var Receiver = require('./receiver') /** * Expose `async`. */ module.exports = async /** * Add value to channel via node-style async function. * * @param {Function} channel * @param {Function|Object} fn async function or object with async method * @param {String} method name only if fn is an object * @param {mixed} args async function arguments without callback * @return {Function} thunk */ function async(ch, fn/*, args...*/) { var args = [].slice.call(arguments, 2) var receiver = new Receiver() var context = null if (typeof fn === 'object') { context = fn fn = fn[args.shift()] } args.push(function (err, val) { if (arguments.length > 2) { val = [].slice.call(arguments, 1) } ch(err, val)(function (err) { receiver[err ? 'error' : 'add'](err) }) }) fn.apply(context, args) return function (cb) { receiver.callback(cb) } }