docs: function defineSequenceType(base, name, overrides) {
      /** @constructor */
      var ctor = function ctor() {};
  
      // Make this type inherit from the specified base.
      ctor.prototype = new base();
  
      // Attach overrides to the new sequence type's prototype.
      for (var override in overrides) {
        ctor.prototype[override] = overrides[override];
      }
  
      // Define a factory method that sets the new sequence's parent to the caller
      // and (optionally) applies any additional initialization logic.
      // Expose this as a chainable method so that we can do:
      // Lazy(...).map(...).filter(...).blah(...);
      var factory = function factory() {
        var sequence = new ctor();
  
        // Every sequence needs a reference to its parent in order to work.
        sequence.parent = this;
  
        // If a custom init function was supplied, call it now.
        if (sequence.init) {
          sequence.init.apply(sequence, arguments);
        }
  
        return sequence;
      };
  
      var methodNames = typeof name === 'string' ? [name] : name;
      for (var i = 0; i < methodNames.length; ++i) {
        base.prototype[methodNames[i]] = factory;
      }
  
      return ctor;
    }