pessimism
Version:
A fast HAMT Map intended for KV caching and optimistic updates
165 lines (150 loc) • 7.39 kB
JavaScript
;
var Jest = require("@glennsl/bs-jest/lib/js/src/jest.js");
var $$Array = require("bs-platform/lib/js/array.js");
var Curry = require("bs-platform/lib/js/curry.js");
var Pessimism = require("../src/pessimism.js");
var Caml_array = require("bs-platform/lib/js/caml_array.js");
var ca = "coest";
var cb = "01pcj";
Jest.test("works for values on a single Index node", (function (param) {
var words = /* array */[
"hello",
"world",
"test"
];
var map = Pessimism.set(Pessimism.set(Pessimism.set(Pessimism.make(/* () */0), Caml_array.caml_array_get(words, 0), Caml_array.caml_array_get(words, 0)), Caml_array.caml_array_get(words, 1), Caml_array.caml_array_get(words, 1)), Caml_array.caml_array_get(words, 2), Caml_array.caml_array_get(words, 2));
var words_out = $$Array.map((function (x) {
return Pessimism.get(map, x);
}), words);
return Curry._2(Jest.Expect[/* Operators */25][/* = */5], Jest.Expect[/* expect */0](words_out), $$Array.map((function (x) {
return x;
}), words));
}));
Jest.test("works for values on nested Index nodes", (function (param) {
var map = Pessimism.set(Pessimism.set(Pessimism.make(/* () */0), ca, ca), cb, cb);
var expected = /* array */[
ca,
cb
];
var actual = /* array */[
Pessimism.get(map, ca),
Pessimism.get(map, cb)
];
return Curry._2(Jest.Expect[/* Operators */25][/* = */5], Jest.Expect[/* expect */0](actual), expected);
}));
Jest.test("works for values that are colliding", (function (param) {
var words = /* array */[
"hetairas",
"mentioner",
"heliotropes",
"neurospora"
];
var map = Pessimism.set(Pessimism.set(Pessimism.set(Pessimism.set(Pessimism.make(/* () */0), Caml_array.caml_array_get(words, 0), Caml_array.caml_array_get(words, 0)), Caml_array.caml_array_get(words, 1), Caml_array.caml_array_get(words, 1)), Caml_array.caml_array_get(words, 2), Caml_array.caml_array_get(words, 2)), Caml_array.caml_array_get(words, 3), Caml_array.caml_array_get(words, 3));
var words_out = $$Array.map((function (x) {
return Pessimism.get(map, x);
}), words);
return Curry._2(Jest.Expect[/* Operators */25][/* = */5], Jest.Expect[/* expect */0](words_out), $$Array.map((function (x) {
return x;
}), words));
}));
Jest.test("works for transitive changes", (function (param) {
var words = /* array */[
"hello",
"world",
"test",
"hetairas",
"mentioner",
"heliotropes",
"neurospora"
];
var map = /* record */[/* contents */Pessimism.asMutable(Pessimism.make(/* () */0))];
$$Array.iter((function (word) {
map[0] = Pessimism.set(map[0], word, word);
return /* () */0;
}), words);
var map$1 = Pessimism.asImmutable(map[0]);
var words_out = $$Array.map((function (x) {
return Pessimism.get(map$1, x);
}), words);
return Curry._2(Jest.Expect[/* Operators */25][/* = */5], Jest.Expect[/* expect */0](words_out), $$Array.map((function (x) {
return x;
}), words));
}));
Jest.test("deletes values correctly", (function (param) {
var words = /* array */[
"hello",
"world",
"test"
];
var map = Pessimism.remove(Pessimism.set(Pessimism.set(Pessimism.set(Pessimism.make(/* () */0), Caml_array.caml_array_get(words, 0), Caml_array.caml_array_get(words, 0)), Caml_array.caml_array_get(words, 1), Caml_array.caml_array_get(words, 1)), Caml_array.caml_array_get(words, 2), Caml_array.caml_array_get(words, 2)), Caml_array.caml_array_get(words, 1));
var a = Pessimism.get(map, Caml_array.caml_array_get(words, 0));
var b = Pessimism.get(map, Caml_array.caml_array_get(words, 1));
return Curry._2(Jest.Expect[/* Operators */25][/* = */5], Jest.Expect[/* expect */0](/* array */[
a,
b
]), /* array */[
Caml_array.caml_array_get(words, 0),
undefined
]);
}));
Jest.test("deleted values correctly on nested Index nodes", (function (param) {
var map = Pessimism.remove(Pessimism.set(Pessimism.set(Pessimism.make(/* () */0), ca, ca), cb, cb), ca);
var expected = /* array */[
undefined,
cb
];
var actual = /* array */[
Pessimism.get(map, ca),
Pessimism.get(map, cb)
];
return Curry._2(Jest.Expect[/* Operators */25][/* = */5], Jest.Expect[/* expect */0](actual), expected);
}));
Jest.test("sets optimistic values and clears them", (function (param) {
var map = Pessimism.setOptimistic(Pessimism.set(Pessimism.make(/* () */0), "key", "permanent"), "key", "temporary", 1);
var before = Pessimism.get(map, "key");
var map$1 = Pessimism.setOptimistic(map, "key", "temporary2", 2);
var middle = Pessimism.get(map$1, "key");
var map$2 = Pessimism.clearOptimistic(map$1, 1);
var after = Pessimism.get(map$2, "key");
var map$3 = Pessimism.clearOptimistic(map$2, 2);
var after2 = Pessimism.get(map$3, "key");
return Curry._2(Jest.Expect[/* Operators */25][/* = */5], Jest.Expect[/* expect */0](/* array */[
before,
middle,
after,
after2
]), /* array */[
"temporary",
"temporary2",
"temporary2",
"permanent"
]);
}));
Jest.test("sets optimistic values and overrides them if needed", (function (param) {
var map = Pessimism.setOptimistic(Pessimism.set(Pessimism.make(/* () */0), "key", "permanent"), "key", "temporary", 1);
var before = Pessimism.get(map, "key");
var map$1 = Pessimism.set(map, "key", "permanent2");
var after = Pessimism.get(map$1, "key");
return Curry._2(Jest.Expect[/* Operators */25][/* = */5], Jest.Expect[/* expect */0](/* array */[
before,
after
]), /* array */[
"temporary",
"permanent2"
]);
}));
Jest.test("supports setting and retrieving undefined", (function (param) {
var map = Pessimism.setOptimistic(Pessimism.set(Pessimism.make(/* () */0), "key", "permanent"), "key", undefined, 1);
var before = Pessimism.getUndefined(map, "key");
var map$1 = Pessimism.clearOptimistic(map, 1);
var after = Pessimism.getUndefined(map$1, "key");
return Curry._2(Jest.Expect[/* Operators */25][/* = */5], Jest.Expect[/* expect */0](/* array */[
before,
after
]), ([undefined, 'permanent']));
}));
var it = Jest.test;
exports.it = it;
exports.ca = ca;
exports.cb = cb;
/* Not a pure module */