foop
Version:
interfaces that describe their intentions.
227 lines (202 loc) • 12.8 kB
JavaScript
// need some thin wrapper around values to go up and down path
//
//
// const ValueObject = {
// node: value,
// kind: typeof,
// isRoot: false,
// isLeaf: false,
// isPrimitive: false,
// branches: [],
// isFirst: false,
// isLast: false,
// parent: {},
// }
//
// class It {
// constructor(x) {
// // this.tree = {
// // parent: {},
// // }
//
// // this.root = x
//
// // this.previous = x
// this.current = x
//
// this.depth = 0
// this.all = new Set()
// // this.path
// // this.key
// }
//
// get node() {
// return this.current
// }
//
// addBranch() {}
//
// // for updating
// branchHead() {}
//
// goUp() {
// this.depth--
// }
// goDown(current) {
// this.parent = this.current
// this.depth++
// this.current = current
// }
// // not needed but conceptually
// // goNext() {}
//
// find() {}
// path() {}
// }
// const it = x => new It(x)
// return Array.from(parents.values()).indexOf(value) !== -1
// const keys = Array.from(parents.keys())
// console.log('___pk', {keys})
// for (let k = 0; k < keys.length; k++) {
// const key = keys[k]
// const matches =
// depth.includes(key) || (key.includes && key.includes(depth))
// console.log({key, matches, depth})
// // .has(value)
// if (matches) {
// let has = false
// parents.get(key).forEach(haz => {
// if (value === haz) has = true
// })
// return has
// }
// }
// for (let i = depth; i >= depth; i--) {
// if (parents.get(i).has(value)) return true
// }
// return false
// const pps = []
// const ppHas = value => {
// for (let i = 0; i < pps.length; i++) {
// if (pps[i] === value) {
// return true
// }
// }
// }
// const ppAdd = value => pps.push(value)
// const ppPop = () => pps.pop()
// else if (ppHas(node)) {
// if (ENV_DEBUG) {
// console.log('PPHAS!!!!!!!!!!!', {node, path: this.path})
// }
// this.isCircular = true
// }
// ----- clear/update ----
// if (!isUndefined(this.iteratee)) {
// this.iteratee[this.key] = value
// }
// // dot.set(this.iteratee, this.key, value)
// dot.set(this.iteratee, this.path, value)
// dot.set(this.iteratee, this.key, value)
// console.log({traverser: this})
// @NOTE think about this more, but updating can change structure
// if (isTrue(clear)) clearParents()
// ----- parents
// if (!this.parents.has(depth)) this.parents.set(depth, new Set())
// this.parents.get(depth).add(value)
// (isObj(value) ? parents.add(value) : parents.add(value))
// const removeLastParent = () => parents.delete(lastParent)
// parents.forEach(parent => (parent.has(value) ? parent.delete(value) : null))
// parents.delete(value)
// ---- eq ----
// from underscore.js & ramda
//
// Assume equality for cyclic structures. The algorithm for detecting cyclic
// structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
//
// Initializing stack of traversed objects.
// It's done here since we only need them for objects and arrays comparison.
// let length = stackA.length
// while (length--) {
// // Linear search. Performance is inversely proportional to the number of
// // unique nested structures.
// if (stackA[length] === a) return stackB[length] === b
// }
//
// // Add the first object to the stack of traversed objects.
// stackA.push(a)
// stackB.push(b)
// BREAKS ANY BUT OBJ
// if (!isObjLoose(node)) {
// node = _node
// return notEqual()
// }
// else {
// _node = node
// }
// if (isObjNotNull(node)) {
// // _node = node
// // nodes.push(node)
// // node = node[key]
// }
// else {
// // node = nodes.pop()
// }
// node = node ? node[traverser.key] : node
// instance.before(traverser => {
// // node = traverser.iteratee
// // if (!isObjNotNull(x)) return
// // // nodes.push(x)
// // x = x[key]
// // nodes.push(x)
// })
// instance.after(() => {
// // x = node
// // console.log('x before pop', {x})
// // node =
// // nodes.pop()
// // x = node
// // console.log('x after pop, nodes', {x})
// })
// ----- remove -----
// if (isObj(obj)) deleteFromObjOrArray(obj, this.key)
// else deleteFromObjOrArray(this.parent, this.key)
// deleteFromObjOrArray(this.parent, this.key)
// deleteFromObjOrArray(this.iteratee, this.key)
// if (isUndefined(obj)) {
// // throw new Error('why?')
// }
// else if (isArray(obj)) {
// /* istanbul ignore next: dev */
// if (ENV_DEBUG) {
// console.log('traverse:remove:array', obj, this.key)
// }
//
// obj.splice(this.key, 1)
// }
// else if (isObjNotNull(obj)) {
// /* istanbul ignore next: dev */
// if (ENV_DEBUG) {
// console.log('traverse:remove:obj', this.key)
// }
//
// delete obj[this.key]
// }
//
// if (isObjNotNull(this.parent)) {
// delete this.parent[this.key]
//
// /* istanbul ignore next: dev */
// if (ENV_DEBUG) {
// console.log('traverse:remove:parent', this.key)
// }
// }
// if (isObjNotNull(this.iteratee)) {
// delete this.iteratee[this.key]
//
// /* istanbul ignore next: dev */
// if (ENV_DEBUG) {
// console.log('traverse:remove:iteratee', this.key)
// }
// }
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhdmVyc2UtY29tbWVudHMuanMiLCJzb3VyY2VzIjpbInRyYXZlcnNlLWNvbW1lbnRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIG5lZWQgc29tZSB0aGluIHdyYXBwZXIgYXJvdW5kIHZhbHVlcyB0byBnbyB1cCBhbmQgZG93biBwYXRoXG4vL1xuLy9cbi8vIGNvbnN0IFZhbHVlT2JqZWN0ID0ge1xuLy8gICBub2RlOiB2YWx1ZSxcbi8vICAga2luZDogdHlwZW9mLFxuLy8gICBpc1Jvb3Q6IGZhbHNlLFxuLy8gICBpc0xlYWY6IGZhbHNlLFxuLy8gICBpc1ByaW1pdGl2ZTogZmFsc2UsXG4vLyAgIGJyYW5jaGVzOiBbXSxcbi8vICAgaXNGaXJzdDogZmFsc2UsXG4vLyAgIGlzTGFzdDogZmFsc2UsXG4vLyAgIHBhcmVudDoge30sXG4vLyB9XG4vL1xuLy8gY2xhc3MgSXQge1xuLy8gICBjb25zdHJ1Y3Rvcih4KSB7XG4vLyAgICAgLy8gdGhpcy50cmVlID0ge1xuLy8gICAgIC8vIHBhcmVudDoge30sXG4vLyAgICAgLy8gfVxuLy9cbi8vICAgICAvLyB0aGlzLnJvb3QgPSB4XG4vL1xuLy8gICAgIC8vIHRoaXMucHJldmlvdXMgPSB4XG4vLyAgICAgdGhpcy5jdXJyZW50ID0geFxuLy9cbi8vICAgICB0aGlzLmRlcHRoID0gMFxuLy8gICAgIHRoaXMuYWxsID0gbmV3IFNldCgpXG4vLyAgICAgLy8gdGhpcy5wYXRoXG4vLyAgICAgLy8gdGhpcy5rZXlcbi8vICAgfVxuLy9cbi8vICAgZ2V0IG5vZGUoKSB7XG4vLyAgICAgcmV0dXJuIHRoaXMuY3VycmVudFxuLy8gICB9XG4vL1xuLy8gICBhZGRCcmFuY2goKSB7fVxuLy9cbi8vICAgLy8gZm9yIHVwZGF0aW5nXG4vLyAgIGJyYW5jaEhlYWQoKSB7fVxuLy9cbi8vICAgZ29VcCgpIHtcbi8vICAgICB0aGlzLmRlcHRoLS1cbi8vICAgfVxuLy8gICBnb0Rvd24oY3VycmVudCkge1xuLy8gICAgIHRoaXMucGFyZW50ID0gdGhpcy5jdXJyZW50XG4vLyAgICAgdGhpcy5kZXB0aCsrXG4vLyAgICAgdGhpcy5jdXJyZW50ID0gY3VycmVudFxuLy8gICB9XG4vLyAgIC8vIG5vdCBuZWVkZWQgYnV0IGNvbmNlcHR1YWxseVxuLy8gICAvLyBnb05leHQoKSB7fVxuLy9cbi8vICAgZmluZCgpIHt9XG4vLyAgIHBhdGgoKSB7fVxuLy8gfVxuLy8gY29uc3QgaXQgPSB4ID0+IG5ldyBJdCh4KVxuXG5cbi8vIHJldHVybiBBcnJheS5mcm9tKHBhcmVudHMudmFsdWVzKCkpLmluZGV4T2YodmFsdWUpICE9PSAtMVxuLy8gY29uc3Qga2V5cyA9IEFycmF5LmZyb20ocGFyZW50cy5rZXlzKCkpXG4vLyBjb25zb2xlLmxvZygnX19fcGsnLCB7a2V5c30pXG4vLyBmb3IgKGxldCBrID0gMDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbi8vICAgY29uc3Qga2V5ID0ga2V5c1trXVxuLy8gICBjb25zdCBtYXRjaGVzID1cbi8vICAgICBkZXB0aC5pbmNsdWRlcyhrZXkpIHx8IChrZXkuaW5jbHVkZXMgJiYga2V5LmluY2x1ZGVzKGRlcHRoKSlcbi8vICAgY29uc29sZS5sb2coe2tleSwgbWF0Y2hlcywgZGVwdGh9KVxuLy8gICAvLyAuaGFzKHZhbHVlKVxuLy8gICBpZiAobWF0Y2hlcykge1xuLy8gICAgIGxldCBoYXMgPSBmYWxzZVxuLy8gICAgIHBhcmVudHMuZ2V0KGtleSkuZm9yRWFjaChoYXogPT4ge1xuLy8gICAgICAgaWYgKHZhbHVlID09PSBoYXopIGhhcyA9IHRydWVcbi8vICAgICB9KVxuLy8gICAgIHJldHVybiBoYXNcbi8vICAgfVxuLy8gfVxuXG4vLyBmb3IgKGxldCBpID0gZGVwdGg7IGkgPj0gZGVwdGg7IGktLSkge1xuLy8gaWYgKHBhcmVudHMuZ2V0KGkpLmhhcyh2YWx1ZSkpIHJldHVybiB0cnVlXG4vLyB9XG5cbi8vIHJldHVybiBmYWxzZVxuXG5cbi8vIGNvbnN0IHBwcyA9IFtdXG4vLyBjb25zdCBwcEhhcyA9IHZhbHVlID0+IHtcbi8vICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcHMubGVuZ3RoOyBpKyspIHtcbi8vICAgICBpZiAocHBzW2ldID09PSB2YWx1ZSkge1xuLy8gICAgICAgcmV0dXJuIHRydWVcbi8vICAgICB9XG4vLyAgIH1cbi8vIH1cbi8vIGNvbnN0IHBwQWRkID0gdmFsdWUgPT4gcHBzLnB1c2godmFsdWUpXG4vLyBjb25zdCBwcFBvcCA9ICgpID0+IHBwcy5wb3AoKVxuXG4vLyBlbHNlIGlmIChwcEhhcyhub2RlKSkge1xuLy8gICBpZiAoRU5WX0RFQlVHKSB7XG4vLyAgICAgY29uc29sZS5sb2coJ1BQSEFTISEhISEhISEhISEnLCB7bm9kZSwgcGF0aDogdGhpcy5wYXRofSlcbi8vICAgfVxuLy8gICB0aGlzLmlzQ2lyY3VsYXIgPSB0cnVlXG4vLyB9XG5cblxuLy8gLS0tLS0gY2xlYXIvdXBkYXRlIC0tLS1cbi8vIGlmICghaXNVbmRlZmluZWQodGhpcy5pdGVyYXRlZSkpIHtcbi8vICAgdGhpcy5pdGVyYXRlZVt0aGlzLmtleV0gPSB2YWx1ZVxuLy8gfVxuLy8gLy8gZG90LnNldCh0aGlzLml0ZXJhdGVlLCB0aGlzLmtleSwgdmFsdWUpXG5cbi8vIGRvdC5zZXQodGhpcy5pdGVyYXRlZSwgdGhpcy5wYXRoLCB2YWx1ZSlcblxuLy8gZG90LnNldCh0aGlzLml0ZXJhdGVlLCB0aGlzLmtleSwgdmFsdWUpXG4vLyBjb25zb2xlLmxvZyh7dHJhdmVyc2VyOiB0aGlzfSlcblxuLy8gQE5PVEUgdGhpbmsgYWJvdXQgdGhpcyBtb3JlLCBidXQgdXBkYXRpbmcgY2FuIGNoYW5nZSBzdHJ1Y3R1cmVcbi8vIGlmIChpc1RydWUoY2xlYXIpKSBjbGVhclBhcmVudHMoKVxuXG4vLyAtLS0tLSBwYXJlbnRzXG4vLyBpZiAoIXRoaXMucGFyZW50cy5oYXMoZGVwdGgpKSB0aGlzLnBhcmVudHMuc2V0KGRlcHRoLCBuZXcgU2V0KCkpXG4vLyB0aGlzLnBhcmVudHMuZ2V0KGRlcHRoKS5hZGQodmFsdWUpXG5cbi8vIChpc09iaih2YWx1ZSkgPyBwYXJlbnRzLmFkZCh2YWx1ZSkgOiBwYXJlbnRzLmFkZCh2YWx1ZSkpXG4vLyBjb25zdCByZW1vdmVMYXN0UGFyZW50ID0gKCkgPT4gcGFyZW50cy5kZWxldGUobGFzdFBhcmVudClcblxuLy8gcGFyZW50cy5mb3JFYWNoKHBhcmVudCA9PiAocGFyZW50Lmhhcyh2YWx1ZSkgPyBwYXJlbnQuZGVsZXRlKHZhbHVlKSA6IG51bGwpKVxuLy8gcGFyZW50cy5kZWxldGUodmFsdWUpXG5cblxuLy8gLS0tLSBlcSAtLS0tXG5cbi8vIGZyb20gdW5kZXJzY29yZS5qcyAmIHJhbWRhXG4vL1xuLy8gQXNzdW1lIGVxdWFsaXR5IGZvciBjeWNsaWMgc3RydWN0dXJlcy4gVGhlIGFsZ29yaXRobSBmb3IgZGV0ZWN0aW5nIGN5Y2xpY1xuLy8gc3RydWN0dXJlcyBpcyBhZGFwdGVkIGZyb20gRVMgNS4xIHNlY3Rpb24gMTUuMTIuMywgYWJzdHJhY3Qgb3BlcmF0aW9uIGBKT2AuXG4vL1xuLy8gSW5pdGlhbGl6aW5nIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuLy8gSXQncyBkb25lIGhlcmUgc2luY2Ugd2Ugb25seSBuZWVkIHRoZW0gZm9yIG9iamVjdHMgYW5kIGFycmF5cyBjb21wYXJpc29uLlxuLy8gbGV0IGxlbmd0aCA9IHN0YWNrQS5sZW5ndGhcbi8vIHdoaWxlIChsZW5ndGgtLSkge1xuLy8gICAvLyBMaW5lYXIgc2VhcmNoLiBQZXJmb3JtYW5jZSBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2Zcbi8vICAgLy8gdW5pcXVlIG5lc3RlZCBzdHJ1Y3R1cmVzLlxuLy8gICBpZiAoc3RhY2tBW2xlbmd0aF0gPT09IGEpIHJldHVybiBzdGFja0JbbGVuZ3RoXSA9PT0gYlxuLy8gfVxuLy9cbi8vIC8vIEFkZCB0aGUgZmlyc3Qgb2JqZWN0IHRvIHRoZSBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbi8vIHN0YWNrQS5wdXNoKGEpXG4vLyBzdGFja0IucHVzaChiKVxuXG4vLyBCUkVBS1MgQU5ZIEJVVCBPQkpcbi8vIGlmICghaXNPYmpMb29zZShub2RlKSkge1xuLy8gICBub2RlID0gX25vZGVcbi8vICAgcmV0dXJuIG5vdEVxdWFsKClcbi8vIH1cbi8vIGVsc2Uge1xuLy8gICBfbm9kZSA9IG5vZGVcbi8vIH1cblxuLy8gaWYgKGlzT2JqTm90TnVsbChub2RlKSkgIHtcbi8vICAgLy8gX25vZGUgPSBub2RlXG4vLyAgIC8vIG5vZGVzLnB1c2gobm9kZSlcbi8vICAgLy8gbm9kZSA9IG5vZGVba2V5XVxuLy8gfVxuLy8gZWxzZSB7XG4vLyAgIC8vIG5vZGUgPSBub2Rlcy5wb3AoKVxuLy8gfVxuXG4vLyBub2RlID0gbm9kZSA/IG5vZGVbdHJhdmVyc2VyLmtleV0gOiBub2RlXG4vLyBpbnN0YW5jZS5iZWZvcmUodHJhdmVyc2VyID0+IHtcbi8vICAgLy8gbm9kZSA9IHRyYXZlcnNlci5pdGVyYXRlZVxuLy8gICAvLyBpZiAoIWlzT2JqTm90TnVsbCh4KSkgcmV0dXJuXG4vLyAgIC8vIC8vIG5vZGVzLnB1c2goeClcbi8vICAgLy8geCA9IHhba2V5XVxuLy8gICAvLyBub2Rlcy5wdXNoKHgpXG4vLyB9KVxuLy8gaW5zdGFuY2UuYWZ0ZXIoKCkgPT4ge1xuLy8gICAvLyB4ID0gbm9kZVxuLy8gICAvLyBjb25zb2xlLmxvZygneCBiZWZvcmUgcG9wJywge3h9KVxuLy8gICAvLyBub2RlID1cbi8vICAgLy8gbm9kZXMucG9wKClcbi8vICAgLy8geCA9IG5vZGVcbi8vICAgLy8gY29uc29sZS5sb2coJ3ggYWZ0ZXIgcG9wLCBub2RlcycsIHt4fSlcbi8vIH0pXG5cblxuLy8gLS0tLS0gcmVtb3ZlIC0tLS0tXG4vLyBpZiAoaXNPYmoob2JqKSkgZGVsZXRlRnJvbU9iak9yQXJyYXkob2JqLCB0aGlzLmtleSlcbi8vIGVsc2UgZGVsZXRlRnJvbU9iak9yQXJyYXkodGhpcy5wYXJlbnQsIHRoaXMua2V5KVxuLy8gZGVsZXRlRnJvbU9iak9yQXJyYXkodGhpcy5wYXJlbnQsIHRoaXMua2V5KVxuLy8gZGVsZXRlRnJvbU9iak9yQXJyYXkodGhpcy5pdGVyYXRlZSwgdGhpcy5rZXkpXG5cbi8vIGlmIChpc1VuZGVmaW5lZChvYmopKSB7XG4vLyAgIC8vIHRocm93IG5ldyBFcnJvcignd2h5PycpXG4vLyB9XG4vLyBlbHNlIGlmIChpc0FycmF5KG9iaikpIHtcbi8vICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQ6IGRldiAqL1xuLy8gICBpZiAoRU5WX0RFQlVHKSB7XG4vLyAgICAgY29uc29sZS5sb2coJ3RyYXZlcnNlOnJlbW92ZTphcnJheScsIG9iaiwgdGhpcy5rZXkpXG4vLyAgIH1cbi8vXG4vLyAgIG9iai5zcGxpY2UodGhpcy5rZXksIDEpXG4vLyB9XG4vLyBlbHNlIGlmIChpc09iak5vdE51bGwob2JqKSkge1xuLy8gICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGV2ICovXG4vLyAgIGlmIChFTlZfREVCVUcpIHtcbi8vICAgICBjb25zb2xlLmxvZygndHJhdmVyc2U6cmVtb3ZlOm9iaicsIHRoaXMua2V5KVxuLy8gICB9XG4vL1xuLy8gICBkZWxldGUgb2JqW3RoaXMua2V5XVxuLy8gfVxuLy9cbi8vIGlmIChpc09iak5vdE51bGwodGhpcy5wYXJlbnQpKSB7XG4vLyAgIGRlbGV0ZSB0aGlzLnBhcmVudFt0aGlzLmtleV1cbi8vXG4vLyAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0OiBkZXYgKi9cbi8vICAgaWYgKEVOVl9ERUJVRykge1xuLy8gICAgIGNvbnNvbGUubG9nKCd0cmF2ZXJzZTpyZW1vdmU6cGFyZW50JywgdGhpcy5rZXkpXG4vLyAgIH1cbi8vIH1cbi8vIGlmIChpc09iak5vdE51bGwodGhpcy5pdGVyYXRlZSkpIHtcbi8vICAgZGVsZXRlIHRoaXMuaXRlcmF0ZWVbdGhpcy5rZXldXG4vL1xuLy8gICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dDogZGV2ICovXG4vLyAgIGlmIChFTlZfREVCVUcpIHtcbi8vICAgICBjb25zb2xlLmxvZygndHJhdmVyc2U6cmVtb3ZlOml0ZXJhdGVlJywgdGhpcy5rZXkpXG4vLyAgIH1cbi8vIH1cbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OyJ9