diff --git a/src/Connectors/Test.js b/src/Connectors/Test.js index 0e1ac5d17fca51a72d3d960df0841873606d00b6..305d308f9c96a4711fb76c6d3e7bc8f6cbbcbc00 100644 --- a/src/Connectors/Test.js +++ b/src/Connectors/Test.js @@ -1,4 +1,4 @@ -// returns a rendom element of o +// returns a random element of o // works on Object, and Array function getRandom (o) { if (o instanceof Array) { diff --git a/src/Operations.js b/src/Operations.js index 84937ed07fb65d25294cd5553bda069b1273bc0b..9f3230802a0cbefa0a696e42ad74f70b6ede95be 100644 --- a/src/Operations.js +++ b/src/Operations.js @@ -169,5 +169,50 @@ var Struct = { o = yield* Struct.Insert.create.call(this, {}, content, o, or, op); } } + }, + Map: { + create: function*( op : Op){ + op.start = null; + op.end = null; + op.struct = "Map"; + return yield* Struct.Operation.create.call(this, op); + }, + requiredOps: function(op, ids){ + if (op.start != null) { + ids.push(op.start); + } + if (op.end != null){ + ids.push(op.end); + } + return ids; + }, + execute: function* () { + // nop + }, + ref: function* (op : Op, pos : number) : Insert { + var o = op.start; + while ( pos !== 0 || o != null) { + o = (yield* this.getOperation(o)).right; + pos--; + } + return (o == null) ? null : yield* this.getOperation(o); + }, + map: function* (o : Op, f : Function) : Array<any> { + o = o.start; + var res = []; + while ( o != null) { + var operation = yield* this.getOperation(o); + res.push(f(operation.content)); + o = operation.right; + } + return res; + }, + insert: function* (op, pos : number, contents : Array<any>) { + var o = yield* Struct.List.ref.call(this, op, pos); + var or = yield* this.getOperation(o.right); + for (var content of contents) { + o = yield* Struct.Insert.create.call(this, {}, content, o, or, op); + } + } } }; diff --git a/src/y.js b/src/y.js index 847354979b285187407fbd685b0ad89baa2dfb22..574ff12e46ce438e2e7dd168ae41bbb9c1596638 100644 --- a/src/y.js +++ b/src/y.js @@ -8,4 +8,13 @@ class Y { //eslint-disable-line no-unused-vars transact (generator) { this.db.requestTransaction(generator); } + destroy () { + this.connector.disconnect(); + this.db.removeDatabase(); + this.connector = null; + this.db = null; + this.transact = function(){ + throw new Error("Remember?, you destroyed this type ;)"); + }; + } }