neo4jmapper src/lib/sequence.js

    Source

    // from: https://github.com/coolaj86/futures
    ;(function() {
    
      function isSequence(obj) {
        return obj instanceof Sequence;
      }
    
      function Sequence(global_context) {
        var self = this,
          waiting = true,
          data,
          stack = [];
    
        if (!isSequence(this)) {
          return new Sequence(global_context);
        }
    
        global_context = global_context || null;
    
        function next() {
          var args = Array.prototype.slice.call(arguments),
            seq = stack.shift(); // BUG this will eventually leak
    
          data = arguments;
    
          if (!seq) {
            // the chain has ended (for now)
            waiting = true;
            return;
          }
    
          args.unshift(next);
          seq.callback.apply(seq._context, args);
        }
    
        function then(callback, context) {
          if ('function' !== typeof callback) {
            throw new Error("`Sequence().then(callback [context])` requires that `callback` be a function and that `context` be `null`, an object, or a function");
          }
          stack.push({
            callback: callback,
            _context: (null === context ? null : context || global_context),
            index: stack.length
          });
    
          // if the chain has stopped, start it back up
          if (waiting) {
            waiting = false;
            next.apply(null, data);
          }
    
          return self;
        }
    
        self.next = next;
        self.then = then;
      }
    
      function createSequence(context) {
        // TODO use prototype instead of new
        return (new Sequence(context));
      }
      Sequence.create = createSequence;
      Sequence.isSequence = isSequence;
    
      if (typeof window === 'object')
        window.Sequence = Sequence;
      else
        module.exports = Sequence;
        
    })();