UNPKG

foop

Version:

interfaces that describe their intentions.

173 lines (172 loc) 13.3 kB
/** @ignore 🚧 wip */ // https://stackoverflow.com/questions/33234666/how-to-map-reduce-filter-a-set-in-javascript // var _contains = require('./_contains') // // // // A simple Set type that honours R.equals semantics // module.exports = (function() { // function _Set() { // /* globals Set */ // this._nativeSet = typeof Set === 'function' ? new Set() : null // this._items = {} // } // // // until we figure out why jsdoc chokes on this // // @param item The item to add to the Set // // @returns {boolean} true if the item did not exist prior, otherwise false // // // _Set.prototype.add = function(item) { // return !hasOrAdd(item, true, this) // }; // // // // // @param item The item to check for existence in the Set // // @returns {boolean} true if the item exists in the Set, otherwise false // // // _Set.prototype.has = function(item) { // return hasOrAdd(item, false, this) // }; // // // // // Combines the logic for checking whether an item is a member of the set and // // for adding a new item to the set. // // // // @param item The item to check or add to the Set instance. // // @param shouldAdd If true, the item will be added to the set if it doesn't // // already exist. // // @param set The set instance to check or add to. // // @return {boolean} true if the item already existed, otherwise false. // // // function hasOrAdd(item, shouldAdd, set) { // var type = typeof item // var prevSize, newSize // switch (type) { // case 'string': // case 'number': // // distinguish between +0 and -0 // if (item === 0 && 1 / item === -Infinity) { // if (set._items['-0']) { // return true // } else { // if (shouldAdd) { // set._items['-0'] = true // } // return false // } // } // // these types can all utilise the native Set // if (set._nativeSet !== null) { // if (shouldAdd) { // prevSize = set._nativeSet.size // set._nativeSet.add(item) // newSize = set._nativeSet.size // return newSize === prevSize // } else { // return set._nativeSet.has(item) // } // } else if (!(type in set._items)) { // if (shouldAdd) { // set._items[type] = {}; // set._items[type][item] = true; // } // return false; // } else if (item in set._items[type]) { // return true; // } else { // if (shouldAdd) { // set._items[type][item] = true; // } // return false; // } // // case 'boolean': // // set._items['boolean'] holds a two element array // // representing [ falseExists, trueExists ] // if (type in set._items) { // var bIdx = item ? 1 : 0 // if (set._items[type][bIdx]) { // return true // } else { // if (shouldAdd) { // set._items[type][bIdx] = true // } // return false // } // } else { // if (shouldAdd) { // set._items[type] = item ? [false, true] : [true, false] // } // return false // } // // case 'function': // // compare functions for reference equality // if (set._nativeSet !== null) { // if (shouldAdd) { // prevSize = set._nativeSet.size // set._nativeSet.add(item) // newSize = set._nativeSet.size // return newSize === prevSize // } else { // return set._nativeSet.has(item) // } // } else { // if (!(type in set._items)) { // if (shouldAdd) { // set._items[type] = [item] // } // return false // } // if (!_contains(item, set._items[type])) { // if (shouldAdd) { // set._items[type].push(item) // } // return false // } // return true // } // // case 'undefined': // if (set._items[type]) { // return true // } else { // if (shouldAdd) { // set._items[type] = true // } // return false // } // // case 'object': // if (item === null) { // if (!set._items['null']) { // if (shouldAdd) { // set._items['null'] = true // } // return false // } // return true // } // /* falls through */ // default: // // reduce the search size of heterogeneous sets by creating buckets // // for each type. // type = Object.prototype.toString.call(item) // if (!(type in set._items)) { // if (shouldAdd) { // set._items[type] = [item] // } // return false // } // // scan through all previously applied items // if (!_contains(item, set._items[type])) { // if (shouldAdd) { // set._items[type].push(item) // } // return false // } // return true // } // } // return _Set // }()) //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2V0LmpzIiwic291cmNlcyI6WyJTZXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqIEBpZ25vcmUg8J+apyB3aXAgKi9cbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzMzMjM0NjY2L2hvdy10by1tYXAtcmVkdWNlLWZpbHRlci1hLXNldC1pbi1qYXZhc2NyaXB0XG4vLyB2YXIgX2NvbnRhaW5zID0gcmVxdWlyZSgnLi9fY29udGFpbnMnKVxuLy9cbi8vXG4vLyAvLyBBIHNpbXBsZSBTZXQgdHlwZSB0aGF0IGhvbm91cnMgUi5lcXVhbHMgc2VtYW50aWNzXG4vLyBtb2R1bGUuZXhwb3J0cyA9IChmdW5jdGlvbigpIHtcbi8vICAgZnVuY3Rpb24gX1NldCgpIHtcbi8vICAgICAvKiBnbG9iYWxzIFNldCAqL1xuLy8gICAgIHRoaXMuX25hdGl2ZVNldCA9IHR5cGVvZiBTZXQgPT09ICdmdW5jdGlvbicgPyBuZXcgU2V0KCkgOiBudWxsXG4vLyAgICAgdGhpcy5faXRlbXMgPSB7fVxuLy8gICB9XG4vL1xuLy8gICAvLyB1bnRpbCB3ZSBmaWd1cmUgb3V0IHdoeSBqc2RvYyBjaG9rZXMgb24gdGhpc1xuLy8gICAvLyBAcGFyYW0gaXRlbSBUaGUgaXRlbSB0byBhZGQgdG8gdGhlIFNldFxuLy8gICAvLyBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBkaWQgbm90IGV4aXN0IHByaW9yLCBvdGhlcndpc2UgZmFsc2Vcbi8vICAgLy9cbi8vICAgX1NldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oaXRlbSkge1xuLy8gICAgIHJldHVybiAhaGFzT3JBZGQoaXRlbSwgdHJ1ZSwgdGhpcylcbi8vICAgfTtcbi8vXG4vLyAgIC8vXG4vLyAgIC8vIEBwYXJhbSBpdGVtIFRoZSBpdGVtIHRvIGNoZWNrIGZvciBleGlzdGVuY2UgaW4gdGhlIFNldFxuLy8gICAvLyBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgaXRlbSBleGlzdHMgaW4gdGhlIFNldCwgb3RoZXJ3aXNlIGZhbHNlXG4vLyAgIC8vXG4vLyAgIF9TZXQucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uKGl0ZW0pIHtcbi8vICAgICByZXR1cm4gaGFzT3JBZGQoaXRlbSwgZmFsc2UsIHRoaXMpXG4vLyAgIH07XG4vL1xuLy8gICAvL1xuLy8gICAvLyBDb21iaW5lcyB0aGUgbG9naWMgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gaXRlbSBpcyBhIG1lbWJlciBvZiB0aGUgc2V0IGFuZFxuLy8gICAvLyBmb3IgYWRkaW5nIGEgbmV3IGl0ZW0gdG8gdGhlIHNldC5cbi8vICAgLy9cbi8vICAgLy8gQHBhcmFtIGl0ZW0gICAgICAgVGhlIGl0ZW0gdG8gY2hlY2sgb3IgYWRkIHRvIHRoZSBTZXQgaW5zdGFuY2UuXG4vLyAgIC8vIEBwYXJhbSBzaG91bGRBZGQgIElmIHRydWUsIHRoZSBpdGVtIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHNldCBpZiBpdCBkb2Vzbid0XG4vLyAgIC8vICAgICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3QuXG4vLyAgIC8vIEBwYXJhbSBzZXQgICAgICAgIFRoZSBzZXQgaW5zdGFuY2UgdG8gY2hlY2sgb3IgYWRkIHRvLlxuLy8gICAvLyBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBpdGVtIGFscmVhZHkgZXhpc3RlZCwgb3RoZXJ3aXNlIGZhbHNlLlxuLy8gICAvL1xuLy8gICBmdW5jdGlvbiBoYXNPckFkZChpdGVtLCBzaG91bGRBZGQsIHNldCkge1xuLy8gICAgIHZhciB0eXBlID0gdHlwZW9mIGl0ZW1cbi8vICAgICB2YXIgcHJldlNpemUsIG5ld1NpemVcbi8vICAgICBzd2l0Y2ggKHR5cGUpIHtcbi8vICAgICAgIGNhc2UgJ3N0cmluZyc6XG4vLyAgICAgICBjYXNlICdudW1iZXInOlxuLy8gICAgICAgICAvLyBkaXN0aW5ndWlzaCBiZXR3ZWVuICswIGFuZCAtMFxuLy8gICAgICAgICBpZiAoaXRlbSA9PT0gMCAmJiAxIC8gaXRlbSA9PT0gLUluZmluaXR5KSB7XG4vLyAgICAgICAgICAgaWYgKHNldC5faXRlbXNbJy0wJ10pIHtcbi8vICAgICAgICAgICAgIHJldHVybiB0cnVlXG4vLyAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbi8vICAgICAgICAgICAgICAgc2V0Ll9pdGVtc1snLTAnXSA9IHRydWVcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuLy8gICAgICAgICAgIH1cbi8vICAgICAgICAgfVxuLy8gICAgICAgICAvLyB0aGVzZSB0eXBlcyBjYW4gYWxsIHV0aWxpc2UgdGhlIG5hdGl2ZSBTZXRcbi8vICAgICAgICAgaWYgKHNldC5fbmF0aXZlU2V0ICE9PSBudWxsKSB7XG4vLyAgICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuLy8gICAgICAgICAgICAgcHJldlNpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplXG4vLyAgICAgICAgICAgICBzZXQuX25hdGl2ZVNldC5hZGQoaXRlbSlcbi8vICAgICAgICAgICAgIG5ld1NpemUgPSBzZXQuX25hdGl2ZVNldC5zaXplXG4vLyAgICAgICAgICAgICByZXR1cm4gbmV3U2l6ZSA9PT0gcHJldlNpemVcbi8vICAgICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgICAgcmV0dXJuIHNldC5fbmF0aXZlU2V0LmhhcyhpdGVtKVxuLy8gICAgICAgICAgIH1cbi8vICAgICAgICAgfSBlbHNlIGlmICghKHR5cGUgaW4gc2V0Ll9pdGVtcykpIHtcbi8vICAgICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbi8vICAgICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IHt9O1xuLy8gICAgICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdW2l0ZW1dID0gdHJ1ZTtcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbi8vICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0gaW4gc2V0Ll9pdGVtc1t0eXBlXSkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4vLyAgICAgICAgICAgfSBlbHNlIHtcbi8vICAgICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbi8vICAgICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXVtpdGVtXSA9IHRydWU7XG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4vLyAgICAgICAgICAgfVxuLy9cbi8vICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuLy8gICAgICAgICAvLyBzZXQuX2l0ZW1zWydib29sZWFuJ10gaG9sZHMgYSB0d28gZWxlbWVudCBhcnJheVxuLy8gICAgICAgICAvLyByZXByZXNlbnRpbmcgWyBmYWxzZUV4aXN0cywgdHJ1ZUV4aXN0cyBdXG4vLyAgICAgICAgIGlmICh0eXBlIGluIHNldC5faXRlbXMpIHtcbi8vICAgICAgICAgICB2YXIgYklkeCA9IGl0ZW0gPyAxIDogMFxuLy8gICAgICAgICAgIGlmIChzZXQuX2l0ZW1zW3R5cGVdW2JJZHhdKSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuLy8gICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4vLyAgICAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV1bYklkeF0gPSB0cnVlXG4vLyAgICAgICAgICAgICB9XG4vLyAgICAgICAgICAgICByZXR1cm4gZmFsc2Vcbi8vICAgICAgICAgICB9XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuLy8gICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IGl0ZW0gPyBbZmFsc2UsIHRydWVdIDogW3RydWUsIGZhbHNlXVxuLy8gICAgICAgICAgIH1cbi8vICAgICAgICAgICByZXR1cm4gZmFsc2Vcbi8vICAgICAgICAgfVxuLy9cbi8vICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzpcbi8vICAgICAgICAgLy8gY29tcGFyZSBmdW5jdGlvbnMgZm9yIHJlZmVyZW5jZSBlcXVhbGl0eVxuLy8gICAgICAgICBpZiAoc2V0Ll9uYXRpdmVTZXQgIT09IG51bGwpIHtcbi8vICAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4vLyAgICAgICAgICAgICBwcmV2U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemVcbi8vICAgICAgICAgICAgIHNldC5fbmF0aXZlU2V0LmFkZChpdGVtKVxuLy8gICAgICAgICAgICAgbmV3U2l6ZSA9IHNldC5fbmF0aXZlU2V0LnNpemVcbi8vICAgICAgICAgICAgIHJldHVybiBuZXdTaXplID09PSBwcmV2U2l6ZVxuLy8gICAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICByZXR1cm4gc2V0Ll9uYXRpdmVTZXQuaGFzKGl0ZW0pXG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICB9IGVsc2Uge1xuLy8gICAgICAgICAgIGlmICghKHR5cGUgaW4gc2V0Ll9pdGVtcykpIHtcbi8vICAgICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbi8vICAgICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IFtpdGVtXVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICAgIGlmICghX2NvbnRhaW5zKGl0ZW0sIHNldC5faXRlbXNbdHlwZV0pKSB7XG4vLyAgICAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4vLyAgICAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0ucHVzaChpdGVtKVxuLy8gICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4vLyAgICAgICAgICAgfVxuLy8gICAgICAgICAgIHJldHVybiB0cnVlXG4vLyAgICAgICAgIH1cbi8vXG4vLyAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuLy8gICAgICAgICBpZiAoc2V0Ll9pdGVtc1t0eXBlXSkge1xuLy8gICAgICAgICAgIHJldHVybiB0cnVlXG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgaWYgKHNob3VsZEFkZCkge1xuLy8gICAgICAgICAgICAgc2V0Ll9pdGVtc1t0eXBlXSA9IHRydWVcbi8vICAgICAgICAgICB9XG4vLyAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4vLyAgICAgICAgIH1cbi8vXG4vLyAgICAgICBjYXNlICdvYmplY3QnOlxuLy8gICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCkge1xuLy8gICAgICAgICAgIGlmICghc2V0Ll9pdGVtc1snbnVsbCddKSB7XG4vLyAgICAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4vLyAgICAgICAgICAgICAgIHNldC5faXRlbXNbJ251bGwnXSA9IHRydWVcbi8vICAgICAgICAgICAgIH1cbi8vICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuLy8gICAgICAgICAgIH1cbi8vICAgICAgICAgICByZXR1cm4gdHJ1ZVxuLy8gICAgICAgICB9XG4vLyAgICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4vLyAgICAgICBkZWZhdWx0OlxuLy8gICAgICAgICAvLyByZWR1Y2UgdGhlIHNlYXJjaCBzaXplIG9mIGhldGVyb2dlbmVvdXMgc2V0cyBieSBjcmVhdGluZyBidWNrZXRzXG4vLyAgICAgICAgIC8vIGZvciBlYWNoIHR5cGUuXG4vLyAgICAgICAgIHR5cGUgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaXRlbSlcbi8vICAgICAgICAgaWYgKCEodHlwZSBpbiBzZXQuX2l0ZW1zKSkge1xuLy8gICAgICAgICAgIGlmIChzaG91bGRBZGQpIHtcbi8vICAgICAgICAgICAgIHNldC5faXRlbXNbdHlwZV0gPSBbaXRlbV1cbi8vICAgICAgICAgICB9XG4vLyAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBwcmV2aW91c2x5IGFwcGxpZWQgaXRlbXNcbi8vICAgICAgICAgaWYgKCFfY29udGFpbnMoaXRlbSwgc2V0Ll9pdGVtc1t0eXBlXSkpIHtcbi8vICAgICAgICAgICBpZiAoc2hvdWxkQWRkKSB7XG4vLyAgICAgICAgICAgICBzZXQuX2l0ZW1zW3R5cGVdLnB1c2goaXRlbSlcbi8vICAgICAgICAgICB9XG4vLyAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4vLyAgICAgICAgIH1cbi8vICAgICAgICAgcmV0dXJuIHRydWVcbi8vICAgICB9XG4vLyAgIH1cbi8vICAgcmV0dXJuIF9TZXRcbi8vIH0oKSlcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9