| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | /*! * ee-first * Copyright(c) 2014 Jonathan Ong * MIT Licensed */'use strict'/** * Module exports. * @public */module.exports = first/** * Get the first event in a set of event emitters and event pairs. * * @param {array} stuff * @param {function} done * @public */function first(stuff, done) {  if (!Array.isArray(stuff))    throw new TypeError('arg must be an array of [ee, events...] arrays')  var cleanups = []  for (var i = 0; i < stuff.length; i++) {    var arr = stuff[i]    if (!Array.isArray(arr) || arr.length < 2)      throw new TypeError('each array member must be [ee, events...]')    var ee = arr[0]    for (var j = 1; j < arr.length; j++) {      var event = arr[j]      var fn = listener(event, callback)      // listen to the event      ee.on(event, fn)      // push this listener to the list of cleanups      cleanups.push({        ee: ee,        event: event,        fn: fn,      })    }  }  function callback() {    cleanup()    done.apply(null, arguments)  }  function cleanup() {    var x    for (var i = 0; i < cleanups.length; i++) {      x = cleanups[i]      x.ee.removeListener(x.event, x.fn)    }  }  function thunk(fn) {    done = fn  }  thunk.cancel = cleanup  return thunk}/** * Create the event listener. * @private */function listener(event, done) {  return function onevent(arg1) {    var args = new Array(arguments.length)    var ee = this    var err = event === 'error'      ? arg1      : null    // copy args to prevent arguments escaping scope    for (var i = 0; i < args.length; i++) {      args[i] = arguments[i]    }    done(err, ee, event, args)  }}
 |