{"version":3,"sources":["../yjs/node_modules/browserify/node_modules/browser-pack/_prelude.js","src/Array.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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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-array.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<r.length;o++)s(r[o]);return s})","/* global Y */\n'use strict'\n\nfunction extend (Y) {\n  class YArray {\n    constructor (os, _model, _content) {\n      this.os = os\n      this._model = _model\n      // Array of all the neccessary content\n      this._content = _content\n      this.eventHandler = new Y.utils.EventHandler((op) => {\n        if (op.struct === 'Insert') {\n          let pos\n          // we check op.left only!,\n          // because op.right might not be defined when this is called\n          if (op.left === null) {\n            pos = 0\n          } else {\n            pos = 1 + this._content.findIndex(function (c) {\n              return Y.utils.compareIds(c.id, op.left)\n            })\n            if (pos <= 0) {\n              throw new Error('Unexpected operation!')\n            }\n          }\n          var values\n          var length\n          if (op.hasOwnProperty('opContent')) {\n            this._content.splice(pos, 0, {\n              id: op.id,\n              type: op.opContent\n            })\n            let opContent = op.opContent\n            length = 1\n            values = () => {\n              return new Promise((resolve) => {\n                this.os.requestTransaction(function *() {\n                  var type = yield* this.getType(opContent)\n                  resolve([type])\n                })\n              })\n            }\n          } else {\n            var contents = op.content.map(function (c, i) {\n              return {\n                id: [op.id[0], op.id[1] + i],\n                val: c\n              }\n            })\n            // insert value in _content\n            this._content.splice.apply(this._content, [pos, 0].concat(contents))\n            values = op.content\n            length = op.content.length\n          }\n          this.eventHandler.callEventListeners({\n            type: 'insert',\n            object: this,\n            index: pos,\n            values: values,\n            // valueId: valueId, // TODO: does this still work as expected?\n            length: length\n          })\n        } else if (op.struct === 'Delete') {\n          var i = 0 // current position in _content\n          for (; i < this._content.length && op.length > 0; i++) {\n            var c = this._content[i]\n            if (Y.utils.inDeletionRange(op, c.id)) {\n              // is in deletion range!\n              var delLength\n              // check how many character to delete in one flush\n              for (delLength = 1;\n                    delLength < op.length && i + delLength < this._content.length && Y.utils.inDeletionRange(op, this._content[i + delLength].id);\n                    delLength++) {}\n              // last operation thas will be deleted\n              c = this._content[i + delLength - 1]\n              // update delete operation\n              op.length -= c.id[1] - op.target[1] + 1\n              op.target = [c.id[0], c.id[1] + 1]\n              // apply deletion & find send event\n              let content = this._content.splice(i, delLength)\n              // TODO: how about return types\n              let values = content.map(function (c) { return c.val })\n              this.eventHandler.callEventListeners({\n                type: 'delete',\n                object: this,\n                index: i,\n                values: values,\n                _content: content,\n                length: delLength\n              })\n              // with the fresh delete op, we can continue\n              // note: we don't have to increment i, because the i-th content was deleted\n              // but on the other had, the (i+delLength)-th was not in deletion range\n              // So we don't do i--\n            }\n          }\n        } else {\n          throw new Error('Unexpected struct!')\n        }\n      })\n    }\n    _destroy () {\n      this.eventHandler.destroy()\n      this.eventHandler = null\n      this._content = null\n      this._model = null\n      this.os = null\n    }\n    get length () {\n      return this._content.length\n    }\n    get (pos) {\n      if (pos == null || typeof pos !== 'number') {\n        throw new Error('pos must be a number!')\n      }\n      if (pos >= this._content.length) {\n        return undefined\n      }\n      if (this._content[pos].type == null) {\n        return this._content[pos].val\n      } else {\n        var oid = this._content[pos].type\n        return new Promise((resolve) => {\n          this.os.requestTransaction(function *() {\n            var type = yield* this.getType(oid)\n            resolve(type)\n          })\n        })\n      }\n    }\n    // only returns primitive values\n    toArray () {\n      return this._content.map(function (x, i) {\n        return x.val\n      })\n    }\n    push (contents) {\n      return this.insert(this._content.length, contents)\n    }\n    insert (pos, contents) {\n      if (typeof pos !== 'number') {\n        throw new Error('pos must be a number!')\n      }\n      if (!(contents instanceof Array)) {\n        throw new Error('contents must be an Array of objects!')\n      }\n      if (contents.length === 0) {\n        return\n      }\n      if (pos > this._content.length || pos < 0) {\n        throw new Error('This position exceeds the range of the array!')\n      }\n      var mostLeft = pos === 0 ? null : this._content[pos - 1].id\n\n      var ops = []\n      var newTypes = []\n      var prevId = mostLeft\n      for (var i = 0; i < contents.length;) {\n        var op = {\n          left: prevId,\n          origin: prevId,\n          // right: mostRight,\n          // NOTE: I intentionally do not define right here, because it could be deleted\n          // at the time of inserting this operation (when we get the transaction),\n          // and would therefore not defined in this._content\n          parent: this._model,\n          struct: 'Insert'\n        }\n        var _content = []\n        var typeDefinition\n        while (i < contents.length) {\n          var val = contents[i++]\n          typeDefinition = Y.utils.isTypeDefinition(val)\n          if (!typeDefinition) {\n            _content.push(val)\n          } else if (_content.length > 0) {\n            i-- // come back again later\n            break\n          } else {\n            break\n          }\n        }\n        if (_content.length > 0) {\n          // content is defined\n          op.content = _content\n          op.id = this.os.getNextOpId(_content.length)\n        } else {\n          // otherwise its a type\n          var typeid = this.os.getNextOpId(1)\n          newTypes.push([typeDefinition, typeid])\n          op.opContent = typeid\n          op.id = this.os.getNextOpId(1)\n        }\n        ops.push(op)\n        prevId = op.id\n      }\n      var eventHandler = this.eventHandler\n      this.os.requestTransaction(function *() {\n        // now we can set the right reference.\n        var mostRight\n        if (mostLeft != null) {\n          var ml = yield* this.getInsertionCleanEnd(mostLeft)\n          mostRight = ml.right\n        } else {\n          mostRight = (yield* this.getOperation(ops[0].parent)).start\n        }\n        for (var i = 0; i < newTypes.length; i++) {\n          yield* this.createType.apply(this, newTypes[i])\n        }\n        for (var j = 0; j < ops.length; j++) {\n          var op = ops[j]\n          op.right = mostRight\n        }\n        yield* eventHandler.awaitOps(this, this.applyCreatedOperations, [ops])\n      })\n      eventHandler.awaitAndPrematurelyCall(ops)\n    }\n    delete (pos, length) {\n      if (length == null) { length = 1 }\n      if (typeof length !== 'number') {\n        throw new Error('length must be a number!')\n      }\n      if (typeof pos !== 'number') {\n        throw new Error('pos must be a number!')\n      }\n      if (pos + length > this._content.length || pos < 0 || length < 0) {\n        throw new Error('The deletion range exceeds the range of the array!')\n      }\n      if (length === 0) {\n        return\n      }\n      var eventHandler = this.eventHandler\n      var dels = []\n      for (var i = 0; i < length; i = i + delLength) {\n        var targetId = this._content[pos + i].id\n        var delLength\n        // how many insertions can we delete in one deletion?\n        for (delLength = 1; i + delLength < length; delLength++) {\n          if (!Y.utils.compareIds(this._content[pos + i + delLength].id, [targetId[0], targetId[1] + delLength])) {\n            break\n          }\n        }\n        dels.push({\n          target: targetId,\n          struct: 'Delete',\n          length: delLength\n        })\n      }\n      eventHandler.awaitAndPrematurelyCall(dels)\n      this.os.requestTransaction(function *() {\n        yield* eventHandler.awaitOps(this, this.applyCreatedOperations, [dels])\n      })\n    }\n    observe (f) {\n      this.eventHandler.addEventListener(f)\n    }\n    unobserve (f) {\n      this.eventHandler.removeEventListener(f)\n    }\n    * _changed (transaction, op) {\n      if (!op.deleted) {\n        if (op.struct === 'Insert') {\n          var l = op.left\n          var left\n          while (l != null) {\n            left = yield* transaction.getInsertion(l)\n            if (!left.deleted) {\n              break\n            }\n            l = left.left\n          }\n          op.left = l\n        }\n        this.eventHandler.receivedOp(op)\n      }\n    }\n  }\n\n  Y.extend('Array', new Y.utils.CustomType({\n    name: 'Array',\n    class: YArray,\n    struct: 'List',\n    initType: function * YArrayInitializer (os, model) {\n      var _content = []\n      yield* Y.Struct.List.map.call(this, model, function (op) {\n        if (op.hasOwnProperty('opContent')) {\n          _content.push({\n            id: op.id,\n            type: op.opContent\n          })\n        } else {\n          op.content.forEach(function (c, i) {\n            _content.push({\n              id: [op.id[0], op.id[1] + i],\n              val: op.content[i]\n            })\n          })\n        }\n      })\n      return new YArray(os, model.id, _content)\n    }\n  }))\n}\n\nmodule.exports = extend\nif (typeof Y !== 'undefined') {\n  extend(Y)\n}\n"]}