Skip to content

Instantly share code, notes, and snippets.

@VitorLuizC
Last active October 31, 2017 21:52
Show Gist options
  • Save VitorLuizC/3d8c828664ac8393b38c5f6e2e509289 to your computer and use it in GitHub Desktop.
Save VitorLuizC/3d8c828664ac8393b38c5f6e2e509289 to your computer and use it in GitHub Desktop.
Cullender
/**
* @typedef {function(T, number, T[]):boolean} Filter
* @template T
*/
/**
* @param {T} value
* @returns {T}
* @template T
*/
const DEFAULT_Λ = (value) => value
/**
* @param {function(T, number, T[]):*} [λ]
* @returns {Filter}
* @template T
*/
export const truthy = (λ = DEFAULT_Λ) => (...args) => !!λ(...args)
/**
* @param {string} value
* @param {function(T, number, T[]):string} [λ]
* @returns {Filter}
* @template T
*/
export const includes = (value, λ = DEFAULT_Λ) => (...args) => {
const isIncluded = λ(...args).toLowerCase().includes(value.toLowerCase())
return isIncluded;
}
/**
* @param {...number}
* @returns {Filter}
*/
export const indexes = (...indexes) => (_, index) => indexes.includes(index)
/**
* @typedef {function(T, number, T[]):boolean} Filter
* @template T
*/
/**
* @param {...Filter} filters
* @returns {function(T[]):T[]}
* @template T
*/
export const cull = (...filters) => (items) => {
const result = filters.reduce((items, filter) => items.filter(filter), [...items])
return result
}
/**
* @param {...Filter} filters
* @returns {Filter}
*/
export const merge = (...filters) => {
const filter = (...args) => filters.every((filter) => filter(...args))
return filter
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment