UNPKG

cullender

Version:

A simple and composable way to filter data.

167 lines (137 loc) 3.9 kB
/*! * cullender v0.5.2 * (c) 2018-present Vitor Cavalcanti <vitorluizc@outlook.com> (https://vitorluizc.github.io) * Released under the MIT License. */ import uncouple from 'uncouple'; import normalize from 'normalize-text'; /** * Not filter. * @template T * @param {function(T, number, T[]): boolean} filter * @returns {function(T, number, T[]): boolean} */ var not = (function (filter) { return function () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return !filter.apply(void 0, args); } }); /** * Default function. * @template T * @param {T} value * @returns {T} */ var DEFAULT_Λ = function (value) { return value; }; var ref = uncouple(Array.prototype); var includes = ref.includes; /** * Check if value is into a list. * @template T * @param {Array.<T>} list * @param {function(T, number, T[]): *} λ * @returns {function(T, number, T[]): boolean} */ var into = (function (list, λ) { if ( λ === void 0 ) λ = DEFAULT_Λ; return function () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return includes(list, λ.apply(void 0, args)); } }); var ref$1 = uncouple(Array.prototype); var every = ref$1.every; var ref$1$1 = uncouple(String.prototype); var split = ref$1$1.split; var includes$1 = ref$1$1.includes; /** * Search term. * @param {string} into * @returns {function(string):boolean} */ var searchTerm = function (into) { return function (term) { return includes$1(into, term); }; }; /** * Search. * @param {string} into * @param {(string|Array.<string>)} terms * @returns {boolean} */ var search = function (into, terms) { return every(terms, searchTerm(into)); }; /** * @template T * @param {string} text * @param {function(T, number, T[]): (string|Array.<string>)} λ * @returns {function(T, number, T[]): boolean} */ var search$1 = (function (text, λ) { if ( λ === void 0 ) λ = DEFAULT_Λ; return function () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; var into = normalize(λ.apply(void 0, args)); var terms = split(normalize(text), ' '); var result = search(into, terms); return result; }; }); /** * Check if value is truthy. * @template T * @param {function(T, number, T[]): *} λ * @returns {function(T, number, T[]): boolean} */ var truthy = (function (λ) { if ( λ === void 0 ) λ = DEFAULT_Λ; return function () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; return !!λ.apply(void 0, args); } }); var filters = /*#__PURE__*/Object.freeze({ not: not, into: into, search: search$1, truthy: truthy }); var ref$2 = uncouple(Array.prototype); var some = ref$2.some; var every$1 = ref$2.every; var filter = ref$2.filter; var reduce = ref$2.reduce; /** * Create a filter as result of other filter functions composition. * @param {('AND'|'OR')} type * @param {...Filter} λs * @returns {Filter} */ var create = function (type) { var λs = [], len = arguments.length - 1; while ( len-- > 0 ) λs[ len ] = arguments[ len + 1 ]; return function () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; var check = type === 'AND' ? every$1 : some; var result = check(λs, function (λ) { return λ.apply(void 0, args); }); return result; }; }; /** * Filter list using filter functions. Each filter refines the result. * @template T * @param {Iterable.<T>} list * @param {...Filter} λs * @returns {T[]} */ var cull = function (list) { var λs = [], len = arguments.length - 1; while ( len-- > 0 ) λs[ len ] = arguments[ len + 1 ]; var result = reduce(λs, filter, [].concat( list )); return result; }; var index = { create: create, cull: cull, filters: filters }; export default index; export { filters, create, cull };