From 75793d0ced5f9f9d4db267cfa955e76a4a6b9383 Mon Sep 17 00:00:00 2001
From: Kevin Jahns <kevin.jahns@rwth-aachen.de>
Date: Sun, 28 Jun 2015 01:42:17 +0200
Subject: [PATCH] added memory data store

---
 src/Connectors/Test.js |  2 +-
 src/Operations.js      | 45 ++++++++++++++++++++++++++++++++++++++++++
 src/y.js               |  9 +++++++++
 3 files changed, 55 insertions(+), 1 deletion(-)

diff --git a/src/Connectors/Test.js b/src/Connectors/Test.js
index 0e1ac5d1..305d308f 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 84937ed0..9f323080 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 84735497..574ff12e 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 ;)");
+    };
+  }
 }
-- 
GitLab