cullender
Version:
A simple and composable way to filter data.
167 lines (137 loc) • 3.9 kB
JavaScript
/*!
* 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 };