var basic_ops_uninitialized, __extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, __hasProp = {}.hasOwnProperty; basic_ops_uninitialized = require("./Basic"); module.exports = function() { var basic_ops, ops; basic_ops = basic_ops_uninitialized(); ops = basic_ops.operations; ops.MapManager = (function(_super) { __extends(MapManager, _super); function MapManager(custom_type, uid) { this._map = {}; MapManager.__super__.constructor.call(this, custom_type, uid); } MapManager.prototype.type = "MapManager"; MapManager.prototype.applyDelete = function() { var name, p, _ref; _ref = this._map; for (name in _ref) { p = _ref[name]; p.applyDelete(); } return MapManager.__super__.applyDelete.call(this); }; MapManager.prototype.cleanup = function() { return MapManager.__super__.cleanup.call(this); }; MapManager.prototype.map = function(f) { var n, v, _ref; _ref = this._map; for (n in _ref) { v = _ref[n]; f(n, v); } return void 0; }; MapManager.prototype.val = function(name, content) { var o, prop, rep, res, result, _ref; if (arguments.length > 1) { if ((content != null) && (content._getModel != null)) { rep = content._getModel(this.custom_types, this.operations); } else { rep = content; } this.retrieveSub(name).replace(rep); return this.getCustomType(); } else if (name != null) { prop = this._map[name]; if ((prop != null) && !prop.isContentDeleted()) { res = prop.val(); if (res instanceof ops.Operation) { return res.getCustomType(); } else { return res; } } else { return void 0; } } else { result = {}; _ref = this._map; for (name in _ref) { o = _ref[name]; if (!o.isContentDeleted()) { result[name] = o.val(); } } return result; } }; MapManager.prototype["delete"] = function(name) { var _ref; if ((_ref = this._map[name]) != null) { _ref.deleteContent(); } return this; }; MapManager.prototype.retrieveSub = function(property_name) { var event_properties, event_this, rm, rm_uid; if (this._map[property_name] == null) { event_properties = { name: property_name }; event_this = this; rm_uid = { noOperation: true, sub: property_name, alt: this }; rm = new ops.ReplaceManager(null, event_properties, event_this, rm_uid); this._map[property_name] = rm; rm.setParent(this, property_name); rm.execute(); } return this._map[property_name]; }; return MapManager; })(ops.Operation); ops.MapManager.parse = function(json) { var custom_type, uid; uid = json['uid'], custom_type = json['custom_type']; return new this(custom_type, uid); }; ops.ListManager = (function(_super) { __extends(ListManager, _super); function ListManager(custom_type, uid) { this.beginning = new ops.Delimiter(void 0, void 0); this.end = new ops.Delimiter(this.beginning, void 0); this.beginning.next_cl = this.end; this.beginning.execute(); this.end.execute(); ListManager.__super__.constructor.call(this, custom_type, uid); } ListManager.prototype.type = "ListManager"; ListManager.prototype.applyDelete = function() { var o; o = this.beginning; while (o != null) { o.applyDelete(); o = o.next_cl; } return ListManager.__super__.applyDelete.call(this); }; ListManager.prototype.cleanup = function() { return ListManager.__super__.cleanup.call(this); }; ListManager.prototype.toJson = function(transform_to_value) { var i, o, val, _i, _len, _results; if (transform_to_value == null) { transform_to_value = false; } val = this.val(); _results = []; for (o = _i = 0, _len = val.length; _i < _len; o = ++_i) { i = val[o]; if (o instanceof ops.Object) { _results.push(o.toJson(transform_to_value)); } else if (o instanceof ops.ListManager) { _results.push(o.toJson(transform_to_value)); } else if (transform_to_value && o instanceof ops.Operation) { _results.push(o.val()); } else { _results.push(o); } } return _results; }; ListManager.prototype.execute = function() { if (this.validateSavedOperations()) { this.beginning.setParent(this); this.end.setParent(this); return ListManager.__super__.execute.apply(this, arguments); } else { return false; } }; ListManager.prototype.getLastOperation = function() { return this.end.prev_cl; }; ListManager.prototype.getFirstOperation = function() { return this.beginning.next_cl; }; ListManager.prototype.toArray = function() { var o, result; o = this.beginning.next_cl; result = []; while (o !== this.end) { if (!o.is_deleted) { result.push(o.val()); } o = o.next_cl; } return result; }; ListManager.prototype.map = function(f) { var o, result; o = this.beginning.next_cl; result = []; while (o !== this.end) { if (!o.is_deleted) { result.push(f(o)); } o = o.next_cl; } return result; }; ListManager.prototype.fold = function(init, f) { var o; o = this.beginning.next_cl; while (o !== this.end) { if (!o.is_deleted) { init = f(init, o); } o = o.next_cl; } return init; }; ListManager.prototype.val = function(pos) { var o; if (pos != null) { o = this.getOperationByPosition(pos + 1); if (!(o instanceof ops.Delimiter)) { return o.val(); } else { throw new Error("this position does not exist"); } } else { return this.toArray(); } }; ListManager.prototype.ref = function(pos) { var o; if (pos != null) { o = this.getOperationByPosition(pos + 1); if (!(o instanceof ops.Delimiter)) { return o; } else { throw new Error("this position does not exist"); } } else { throw new Error("you must specify a position parameter"); } }; ListManager.prototype.getOperationByPosition = function(position) { var o; o = this.beginning; while (true) { if (o instanceof ops.Delimiter && (o.prev_cl != null)) { o = o.prev_cl; while (o.isDeleted() && (o.prev_cl != null)) { o = o.prev_cl; } break; } if (position <= 0 && !o.isDeleted()) { break; } o = o.next_cl; if (!o.isDeleted()) { position -= 1; } } return o; }; ListManager.prototype.push = function(content) { return this.insertAfter(this.end.prev_cl, [content]); }; ListManager.prototype.insertAfter = function(left, contents) { var c, right, tmp, _i, _len; right = left.next_cl; while (right.isDeleted()) { right = right.next_cl; } left = right.prev_cl; if (contents instanceof ops.Operation) { (new ops.Insert(null, content, void 0, void 0, left, right)).execute(); } else { for (_i = 0, _len = contents.length; _i < _len; _i++) { c = contents[_i]; if ((c != null) && (c._name != null) && (c._getModel != null)) { c = c._getModel(this.custom_types, this.operations); } tmp = (new ops.Insert(null, c, void 0, void 0, left, right)).execute(); left = tmp; } } return this; }; ListManager.prototype.insert = function(position, contents) { var ith; ith = this.getOperationByPosition(position); return this.insertAfter(ith, contents); }; ListManager.prototype["delete"] = function(position, length) { var d, delete_ops, i, o, _i; if (length == null) { length = 1; } o = this.getOperationByPosition(position + 1); delete_ops = []; for (i = _i = 0; 0 <= length ? _i < length : _i > length; i = 0 <= length ? ++_i : --_i) { if (o instanceof ops.Delimiter) { break; } d = (new ops.Delete(null, void 0, o)).execute(); o = o.next_cl; while ((!(o instanceof ops.Delimiter)) && o.isDeleted()) { o = o.next_cl; } delete_ops.push(d._encode()); } return this; }; ListManager.prototype.callOperationSpecificInsertEvents = function(op) { var getContentType; getContentType = function(content) { if (content instanceof ops.Operation) { return content.getCustomType(); } else { return content; } }; return this.callEvent([ { type: "insert", position: op.getPosition(), object: this.getCustomType(), changedBy: op.uid.creator, value: getContentType(op.content) } ]); }; ListManager.prototype.callOperationSpecificDeleteEvents = function(op, del_op) { return this.callEvent([ { type: "delete", position: op.getPosition(), object: this.getCustomType(), length: 1, changedBy: del_op.uid.creator, oldValue: op.val() } ]); }; return ListManager; })(ops.Operation); ops.ListManager.parse = function(json) { var custom_type, uid; uid = json['uid'], custom_type = json['custom_type']; return new this(custom_type, uid); }; ops.Composition = (function(_super) { __extends(Composition, _super); function Composition(custom_type, _at_composition_value, uid, composition_ref) { this.composition_value = _at_composition_value; Composition.__super__.constructor.call(this, custom_type, uid); if (composition_ref) { this.saveOperation('composition_ref', composition_ref); } else { this.composition_ref = this.beginning; } } Composition.prototype.type = "Composition"; Composition.prototype.val = function() { return this.composition_value; }; Composition.prototype.callOperationSpecificInsertEvents = function(op) { var o; if (this.composition_ref.next_cl === op) { o.undo_delta = this.custom_type._apply(op.content); } else { o = this.end.prev_cl; while (o !== op) { this.custom_type._unapply(o.undo_delta); o = o.next_cl; } while (o !== this.end) { o.undo_delta = this.custom_type._apply(o.content); o = o.next_cl; } } this.composition_ref = this.end.prev_cl; return this.callEvent([ { type: "update", changedBy: op.uid.creator, newValue: this.val() } ]); }; Composition.prototype.callOperationSpecificDeleteEvents = function(op, del_op) {}; Composition.prototype.applyDelta = function(delta) { (new ops.Insert(null, content, this, null, this.end.prev_cl, this.end)).execute(); return void 0; }; Composition.prototype._encode = function(json) { if (json == null) { json = {}; } json.composition_value = JSON.stringify(this.composition_value); json.composition_ref = this.composition_ref.getUid(); return Composition.__super__._encode.call(this, json); }; return Composition; })(ops.ListManager); ops.Composition.parse = function(json) { var composition_ref, composition_value, custom_type, uid; uid = json['uid'], custom_type = json['custom_type'], composition_value = json['composition_value'], composition_ref = json['composition_ref']; return new this(custom_type, JSON.parse(composition_value), uid, composition_ref); }; ops.ReplaceManager = (function(_super) { __extends(ReplaceManager, _super); function ReplaceManager(custom_type, _at_event_properties, _at_event_this, uid) { this.event_properties = _at_event_properties; this.event_this = _at_event_this; if (this.event_properties['object'] == null) { this.event_properties['object'] = this.event_this.getCustomType(); } ReplaceManager.__super__.constructor.call(this, custom_type, uid); } ReplaceManager.prototype.type = "ReplaceManager"; ReplaceManager.prototype.callEventDecorator = function(events) { var event, name, prop, _i, _len, _ref; if (!this.isDeleted()) { for (_i = 0, _len = events.length; _i < _len; _i++) { event = events[_i]; _ref = this.event_properties; for (name in _ref) { prop = _ref[name]; event[name] = prop; } } this.event_this.callEvent(events); } return void 0; }; ReplaceManager.prototype.callOperationSpecificInsertEvents = function(op) { var old_value; if (op.next_cl.type === "Delimiter" && op.prev_cl.type !== "Delimiter") { if (!op.is_deleted) { old_value = op.prev_cl.val(); this.callEventDecorator([ { type: "update", changedBy: op.uid.creator, oldValue: old_value } ]); } op.prev_cl.applyDelete(); } else if (op.next_cl.type !== "Delimiter") { op.applyDelete(); } else { this.callEventDecorator([ { type: "add", changedBy: op.uid.creator } ]); } return void 0; }; ReplaceManager.prototype.callOperationSpecificDeleteEvents = function(op, del_op) { if (op.next_cl.type === "Delimiter") { return this.callEventDecorator([ { type: "delete", changedBy: del_op.uid.creator, oldValue: op.val() } ]); } }; ReplaceManager.prototype.replace = function(content, replaceable_uid) { var o, relp; o = this.getLastOperation(); relp = (new ops.Insert(null, content, this, replaceable_uid, o, o.next_cl)).execute(); return void 0; }; ReplaceManager.prototype.isContentDeleted = function() { return this.getLastOperation().isDeleted(); }; ReplaceManager.prototype.deleteContent = function() { (new ops.Delete(null, void 0, this.getLastOperation().uid)).execute(); return void 0; }; ReplaceManager.prototype.val = function() { var o; o = this.getLastOperation(); return typeof o.val === "function" ? o.val() : void 0; }; return ReplaceManager; })(ops.ListManager); return basic_ops; };