foop
Version:
interfaces that describe their intentions.
67 lines (63 loc) • 7.12 kB
JavaScript
var EMPTY_ARRAY = require('../native/EMPTY_ARRAY')
var isArray = require('../is/array')
var isString = require('../is/stringPrimitive')
var toRegExp = require('../cast/toRegExp')
var toFunction = require('../cast/toFunction')
var pipe = require('../fp/pipe')
var curry = require('../fp/curry')
var invoke = require('../fp/invoke')
var lengthMinusOne = require('../util/lengthMinusOne')
var split = require('../string/split')
// @TODO could have `method` for curring with .flip .invoke
// const filter = invoke('_', 'filter')
/**
* @desc getIncludesCount, how many times a needle occurrs in a haystack
*
* @since 5.0.0-beta.4
* @alias occurrs
* @alias getIncludesCount
*
* @curried 2
*
* @param {string | Array} haystack haystack to look in
* @param {string | Matchable} needle needle to find
* @return {number} occurrs/includes times/count
*
* {@link https://github.com/ramda/ramda/blob/master/src/countBy.js ramda-count-by}
* {@link https://github.com/jashkenas/underscore/blob/master/underscore.js#L459 underscore-count-by}
* {@link https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf#Finding_all_the_occurrences_of_an_element mozilla-array-occurrences}
* {@link https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf#Using_indexOf()_to_count_occurrences_of_a_letter_in_a_string mozilla-occurrences}
* @see {@link mozilla-occurrences}
* @see {@link mozilla-array-occurrences}
* @see {@link underscore-count-by}
* @see {@link ramda-count-by}
*
* @example
*
* getIncludesCount('1 00 1', '1') //=> 2
* getIncludesCount([1, 1, 0, 0], 1) //=> 2
* getIncludesCount([0], 1) //=> 0
* getIncludesCount('', 1) //=> 0
* getIncludesCount(null, 1) //=> 0
*
*/
function getIncludesCount(haystack, needle) {
if (isString(haystack)) {
// return haystack.split(needle)
return split(haystack, needle)
}
else if (isArray(haystack)) {
// @TODO this disables ternary ability
// const matcher = toRegExp(needle).test
// return haystack.filter(toRegExp(needle))
return haystack.filter(toFunction(toRegExp(needle)))
}
// may not be needed...
else {
return EMPTY_ARRAY
}
}
// curry for 2 args, pipe result through to .length - 1
var getIncludesThenLength = pipe(getIncludesCount, lengthMinusOne)
module.exports = curry(2, getIncludesThenLength)
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5jbHVkZXNDb3VudC5qcyIsInNvdXJjZXMiOlsiaW5jbHVkZXNDb3VudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBFTVBUWV9BUlJBWSA9IHJlcXVpcmUoJy4uL25hdGl2ZS9FTVBUWV9BUlJBWScpXG5jb25zdCBpc0FycmF5ID0gcmVxdWlyZSgnLi4vaXMvYXJyYXknKVxuY29uc3QgaXNTdHJpbmcgPSByZXF1aXJlKCcuLi9pcy9zdHJpbmdQcmltaXRpdmUnKVxuY29uc3QgdG9SZWdFeHAgPSByZXF1aXJlKCcuLi9jYXN0L3RvUmVnRXhwJylcbmNvbnN0IHRvRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9jYXN0L3RvRnVuY3Rpb24nKVxuY29uc3QgcGlwZSA9IHJlcXVpcmUoJy4uL2ZwL3BpcGUnKVxuY29uc3QgY3VycnkgPSByZXF1aXJlKCcuLi9mcC9jdXJyeScpXG5jb25zdCBpbnZva2UgPSByZXF1aXJlKCcuLi9mcC9pbnZva2UnKVxuY29uc3QgbGVuZ3RoTWludXNPbmUgPSByZXF1aXJlKCcuLi91dGlsL2xlbmd0aE1pbnVzT25lJylcbmNvbnN0IHNwbGl0ID0gcmVxdWlyZSgnLi4vc3RyaW5nL3NwbGl0JylcblxuLy8gQFRPRE8gY291bGQgaGF2ZSBgbWV0aG9kYCBmb3IgY3VycmluZyB3aXRoIC5mbGlwIC5pbnZva2Vcbi8vIGNvbnN0IGZpbHRlciA9IGludm9rZSgnXycsICdmaWx0ZXInKVxuXG4vKipcbiAqIEBkZXNjIGdldEluY2x1ZGVzQ291bnQsIGhvdyBtYW55IHRpbWVzIGEgbmVlZGxlIG9jY3VycnMgaW4gYSBoYXlzdGFja1xuICpcbiAqIEBzaW5jZSA1LjAuMC1iZXRhLjRcbiAqIEBhbGlhcyBvY2N1cnJzXG4gKiBAYWxpYXMgZ2V0SW5jbHVkZXNDb3VudFxuICpcbiAqIEBjdXJyaWVkIDJcbiAqXG4gKiBAcGFyYW0gIHtzdHJpbmcgfCBBcnJheX0gaGF5c3RhY2sgaGF5c3RhY2sgdG8gbG9vayBpblxuICogQHBhcmFtICB7c3RyaW5nIHwgTWF0Y2hhYmxlfSBuZWVkbGUgbmVlZGxlIHRvIGZpbmRcbiAqIEByZXR1cm4ge251bWJlcn0gb2NjdXJycy9pbmNsdWRlcyB0aW1lcy9jb3VudFxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vcmFtZGEvcmFtZGEvYmxvYi9tYXN0ZXIvc3JjL2NvdW50QnkuanMgcmFtZGEtY291bnQtYnl9XG4gKiB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL2phc2hrZW5hcy91bmRlcnNjb3JlL2Jsb2IvbWFzdGVyL3VuZGVyc2NvcmUuanMjTDQ1OSB1bmRlcnNjb3JlLWNvdW50LWJ5fVxuICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2luZGV4T2YjRmluZGluZ19hbGxfdGhlX29jY3VycmVuY2VzX29mX2FuX2VsZW1lbnQgbW96aWxsYS1hcnJheS1vY2N1cnJlbmNlc31cbiAqIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TdHJpbmcvaW5kZXhPZiNVc2luZ19pbmRleE9mKClfdG9fY291bnRfb2NjdXJyZW5jZXNfb2ZfYV9sZXR0ZXJfaW5fYV9zdHJpbmcgbW96aWxsYS1vY2N1cnJlbmNlc31cbiAqIEBzZWUge0BsaW5rIG1vemlsbGEtb2NjdXJyZW5jZXN9XG4gKiBAc2VlIHtAbGluayBtb3ppbGxhLWFycmF5LW9jY3VycmVuY2VzfVxuICogQHNlZSB7QGxpbmsgdW5kZXJzY29yZS1jb3VudC1ieX1cbiAqIEBzZWUge0BsaW5rIHJhbWRhLWNvdW50LWJ5fVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogIGdldEluY2x1ZGVzQ291bnQoJzEgMDAgMScsICcxJykgLy89PiAyXG4gKiAgZ2V0SW5jbHVkZXNDb3VudChbMSwgMSwgMCwgMF0sIDEpIC8vPT4gMlxuICogIGdldEluY2x1ZGVzQ291bnQoWzBdLCAxKSAvLz0+IDBcbiAqICBnZXRJbmNsdWRlc0NvdW50KCcnLCAxKSAvLz0+IDBcbiAqICBnZXRJbmNsdWRlc0NvdW50KG51bGwsIDEpIC8vPT4gMFxuICpcbiAqL1xuZnVuY3Rpb24gZ2V0SW5jbHVkZXNDb3VudChoYXlzdGFjaywgbmVlZGxlKSB7XG4gIGlmIChpc1N0cmluZyhoYXlzdGFjaykpIHtcbiAgICAvLyByZXR1cm4gaGF5c3RhY2suc3BsaXQobmVlZGxlKVxuICAgIHJldHVybiBzcGxpdChoYXlzdGFjaywgbmVlZGxlKVxuICB9XG4gIGVsc2UgaWYgKGlzQXJyYXkoaGF5c3RhY2spKSB7XG4gICAgLy8gQFRPRE8gdGhpcyBkaXNhYmxlcyB0ZXJuYXJ5IGFiaWxpdHlcbiAgICAvLyBjb25zdCBtYXRjaGVyID0gdG9SZWdFeHAobmVlZGxlKS50ZXN0XG4gICAgLy8gcmV0dXJuIGhheXN0YWNrLmZpbHRlcih0b1JlZ0V4cChuZWVkbGUpKVxuICAgIHJldHVybiBoYXlzdGFjay5maWx0ZXIodG9GdW5jdGlvbih0b1JlZ0V4cChuZWVkbGUpKSlcbiAgfVxuICAvLyBtYXkgbm90IGJlIG5lZWRlZC4uLlxuICBlbHNlIHtcbiAgICByZXR1cm4gRU1QVFlfQVJSQVlcbiAgfVxufVxuXG4vLyBjdXJyeSBmb3IgMiBhcmdzLCBwaXBlIHJlc3VsdCB0aHJvdWdoIHRvIC5sZW5ndGggLSAxXG5jb25zdCBnZXRJbmNsdWRlc1RoZW5MZW5ndGggPSBwaXBlKGdldEluY2x1ZGVzQ291bnQsIGxlbmd0aE1pbnVzT25lKVxubW9kdWxlLmV4cG9ydHMgPSBjdXJyeSgyLCBnZXRJbmNsdWRlc1RoZW5MZW5ndGgpXG4iXSwibmFtZXMiOlsiY29uc3QiXSwibWFwcGluZ3MiOiJBQUFBQSxHQUFLLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztBQUNwREEsR0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0FBQ3RDQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQztBQUNqREEsR0FBSyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUM7QUFDNUNBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDO0FBQ2hEQSxHQUFLLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUM7QUFDbENBLEdBQUssQ0FBQyxLQUFLLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztBQUNwQ0EsR0FBSyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDO0FBQ3RDQSxHQUFLLENBQUMsY0FBYyxHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQztBQUN4REEsR0FBSyxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9DeEMsU0FBUyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFO0VBQzFDLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFOztJQUV0QixPQUFPLEtBQUssQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO0dBQy9CO09BQ0ksSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7Ozs7SUFJMUIsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztHQUNyRDs7T0FFSTtJQUNILE9BQU8sV0FBVztHQUNuQjtDQUNGOzs7QUFHREEsR0FBSyxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQUM7QUFDcEUsTUFBTSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixDQUFDOyJ9