class OTClient: def __init__(self, id): self.id = id self.ot = OTEngine(id) self.list = [] self.queue = None def start(self): if (self.queue == None): raise Exception("Already started!") for i in range(len(self.queue)): v = self.queue[i] self._apply(self.ot.remoteEvent(v[0], v[1])) self.queue = None def stop(self): if (self.queue != None): raise Exception("Already stopped!") self.queue = [] def insert(self, pos, val): if (pos < 0 or pos > len(self.list)): raise Exception("Out of bounds!") self.list.insert(pos, val) op = self.ot.createOp("list", val, "insert", pos) return self.ot.localEvent(op) def update(self, pos, val): if (pos < 0 or pos >= len(self.list)): raise Exception("Out of bounds!") self.list[pos] = val op = self.ot.createOp("list", val, "update", pos) return self.ot.localEvent(op) def delete(self, pos): if (pos < 0 or pos >= len(self.list)): raise Exception("Out of bounds!") self.list.pop(pos) op = self.ot.createOp("list", None, "delete", pos) return self.ot.localEvent(op) def remote(self, order, op): if (self.queue != None): self.queue.append((order, op)) else: self._apply(self.ot.remoteEvent(order, op)) def _apply(self, op): type = op["type"] position = op["position"] value = op["value"] if ("insert" == type): self.list.insert(position, value) elif ("update" == type): self.list[position] = value elif ("delete" == type): self.list.pop(position)
def __init__(self, id): self.id = id self.ot = OTEngine(id) self.list = [] self.queue = None