code: function _dispatchable(methodname, xf, fn) {
          return function () {
              var length = arguments.length;
              if (length === 0) {
                  return fn();
              }
              var obj = arguments[length - 1];
              if (!_isArray(obj)) {
                  var args = _slice(arguments, 0, length - 1);
                  if (typeof obj[methodname] === 'function') {
                      return obj[methodname].apply(obj, args);
                  }
                  if (_isTransformer(obj)) {
                      var transducer = xf.apply(null, args);
                      return transducer(obj);
                  }
              }
              return fn.apply(this, arguments);
          };
      }
docs: Returns a function that dispatches with different strategies based on the
  object in list position (last argument). If it is an array, executes [fn].
  Otherwise, if it has a function with [methodname], it will execute that
  function (functor case). Otherwise, if it is a transformer, uses transducer
  [xf] to return a new transformer (transducer case). Otherwise, it will
  default to executing [fn].
  
  @private
  @param {String} methodname property to check for a custom implementation
  @param {Function} xf transducer to initialize if object is transformer
  @param {Function} fn default ramda implementation
  @return {Function} A function that dispatches on object in list position