code: function extendIterablePrototype(prototype, exclude = []) {
      // always exclude the constructor
      exclude.push("constructor");
      let ex = exports.Collection.from(exclude);
      // check for conflicts
      let patchProperties = [];
      for (let key of Object.getOwnPropertyNames(Object.getPrototypeOf(exports.Collection.empty))) {
          if (!key.startsWith('_') && !ex.contains(key) && __isFunction(exports.Collection.empty[key])) {
              if (key in prototype) {
                  throw new Error(`The method "${key}" already exists on the "${prototype.constructor && prototype.constructor.name}" prototype. ` +
                      `Use the exclude parameter to patch without this method.`);
              }
              else {
                  patchProperties.push(key);
              }
          }
      }
      // path prototype
      for (let key of patchProperties) {
          prototype[key] = function (...args) {
              let collection = exports.Collection.from(this);
              return collection[key].call(collection, ...args);
          };
      }
  }
docs: Extends the given prototype to have quick access to all collection methods.
  
  @param prototype Prototype to be patched.
  @param exclude List of method names to exclude from patching.
  @throws Will throw an error if a method would be overwritten.
  
  @see {@link extendNativeTypes} to extend Javascript's native iterables.