foop
Version:
interfaces that describe their intentions.
213 lines (212 loc) • 6.54 kB
JavaScript
// // @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
// // }