{"version":3,"sources":["../yjs/node_modules/browserify/node_modules/browser-pack/_prelude.js","src/Memory.js","src/RedBlackTree.js"],"names":[],"mappings":"AAAA;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"y-memory.es6","sourceRoot":"/source/","sourcesContent":["(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o 0 || this.store.gc2.length > 0) {\n console.warn('GC1|2 not empty!', this.store.gc1, this.store.gc2)\n }\n if (JSON.stringify(this.store.listenersById) !== '{}') {\n console.warn('listenersById not empty!')\n }\n if (JSON.stringify(this.store.listenersByIdExecuteNow) !== '[]') {\n console.warn('listenersByIdExecuteNow not empty!')\n }\n if (this.store.transactionInProgress) {\n console.warn('Transaction still in progress!')\n }\n }, true)\n }\n transact (makeGen) {\n var t = new Transaction(this)\n while (makeGen !== null) {\n var gen = makeGen.call(t)\n var res = gen.next()\n while (!res.done) {\n res = gen.next(res.value)\n }\n makeGen = this.getNextRequest()\n }\n }\n * destroy () {\n yield* super.destroy()\n delete this.os\n delete this.ss\n delete this.ds\n }\n }\n Y.extend('memory', Database)\n}\n\nmodule.exports = extend\nif (typeof Y !== 'undefined') {\n extend(Y)\n}\n","'use strict'\n\n/*\n This file contains a not so fancy implemantion of a Red Black Tree.\n*/\nmodule.exports = function (Y) {\n class N {\n // A created node is always red!\n constructor (val) {\n this.val = val\n this.color = true\n this._left = null\n this._right = null\n this._parent = null\n if (val.id === null) {\n throw new Error('You must define id!')\n }\n }\n isRed () { return this.color }\n isBlack () { return !this.color }\n redden () { this.color = true; return this }\n blacken () { this.color = false; return this }\n get grandparent () {\n return this.parent.parent\n }\n get parent () {\n return this._parent\n }\n get sibling () {\n return (this === this.parent.left)\n ? this.parent.right : this.parent.left\n }\n get left () {\n return this._left\n }\n get right () {\n return this._right\n }\n set left (n) {\n if (n !== null) {\n n._parent = this\n }\n this._left = n\n }\n set right (n) {\n if (n !== null) {\n n._parent = this\n }\n this._right = n\n }\n rotateLeft (tree) {\n var parent = this.parent\n var newParent = this.right\n var newRight = this.right.left\n newParent.left = this\n this.right = newRight\n if (parent === null) {\n tree.root = newParent\n newParent._parent = null\n } else if (parent.left === this) {\n parent.left = newParent\n } else if (parent.right === this) {\n parent.right = newParent\n } else {\n throw new Error('The elements are wrongly connected!')\n }\n }\n next () {\n if (this.right !== null) {\n // search the most left node in the right tree\n var o = this.right\n while (o.left !== null) {\n o = o.left\n }\n return o\n } else {\n var p = this\n while (p.parent !== null && p !== p.parent.left) {\n p = p.parent\n }\n return p.parent\n }\n }\n prev () {\n if (this.left !== null) {\n // search the most right node in the left tree\n var o = this.left\n while (o.right !== null) {\n o = o.right\n }\n return o\n } else {\n var p = this\n while (p.parent !== null && p !== p.parent.right) {\n p = p.parent\n }\n return p.parent\n }\n }\n rotateRight (tree) {\n var parent = this.parent\n var newParent = this.left\n var newLeft = this.left.right\n newParent.right = this\n this.left = newLeft\n if (parent === null) {\n tree.root = newParent\n newParent._parent = null\n } else if (parent.left === this) {\n parent.left = newParent\n } else if (parent.right === this) {\n parent.right = newParent\n } else {\n throw new Error('The elements are wrongly connected!')\n }\n }\n getUncle () {\n // we can assume that grandparent exists when this is called!\n if (this.parent === this.parent.parent.left) {\n return this.parent.parent.right\n } else {\n return this.parent.parent.left\n }\n }\n }\n\n class RBTree {\n constructor () {\n this.root = null\n this.length = 0\n }\n * findNext (id) {\n return yield* this.findWithLowerBound([id[0], id[1] + 1])\n }\n * findPrev (id) {\n return yield* this.findWithUpperBound([id[0], id[1] - 1])\n }\n findNodeWithLowerBound (from) {\n if (from === void 0) {\n throw new Error('You must define from!')\n }\n var o = this.root\n if (o === null) {\n return null\n } else {\n while (true) {\n if ((from === null || Y.utils.smaller(from, o.val.id)) && o.left !== null) {\n // o is included in the bound\n // try to find an element that is closer to the bound\n o = o.left\n } else if (from !== null && Y.utils.smaller(o.val.id, from)) {\n // o is not within the bound, maybe one of the right elements is..\n if (o.right !== null) {\n o = o.right\n } else {\n // there is no right element. Search for the next bigger element,\n // this should be within the bounds\n return o.next()\n }\n } else {\n return o\n }\n }\n }\n }\n findNodeWithUpperBound (to) {\n if (to === void 0) {\n throw new Error('You must define from!')\n }\n var o = this.root\n if (o === null) {\n return null\n } else {\n while (true) {\n if ((to === null || Y.utils.smaller(o.val.id, to)) && o.right !== null) {\n // o is included in the bound\n // try to find an element that is closer to the bound\n o = o.right\n } else if (to !== null && Y.utils.smaller(to, o.val.id)) {\n // o is not within the bound, maybe one of the left elements is..\n if (o.left !== null) {\n o = o.left\n } else {\n // there is no left element. Search for the prev smaller element,\n // this should be within the bounds\n return o.prev()\n }\n } else {\n return o\n }\n }\n }\n }\n findSmallestNode () {\n var o = this.root\n while (o != null && o.left != null) {\n o = o.left\n }\n return o\n }\n * findWithLowerBound (from) {\n var n = this.findNodeWithLowerBound(from)\n return n == null ? null : n.val\n }\n * findWithUpperBound (to) {\n var n = this.findNodeWithUpperBound(to)\n return n == null ? null : n.val\n }\n * iterate (t, from, to, f) {\n var o\n if (from === null) {\n o = this.findSmallestNode()\n } else {\n o = this.findNodeWithLowerBound(from)\n }\n while (o !== null && (to === null || Y.utils.smaller(o.val.id, to) || Y.utils.compareIds(o.val.id, to))) {\n yield* f.call(t, o.val)\n o = o.next()\n }\n return true\n }\n * logTable (from, to, filter) {\n if (filter == null) {\n filter = function () {\n return true\n }\n }\n if (from == null) { from = null }\n if (to == null) { to = null }\n var os = []\n yield* this.iterate(this, from, to, function * (o) {\n if (filter(o)) {\n var o_ = {}\n for (var key in o) {\n if (typeof o[key] === 'object') {\n o_[key] = JSON.stringify(o[key])\n } else {\n o_[key] = o[key]\n }\n }\n os.push(o_)\n }\n })\n if (console.table != null) {\n console.table(os)\n }\n }\n * find (id) {\n var n\n return (n = this.findNode(id)) ? n.val : null\n }\n findNode (id) {\n if (id == null || id.constructor !== Array) {\n throw new Error('Expect id to be an array!')\n }\n var o = this.root\n if (o === null) {\n return false\n } else {\n while (true) {\n if (o === null) {\n return false\n }\n if (Y.utils.smaller(id, o.val.id)) {\n o = o.left\n } else if (Y.utils.smaller(o.val.id, id)) {\n o = o.right\n } else {\n return o\n }\n }\n }\n }\n * delete (id) {\n if (id == null || id.constructor !== Array) {\n throw new Error('id is expected to be an Array!')\n }\n var d = this.findNode(id)\n if (d == null) {\n // throw new Error('Element does not exist!')\n return\n }\n this.length--\n if (d.left !== null && d.right !== null) {\n // switch d with the greates element in the left subtree.\n // o should have at most one child.\n var o = d.left\n // find\n while (o.right !== null) {\n o = o.right\n }\n // switch\n d.val = o.val\n d = o\n }\n // d has at most one child\n // let n be the node that replaces d\n var isFakeChild\n var child = d.left || d.right\n if (child === null) {\n isFakeChild = true\n child = new N({id: 0})\n child.blacken()\n d.right = child\n } else {\n isFakeChild = false\n }\n\n if (d.parent === null) {\n if (!isFakeChild) {\n this.root = child\n child.blacken()\n child._parent = null\n } else {\n this.root = null\n }\n return\n } else if (d.parent.left === d) {\n d.parent.left = child\n } else if (d.parent.right === d) {\n d.parent.right = child\n } else {\n throw new Error('Impossible!')\n }\n if (d.isBlack()) {\n if (child.isRed()) {\n child.blacken()\n } else {\n this._fixDelete(child)\n }\n }\n this.root.blacken()\n if (isFakeChild) {\n if (child.parent.left === child) {\n child.parent.left = null\n } else if (child.parent.right === child) {\n child.parent.right = null\n } else {\n throw new Error('Impossible #3')\n }\n }\n }\n _fixDelete (n) {\n function isBlack (node) {\n return node !== null ? node.isBlack() : true\n }\n function isRed (node) {\n return node !== null ? node.isRed() : false\n }\n if (n.parent === null) {\n // this can only be called after the first iteration of fixDelete.\n return\n }\n // d was already replaced by the child\n // d is not the root\n // d and child are black\n var sibling = n.sibling\n if (isRed(sibling)) {\n // make sibling the grandfather\n n.parent.redden()\n sibling.blacken()\n if (n === n.parent.left) {\n n.parent.rotateLeft(this)\n } else if (n === n.parent.right) {\n n.parent.rotateRight(this)\n } else {\n throw new Error('Impossible #2')\n }\n sibling = n.sibling\n }\n // parent, sibling, and children of n are black\n if (n.parent.isBlack() &&\n sibling.isBlack() &&\n isBlack(sibling.left) &&\n isBlack(sibling.right)\n ) {\n sibling.redden()\n this._fixDelete(n.parent)\n } else if (n.parent.isRed() &&\n sibling.isBlack() &&\n isBlack(sibling.left) &&\n isBlack(sibling.right)\n ) {\n sibling.redden()\n n.parent.blacken()\n } else {\n if (n === n.parent.left &&\n sibling.isBlack() &&\n isRed(sibling.left) &&\n isBlack(sibling.right)\n ) {\n sibling.redden()\n sibling.left.blacken()\n sibling.rotateRight(this)\n sibling = n.sibling\n } else if (n === n.parent.right &&\n sibling.isBlack() &&\n isRed(sibling.right) &&\n isBlack(sibling.left)\n ) {\n sibling.redden()\n sibling.right.blacken()\n sibling.rotateLeft(this)\n sibling = n.sibling\n }\n sibling.color = n.parent.color\n n.parent.blacken()\n if (n === n.parent.left) {\n sibling.right.blacken()\n n.parent.rotateLeft(this)\n } else {\n sibling.left.blacken()\n n.parent.rotateRight(this)\n }\n }\n }\n * put (v) {\n if (v == null || v.id == null || v.id.constructor !== Array) {\n throw new Error('v is expected to have an id property which is an Array!')\n }\n var node = new N(v)\n if (this.root !== null) {\n var p = this.root // p abbrev. parent\n while (true) {\n if (Y.utils.smaller(node.val.id, p.val.id)) {\n if (p.left === null) {\n p.left = node\n break\n } else {\n p = p.left\n }\n } else if (Y.utils.smaller(p.val.id, node.val.id)) {\n if (p.right === null) {\n p.right = node\n break\n } else {\n p = p.right\n }\n } else {\n p.val = node.val\n return p\n }\n }\n this._fixInsert(node)\n } else {\n this.root = node\n }\n this.length++\n this.root.blacken()\n return node\n }\n _fixInsert (n) {\n if (n.parent === null) {\n n.blacken()\n return\n } else if (n.parent.isBlack()) {\n return\n }\n var uncle = n.getUncle()\n if (uncle !== null && uncle.isRed()) {\n // Note: parent: red, uncle: red\n n.parent.blacken()\n uncle.blacken()\n n.grandparent.redden()\n this._fixInsert(n.grandparent)\n } else {\n // Note: parent: red, uncle: black or null\n // Now we transform the tree in such a way that\n // either of these holds:\n // 1) grandparent.left.isRed\n // and grandparent.left.left.isRed\n // 2) grandparent.right.isRed\n // and grandparent.right.right.isRed\n if (n === n.parent.right && n.parent === n.grandparent.left) {\n n.parent.rotateLeft(this)\n // Since we rotated and want to use the previous\n // cases, we need to set n in such a way that\n // n.parent.isRed again\n n = n.left\n } else if (n === n.parent.left && n.parent === n.grandparent.right) {\n n.parent.rotateRight(this)\n // see above\n n = n.right\n }\n // Case 1) or 2) hold from here on.\n // Now traverse grandparent, make parent a black node\n // on the highest level which holds two red nodes.\n n.parent.blacken()\n n.grandparent.redden()\n if (n === n.parent.left) {\n // Case 1\n n.grandparent.rotateRight(this)\n } else {\n // Case 2\n n.grandparent.rotateLeft(this)\n }\n }\n }\n * flush () {}\n }\n\n Y.utils.RBTree = RBTree\n}\n"]}