code: function isImplemented(obj, protocol) {
    if (obj == null) {
      return false;
    }
    switch (protocol) {
      case 'iterator':
        return isFunction(obj[protocols.iterator] || obj.next);
      case 'reduced':
      case 'value':
        return protocols[protocol] in obj;
      default:
        return isFunction(obj[protocols[protocol]]);
    }
  }
docs: Determines whether an object implements a given protocol. Generally, a protocol is implemented if the object has a
  function property with the name of that protocol (as given in the protocol object). For iteration, it's accepted that
  an object with a `next` function is also an iterator, so we make a specific check for that.
  
  For the reduced and value protocols, the requirement that the property be a function is waived.
  
  @private
  
  @param {*} obj The value to be checked to see if it implements a protocol.
  @param {string} protocol The short name of the protocol, as reflected in {@link module:xduce.protocols|protocols}.
  This is one of `iterator`, `init`, `step`, `result`, `reduced`, or `value`.
  @return {boolean} Either `true` if the value implements the protocol or `false` if it does not.