Source: list/filter.js

import curry2 from "../function/curry2";
import path from "../object/path";
import _objectFilter from "../internals/_objectFilter";
import _stringFilter from "../internals/_stringFilter";

/**
 * Filters the elements of an array, object or string
 * and returns a new array, object or string respectively.
 *
 * @param {function} func
 * @param {array|string|object} list
 * @returns {array|string|object}
 */
const filter = (func, list) => {
  if (typeof path("filter", list) === "function") {
    return list.filter(func);
  }

  if (typeof list === "object") {
    return _objectFilter(func, list);
  }

  if (typeof list === "string") {
    return _stringFilter(func, list);
  }

  throw new Error("Argument is not filterable.");
};

export default curry2(filter);