function _createReduce(arrayReduce, methodReduce, iterableReduce) {
    return function _reduce(xf, acc, list) {
      if (_isArrayLike(list)) {
        return arrayReduce(xf, acc, list);
      }
      if (list == null) {
        return acc;
      }
      if (typeof list['fantasy-land/reduce'] === 'function') {
        return methodReduce(xf, acc, list, 'fantasy-land/reduce');
      }
      if (list[symIterator] != null) {
        return iterableReduce(xf, acc, list[symIterator]());
      }
      if (typeof list.next === 'function') {
        return iterableReduce(xf, acc, list);
      }
      if (typeof list.reduce === 'function') {
        return methodReduce(xf, acc, list, 'reduce');
      }
      throw new TypeError('reduce: list must be array or iterable');
    };
  }
Tests whether or not an object is similar to an array.

@private
@category Type
@category List
@sig * -> Boolean
@param {*} x The object to test.
@return {Boolean} `true` if `x` has a numeric length property and extreme indices defined; `false` otherwise.
@example

     _isArrayLike([]); //=> true
     _isArrayLike(true); //=> false
     _isArrayLike({}); //=> false
     _isArrayLike({length: 10}); //=> false
     _isArrayLike({0: 'zero', 9: 'nine', length: 10}); //=> true
     _isArrayLike({nodeType: 1, length: 1}) // => false