UNPKG

foop

Version:

interfaces that describe their intentions.

213 lines (212 loc) 6.54 kB
// // @TODO could also just have files for .set .has .get .delete .clear... // // // @TODO: // // just pass in as first param! // // var SET = 1 // // var GET = 2 // // var HAS = 4 // // var DELETE = 8 // // const isSet = require('../is/set') // const ArrayFrom = require('../util/from') // const isUndefined = require('../is/undefined') // const concat = require('../concat') // const toarr = require('../to-arr') // // const emptyArray = [] // const store = {} // // const ensureInitialized = (name, value, mapOrSet) => { // if (isUndefined(store[name])) store[name] = new Map() // } // // const has = (key, prop) => { // return isUndefined(prop) ? !!store[key].size : store[key].has(prop) // } // // const get = (key, prop, fallback = emptyArray) => { // return has(key, prop) ? store[key].get(prop) : fallback // } // // const set = (key, prop, value) => { // const storage = store[key] // // when it's a set, we have no `prop`, we just have .add // // so `prop = value` && `value = undefined` // if (isSet(storage)) { // storage.add(prop) // } // else { // const existing = storage.get(prop) // const val = concat(existing, value) // storage.set(prop, val) // } // } // const cache = (key, prop, value) => { // /* prettier-ignore */ // if (isUndefined(value)) { // // when we want to just access the property, return an array // // @example `.meta('transformers')` // if (isUndefined(prop)) { // if (isUndefined(store[key])) return emptyArray // else return store[key].size === 0 ? emptyArray : ArrayFrom(store[key]) // } // // we have `key, prop` // // // // 1: should `prop` be a value, (isSet?) // else if (isSet(store[key])) { // ensureInitialized(key) // set(key, prop) // } // // 2: prop is a key, we want to return the [..] for that specific property // // @example `.meta('transformers', 'eh')` // else if (isUndefined(store[key])) return emptyArray // else return toarr(get(key, prop)) // } // // we have `key, prop, value` // else { // ensureInitialized(key) // // we have a value, let's add it // set(key, prop, value) // } // } // // const scoped = cache('segments', {default: []}) // // // has/get // if (scoped('key')) { // // todo eh // } // // // set // scoped('key', 'value') // // // // /** // // * @since 4.0.0 // // * @param {Chain} _this // // * @return {Chain} // // */ // // function getMeta(_this) { // // // if we already have it, keep it // // if (_this.meta) return _this.meta // // // // // the store // // // shorthands: key -> method // // const store = {} // // // // // --- uglifiable functions // // // // /** @desc initialize the store maps when we need them */ // // /* prettier-ignore */ // // const ensureInitialized = (name, value) => { // // if (!isUndefined(store[name])) return // // // // // if ( // // // name === TRANSFORMERS_KEY || // // // name === SHORTHANDS_KEY || // // // name === DECORATED_KEY // // // ) { // // // store[name] = new Map() // // // } // // // else // // if (isInKeyMapAsSet(name)) { // // store[name] = new Set() // // } // // else { // // store[name] = new Map() // // } // // } // // // // /** // // * @since 4.0.0 // // * @param {Primitive} key // // * @param {Primitive | undefined} [prop=undefined] // // * @return {boolean} // // */ // // const has = (key, prop) => { // // if (isUndefined(prop)) return !!store[key].size // // else return store[key].has(prop) // // } // // /** // // * @since 4.0.0 // // * @param {Primitive} key // // * @param {Primitive | undefined} [prop=undefined] // // * @return {any} // // */ // // const get = (key, prop) => (has(key, prop) ? store[key].get(prop) : emptyArray) // // // // /** // // * @since 4.0.0 // // * @param {Primitive} key // // * @param {Primitive | undefined} [prop=undefined] // // * @param {Primitive | undefined} [value=undefined] // // * @return {void} // // */ // // const set = (key, prop, value) => { // // const storage = store[key] // // // when it's a set, we have no `prop`, we just have .add // // // so `prop = value` && `value = undefined` // // if (isSet(storage)) { // // storage.add(prop) // // } // // else { // // // if (!has(key, prop)) return // // const existing = storage.get(prop) // // const val = concat(existing, value) // // storage.set(prop, val) // // } // // } // // // // /** // // * @since 4.0.0 // // * // // * @desc a single easily minifiable function, // // * dynamically setting & getting depending on arguments // // * to avoid nested property accessing // // * only instantiating when values are **addded** // // * // // * @param {Primitive} key // // * @param {Primitive | undefined} [prop=undefined] // // * @param {undefined | any} [value=undefined] (when no value, it's a getter) // // * @return {Array | Chain} depending on args // // */ // // function meta(key, prop, value) { // // if (process.env.NODE_ENV === 'DEBUG') { // // console.log('USING META', {key, prop, value}) // // } // // // // /* prettier-ignore */ // // if (isUndefined(value)) { // // // when we want to just access the property, return an array // // // @example `.meta('transformers')` // // if (isUndefined(prop)) { // // if (isUndefined(store[key])) return emptyArray // // else return store[key].size === 0 ? emptyArray : ArrayFrom(store[key].values()) // // } // // // we have `key, prop` // // // // // // 1: should `prop` be a value, (isSet?) // // else if (isInKeyMapAsSet(key)) { // // ensureInitialized(key) // // set(key, prop) // // } // // // 2: prop is a key, we want to return the [..] for that specific property // // // @example `.meta('transformers', 'eh')` // // else if (isUndefined(store[key])) return emptyArray // // else return toarr(get(key, prop)) // // } // // // we have `key, prop, value` // // else { // // ensureInitialized(key) // // // we have a value, let's add it // // set(key, prop, value) // // } // // return _this // // } // // // // // for debugging // // meta.store = store // // // meta.debug = false // // // // return meta // // }