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() {

}