| 
							
								 | 
							
							var streamify = require('./streamify.js')
 | 
						
						
						
						
							 | 
							
								 | 
							
							  , defer     = require('./defer.js')
 | 
						
						
						
						
							 | 
							
								 | 
							
							  ;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							// API
 | 
						
						
						
						
							 | 
							
								 | 
							
							module.exports = ReadableAsyncKit;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							/**
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Base constructor for all streams
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * used to hold properties/methods
 | 
						
						
						
						
							 | 
							
								 | 
							
							 */
 | 
						
						
						
						
							 | 
							
								 | 
							
							function ReadableAsyncKit()
 | 
						
						
						
						
							 | 
							
								 | 
							
							{
 | 
						
						
						
						
							 | 
							
								 | 
							
							  ReadableAsyncKit.super_.apply(this, arguments);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  // list of active jobs
 | 
						
						
						
						
							 | 
							
								 | 
							
							  this.jobs = {};
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  // add stream methods
 | 
						
						
						
						
							 | 
							
								 | 
							
							  this.destroy = destroy;
 | 
						
						
						
						
							 | 
							
								 | 
							
							  this._start  = _start;
 | 
						
						
						
						
							 | 
							
								 | 
							
							  this._read   = _read;
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							/**
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Destroys readable stream,
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * by aborting outstanding jobs
 | 
						
						
						
						
							 | 
							
								 | 
							
							 *
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * @returns {void}
 | 
						
						
						
						
							 | 
							
								 | 
							
							 */
 | 
						
						
						
						
							 | 
							
								 | 
							
							function destroy()
 | 
						
						
						
						
							 | 
							
								 | 
							
							{
 | 
						
						
						
						
							 | 
							
								 | 
							
							  if (this.destroyed)
 | 
						
						
						
						
							 | 
							
								 | 
							
							  {
 | 
						
						
						
						
							 | 
							
								 | 
							
							    return;
 | 
						
						
						
						
							 | 
							
								 | 
							
							  }
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  this.destroyed = true;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  if (typeof this.terminator == 'function')
 | 
						
						
						
						
							 | 
							
								 | 
							
							  {
 | 
						
						
						
						
							 | 
							
								 | 
							
							    this.terminator();
 | 
						
						
						
						
							 | 
							
								 | 
							
							  }
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							/**
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Starts provided jobs in async manner
 | 
						
						
						
						
							 | 
							
								 | 
							
							 *
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * @private
 | 
						
						
						
						
							 | 
							
								 | 
							
							 */
 | 
						
						
						
						
							 | 
							
								 | 
							
							function _start()
 | 
						
						
						
						
							 | 
							
								 | 
							
							{
 | 
						
						
						
						
							 | 
							
								 | 
							
							  // first argument – runner function
 | 
						
						
						
						
							 | 
							
								 | 
							
							  var runner = arguments[0]
 | 
						
						
						
						
							 | 
							
								 | 
							
							    // take away first argument
 | 
						
						
						
						
							 | 
							
								 | 
							
							    , args   = Array.prototype.slice.call(arguments, 1)
 | 
						
						
						
						
							 | 
							
								 | 
							
							      // second argument - input data
 | 
						
						
						
						
							 | 
							
								 | 
							
							    , input  = args[0]
 | 
						
						
						
						
							 | 
							
								 | 
							
							      // last argument - result callback
 | 
						
						
						
						
							 | 
							
								 | 
							
							    , endCb  = streamify.callback.call(this, args[args.length - 1])
 | 
						
						
						
						
							 | 
							
								 | 
							
							    ;
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  args[args.length - 1] = endCb;
 | 
						
						
						
						
							 | 
							
								 | 
							
							  // third argument - iterator
 | 
						
						
						
						
							 | 
							
								 | 
							
							  args[1] = streamify.iterator.call(this, args[1]);
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							  // allow time for proper setup
 | 
						
						
						
						
							 | 
							
								 | 
							
							  defer(function()
 | 
						
						
						
						
							 | 
							
								 | 
							
							  {
 | 
						
						
						
						
							 | 
							
								 | 
							
							    if (!this.destroyed)
 | 
						
						
						
						
							 | 
							
								 | 
							
							    {
 | 
						
						
						
						
							 | 
							
								 | 
							
							      this.terminator = runner.apply(null, args);
 | 
						
						
						
						
							 | 
							
								 | 
							
							    }
 | 
						
						
						
						
							 | 
							
								 | 
							
							    else
 | 
						
						
						
						
							 | 
							
								 | 
							
							    {
 | 
						
						
						
						
							 | 
							
								 | 
							
							      endCb(null, Array.isArray(input) ? [] : {});
 | 
						
						
						
						
							 | 
							
								 | 
							
							    }
 | 
						
						
						
						
							 | 
							
								 | 
							
							  }.bind(this));
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							/**
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Implement _read to comply with Readable streams
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * Doesn't really make sense for flowing object mode
 | 
						
						
						
						
							 | 
							
								 | 
							
							 *
 | 
						
						
						
						
							 | 
							
								 | 
							
							 * @private
 | 
						
						
						
						
							 | 
							
								 | 
							
							 */
 | 
						
						
						
						
							 | 
							
								 | 
							
							function _read()
 | 
						
						
						
						
							 | 
							
								 | 
							
							{
 | 
						
						
						
						
							 | 
							
								 | 
							
							
 | 
						
						
						
						
							 | 
							
								 | 
							
							}
 |