diff --git a/bench.js b/bench.js
new file mode 100644
index 0000000..817257a
--- /dev/null
+++ b/bench.js
@@ -0,0 +1,327 @@
+import { text_data } from "../demo/data/gulliver.js";
+
+export let suite = {};
+export const test = {};
+const result = document.getElementById("result").appendChild(document.createTextNode("running..."));
+const match = window.location.hash.indexOf("match") !== -1;
+export const queue = [];
+let lib;
+
+const params = (function(){
+
+ const obj = {};
+ const pairs = window.location.search.substring(1).split('&');
+
+ for(let i = 0, split; i < pairs.length; i++){
+ split = pairs[i].split('=');
+ obj[split[0]] = split[1];
+ }
+
+ return obj;
+}());
+
+let runs;
+let duration;
+
+if(params["duration"] && (params["duration"].indexOf("run-") !== -1)){
+
+ duration = 86400000;
+ runs = parseInt(params["duration"].replace("run-", ""), 10);
+}
+else{
+
+ duration = parseFloat(params["duration"] || "5") * 1000;
+}
+
+// if(match){
+//
+// text_data.push('zero one two three four five six seven eight nine ten');
+// text_data.push('four two zero one three ten five seven eight six nine');
+// text_data.push('zero one two three four five six seven eight nine ten');
+// }
+
+// queue.push({
+// name: "add",
+// init: null,
+// test: null,
+// start: null,
+// prepare: null,
+// fn: function(){
+// lib.init();
+// lib.add(text_data);
+// },
+// end: null,
+// complete: null,
+// count: text_data.length
+// });
+//
+// queue.push({
+// name: "update",
+// init: null,
+// test: null,
+// start: function(){
+// lib.init();
+// lib.add(text_data);
+// },
+// prepare: null,
+// fn: function(){
+// lib.add(text_data);
+// },
+// end: null,
+// complete: null,
+// count: text_data.length
+// });
+//
+// let index;
+//
+// queue.push({
+// name: "remove",
+// init: null,
+// test: null,
+// start: function(){
+// lib.init();
+// lib.add(text_data);
+// index = 0;
+// },
+// prepare: null,
+// fn: function(){
+// lib.remove(index++);
+// },
+// end: null,
+// complete: null,
+// cycle: text_data.length,
+// count: 1
+// });
+
+queue.push({
+ name: "query-single",
+ init: null,
+ test: null,
+ start: null,
+ prepare: null,
+ fn: function(){
+ lib.query("gulliver");
+ lib.query("great");
+ lib.query("country");
+ lib.query("time");
+ lib.query("people");
+ lib.query("little");
+ lib.query("master");
+ lib.query("took");
+ lib.query("feet");
+ lib.query("houyhnhnms");
+ },
+ end: null,
+ complete: null,
+ count: 10
+});
+
+queue.push({
+ name: "query-multi",
+ init: null,
+ test: null,
+ start: null,
+ prepare: null,
+ fn: function(){
+ lib.query("italians homunceletino");
+ lib.query("theodorus vangrult");
+ lib.query("virtuous houyhnhnms");
+ lib.query("creature discovered");
+ lib.query("lord high chancellor");
+ },
+ end: null,
+ complete: null,
+ count: 5
+});
+
+queue.push({
+ name: "query-long",
+ init: null,
+ test: null,
+ start: null,
+ prepare: null,
+ fn: function(){
+ lib.query("there were six spanish pieces of four pistoles");
+ lib.query("glumdalclitch and i attended the king and queen in a progress");
+ lib.query("only in this island of luggnagg the appetite for living was not so eager");
+ },
+ end: null,
+ complete: null,
+ count: 3
+});
+
+queue.push({
+ name: "query-dupes",
+ init: null,
+ test: null,
+ start: null,
+ prepare: null,
+ fn: function(){
+ lib.query("gulliver gulliver gulliver");
+ lib.query("italians homunceletino italians homunceletino");
+ },
+ end: null,
+ complete: null,
+ count: 2
+});
+
+queue.push({
+ name: "not-found",
+ init: null,
+ test: null,
+ start: null,
+ prepare: null,
+ fn: function(){
+ lib.query("undefined");
+ lib.query("undefineda undefinedb undefinedc");
+ lib.query("lord high undefined");
+ },
+ end: null,
+ complete: null,
+ count: 3
+});
+
+// #####################################################################################
+// #####################################################################################
+
+window.onload = function(){
+
+ if(queue.length){
+
+ lib = suite[Object.keys(suite)[0]];
+ lib.init();
+ lib.add(text_data);
+
+ setTimeout(match ? perform_match : perform, 200);
+ }
+};
+
+// #####################################################################################
+// #####################################################################################
+
+function check_test(test){
+
+ if(test.init) test.init();
+ if(test.start) test.start();
+ if(test.prepare) test.prepare();
+ test.fn();
+ const results = lib.query("gulliver");
+ if(test.end) test.end();
+ if(test.complete) test.complete();
+
+ //console.log(results);
+
+ return results.length >= 6;
+}
+
+function msg(message, a){
+
+ a ? console.error(message, a) : console.error(message);
+ return false;
+}
+
+// #####################################################################################
+// #####################################################################################
+
+let str_results = "";
+const perf = window.performance;
+ perf.memory || (perf.memory = { usedJSHeapSize: 0 });
+
+let current = 0;
+
+function perform(){
+
+ const test = queue[current];
+
+ if(current === 0) check_test(test) || msg("Main test failed!");
+
+ let elapsed = 0, memory = 0;
+ let status = true;
+ let loops = 0, cycle = 1, now = 0, max_cycle = test.cycle, inner_count = test.count;
+
+ if(status){
+
+ if(test.init) test.init();
+
+ const end = perf.now() + duration;
+
+ for(let start, mem_start, mem; now < end;){
+
+ if(test.start) test.start(loops);
+
+ mem_start = perf.memory.usedJSHeapSize;
+ start = perf.now();
+ for(let i = 0; i < cycle; i++) test.fn();
+ now = perf.now();
+ mem = perf.memory.usedJSHeapSize - mem_start;
+ elapsed += (now - start);
+ loops += cycle;
+ if(mem > 0) memory += mem;
+
+ if(test.end) test.end(loops);
+
+ // console.log(test.name);
+ // console.log("duration", duration);
+ // console.log("elapsed", elapsed);
+ // console.log("cycle", cycle);
+ // console.log("loops", loops);
+
+ cycle *= duration / (elapsed || 1);
+ //cycle = loops / (elapsed || 1) * (duration - elapsed);
+
+ // if(cycle < 0){
+ //
+ // break;
+ // }
+
+ if(max_cycle && (cycle > max_cycle)){
+
+ cycle = max_cycle;
+ }
+ }
+
+ if(test.complete) test.complete();
+ }
+
+ loops *= inner_count || 1;
+ current++;
+
+ if(window === window.top){
+
+ result.nodeValue = (str_results += (status ? test.name.padEnd(12) + String(Math.ceil(1000 / elapsed * loops)).padStart(8) + " op/s, Memory:\t" + (memory ? Math.ceil(memory / loops) : "-") : "- failed -") + "\n") + (current < queue.length ? "running..." : "");
+ }
+ else{
+
+ window.top.postMessage(test.name + "," + (status ? Math.ceil(1000 / elapsed * loops) : 0) + "," + (status ? Math.ceil(memory / loops) : 0), location.protocol + "//" + location.hostname); //"https://nextapps-de.github.io" "https://raw.githack.com"
+ }
+
+ if(current < queue.length){
+
+ setTimeout(perform, 200);
+ }
+ else{
+
+ current = 0;
+ }
+}
+
+function perform_match(){
+
+ const test = queue[current];
+ const query = decodeURI(params["query"]);
+
+ check_test(test) || msg("Main test failed!");
+
+ const res = lib.query(query);
+
+ if(window === window.top){
+
+ result.nodeValue = JSON.stringify(res);
+ }
+ else{
+
+ window.top.postMessage(JSON.stringify(res), location.protocol + "//" + location.hostname);
+ }
+
+
+}
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..712ad50
--- /dev/null
+++ b/index.html
@@ -0,0 +1,113 @@
+
+
+ Benchmark of Web Templating Engines (Non-Keyed)
+
+
+
+Benchmark of Full-Text-Search Libraries (Stress Test)
+
+
+
+
+
+ Library |
+ Size |
+ Memory * |
+
+ Query (Single Term) |
+ Query (Multi Term) |
+ Query (Long) |
+ Query (Dupes) |
+ Query (Not Found) |
+ Index |
+ Score |
+
+
+
+
+
+* To measure memory you have to run in Chrome browser.
+Single Tests:
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..2adf063
--- /dev/null
+++ b/index.js
@@ -0,0 +1,348 @@
+(function(){
+
+ "use strict";
+
+ const iframe = document.getElementById("iframe");
+ const options = { cache: false, store: false, pool: false };
+ const mikado = Mikado(document.getElementById("result"), "row", options);
+ const list = Mikado(document.getElementById("lib"), "lib", options);
+
+ const modes = window.location.hash.indexOf("modes") !== -1;
+ const encode = window.location.hash.indexOf("encode") !== -1;
+ const update = window.location.hash.indexOf("update") !== -1;
+
+ let keep;
+ let repeat;
+ let index = -1;
+
+ let lib = shuffle(modes || encode ? [
+
+ "flexsearch-balance", "flexsearch-default", "flexsearch-fast",
+ "flexsearch-match", "flexsearch-memory", "flexsearch-score",
+ "flexsearch-speed"
+ ]:[
+ /*"flexsearch-0.6.2", "flexsearch-0.6.3",*/ "minisearch", "flexsearch-0.7.0",
+ "bm25", "bulksearch", "elasticlunr",
+ "fuzzysearch", "js-search", "jsii",
+ "fuse", "lunr", "wade", "lyra"
+ ]);
+
+ list.render(lib);
+
+ Mikado.route("start", function(target){
+
+ if(target.value === "Start"){
+
+ index = -1;
+ repeat = document.getElementById("repeat").value;
+ target.value = "Stop";
+ setTimeout(runner, 200);
+ }
+ else{
+
+ current[index][test[2]] = "";
+ target.value = "Start";
+ iframe.src = "";
+ index = lib.length;
+ }
+
+ }).route("mode", function(target){
+
+ init(window.location.hash = "#" + target.value);
+
+ }).listen("click").listen("change");
+
+ const test = encode ? [
+
+ "size", "memory",
+ "encode"
+
+ ]: update ? [
+
+ "size", "memory",
+ "add", "update", "remove",
+ ]:[
+ "size", "memory",
+ //"add",
+ "query-single", "query-multi", "query-long", "query-dupes", "not-found"
+ ];
+
+ const current = new Array(lib.length);
+
+ // let size = {
+ //
+ // "bm25": 1,
+ // "bulksearch": 1,
+ // "elasticlunr": 1,
+ // "fuse": 1,
+ // "fuzzysearch": 1,
+ // "js-search": 1,
+ // "jsii": 1,
+ // "lunr": 1,
+ // "wade": 1,
+ //
+ // "flexsearch-0.6.2": 1,
+ // "flexsearch-0.6.3": 1,
+ // "flexsearch-0.7.0": 1,
+ //
+ // "flexsearch-balance": 1,
+ // "flexsearch-default": 1,
+ // "flexsearch-fast": 1,
+ // "flexsearch-match": 1,
+ // "flexsearch-memory": 1,
+ // "flexsearch-score": 1,
+ // "flexsearch-speed": 1
+ // };
+
+ for(let x = 0; x < lib.length; x++){
+
+ current[x] = {
+
+ "name": lib[x],
+ "size": 1, //size[lib[x]],
+ "memory": 0,
+ "score": "",
+ "index": ""
+ };
+
+ for(let y = 2; y < test.length + 1; y++){
+
+ current[x][test[y]] = "";
+ current[x]["color_" + test[y]] = "transparent";
+ }
+ }
+
+ mikado.render(current);
+
+ function runner(){
+
+ const duration = document.getElementById("duration").value;
+ keep = document.getElementById("keep").checked;
+
+ index++;
+ const tmp = Object.assign({}, current[index]);
+ tmp[test[2]] = "run...";
+ mikado.update(mikado.node(index), tmp);
+ iframe.src = "test/" + lib[index].toLowerCase() + "/" + "?duration=" + duration + (encode ? "&encode=true" : "");
+ }
+
+ function get_score(){
+
+ let max = new Array(test.length);
+ let val = new Array(test.length);
+
+ for(let y = 0; y < test.length; y++){
+
+ max[y] = 0;
+ val[y] = [];
+
+ for(let x = 0; x < lib.length; x++){
+
+ if(current[x][test[y]] && (current[x][test[y]] !== "-failed-")){
+
+ if(current[x][test[y]]){
+
+ val[y].push(current[x][test[y]]);
+ }
+
+ if((test[y] === "size") || (test[y] === "memory")){
+
+ if((current[x][test[y]] < max[y]) || !max[y]){
+
+ max[y] = current[x][test[y]];
+ }
+ }
+ else{
+
+ if(current[x][test[y]] > max[y]){
+
+ max[y] = current[x][test[y]];
+ }
+ }
+ }
+ }
+ }
+
+ let score = new Array(lib.length);
+ let index = new Array(lib.length);
+ let length = new Array(lib.length);
+ let max_score = 0, max_index = 0;
+
+ for(let x = 0; x < lib.length; x++){
+
+ score[x] = 0;
+ index[x] = 0;
+ length[x] = 0;
+
+ for(let y = 0; y < test.length; y++){
+
+ if(current[x][test[y]] && (current[x][test[y]] !== "-failed-")){
+
+ length[x]++;
+
+ if((test[y] === "size") || (test[y] === "memory")){
+
+ score[x] += Math.sqrt(median(val[y]) / current[x][test[y]]);
+ index[x] += Math.sqrt(max[y] / current[x][test[y]]);
+ current[x]["color_" + test[y]] = color(Math.sqrt(max[y]), Math.sqrt(current[x][test[y]]));
+ }
+ else{
+
+ score[x] += current[x][test[y]] / median(val[y]);
+ index[x] += current[x][test[y]] / max[y];
+ current[x]["color_" + test[y]] = color(current[x][test[y]], max[y]);
+ }
+ }
+ else{
+
+ current[x]["color_" + test[y]] = "#ccc";
+ }
+ }
+
+ current[x]["score"] = (score[x] / length[x] * 1000 + 0.5) | 0;
+ current[x]["index"] = (index[x] / length[x] * 1000 + 0.5) | 0;
+ if(max_score < current[x]["score"]) max_score = current[x]["score"];
+ if(max_index < current[x]["index"]) max_index = current[x]["index"];
+ }
+
+ for(let x = 0; x < lib.length; x++){
+
+ current[x]["color_score"] = color(current[x]["score"], max_score);
+ current[x]["color_index"] = color(current[x]["index"], max_index);
+ }
+ }
+
+ function color(current, max){
+
+ const percent = current / max * 100;
+ const r = percent < 50 ? 255 : (255 - (percent * 2 - 100) * 255 / 100) | 0;
+ const g = percent > 50 ? 255 : ((percent * 2) * 255 / 100) | 0;
+
+ return 'rgb(' + r + ', ' + g + ', 0)';
+ }
+
+ window.onmessage = function(event){
+
+ if(index < lib.length){
+
+ if(event.origin === location.protocol + "//" + location.hostname){ // "https://nextapps-de.github.io" "https://raw.githack.com"
+
+ //console.log(event.data);
+
+ const parts = event.data.split(",");
+
+ let tmp = parseInt(parts[1], 10);
+
+ if(keep){
+
+ if(!current[index][parts[0]] || (tmp > current[index][parts[0]])){
+
+ current[index][parts[0]] = tmp;
+ }
+ }
+ else{
+
+ if(current[index][parts[0]]){
+
+ current[index][parts[0]] += tmp;
+ }
+ else{
+
+ current[index][parts[0]] = tmp;
+ }
+ }
+
+ tmp = parseInt(parts[2], 10);
+
+ if(current[index]["memory"]){
+
+ current[index]["memory"] += tmp;
+ }
+ else{
+
+ current[index]["memory"] = tmp;
+ }
+
+ if((repeat === 1) && (!current[index][parts[0]])){
+
+ current[index][parts[0]] = "-failed-";
+ }
+
+ if(parts[0] === "not-found"){
+
+ if(index < lib.length - 1){
+
+ mikado.update(index, current[index]);
+ setTimeout(runner, 50);
+ }
+ else{
+
+ get_score();
+
+ current.sort(function(a, b){
+
+ return b["score"] - a["score"];
+ });
+
+ for(let i = 0; i < lib.length; i++){
+
+ lib[i] = current[i]["name"];
+ }
+
+ mikado.render(current);
+
+ if(--repeat > 0){
+
+ index = -1;
+ setTimeout(runner, 50);
+ }
+ else{
+
+ Mikado.dispatch("start", document.getElementById("start"));
+ }
+ }
+ }
+ else{
+
+ const tmp = Object.assign({}, current[index]);
+ tmp[test[test.indexOf(parts[0]) + 1]] = "run...";
+ mikado.update(index, tmp);
+ }
+ }
+ }
+ };
+
+ function shuffle(items){
+
+ for(let i = items.length - 1, j, x; i > 0; i--) {
+
+ j = (Math.random() * i) | 0;
+ x = items[i];
+ items[i] = items[j];
+ items[j] = x;
+ }
+
+ return items;
+ }
+
+ function median(arr){
+
+ arr.sort(function(a, b){
+
+ return a - b;
+ });
+
+ const length = arr.length;
+ const half = length / 2;
+
+ return (
+
+ length % 2 ?
+
+ arr[half | 0]
+ :
+ (arr[half - 1] + arr[half]) / 2
+ );
+ }
+
+}());
\ No newline at end of file
diff --git a/match.html b/match.html
new file mode 100644
index 0000000..b498bc8
--- /dev/null
+++ b/match.html
@@ -0,0 +1,39 @@
+
+
+
+
+ Matching Test
+
+
+
+Relevance Scoring Comparison
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
Either no results or relevant content was not included in results.
+
Most relevant results was not found in the first place.
+
Most relevant results was successfully found in the first place.
+
Note: Open console and type e.g.
data[493]
+
+
+
+
+
diff --git a/match.js b/match.js
new file mode 100644
index 0000000..7b7f920
--- /dev/null
+++ b/match.js
@@ -0,0 +1,150 @@
+import { text_data } from "../demo/data/gulliver.js";
+
+const iframe = document.getElementsByTagName("iframe")[0];
+const encode = false;
+const lib = encode ? [
+
+ "flexsearch-balance", "flexsearch-default", "flexsearch-fast",
+ "flexsearch-match", "flexsearch-memory", "flexsearch-score",
+ "flexsearch-speed"
+]:[
+ /*"flexsearch-0.6.2", "flexsearch-0.6.3",*/ "flexsearch-0.7.0-match",
+ "bm25", "bulksearch-match", "elasticlunr",
+ "fuzzysearch", "js-search", "jsii",
+ "minisearch-match", "fuse-match", "lunr", "wade", "lyra"
+];
+
+let promise;
+
+window.onmessage = function(event){
+
+ if(event.origin === location.protocol + "//" + location.hostname){
+
+ const results = JSON.parse(event.data);
+ //console.log(results);
+ promise(results);
+ promise = null;
+ }
+};
+
+window.data = text_data;
+
+const tpl_td = document.createElement("td");
+ tpl_td.appendChild(document.createTextNode(""))
+
+const root_head = document.getElementsByTagName("thead")[0].firstElementChild,
+ root_body = document.getElementsByTagName("tbody")[0];
+
+const tpl_tr = document.createElement("tr");
+
+for(let i = 0; i < lib.length + 1; i++){ // amount of libs + 1 for first row
+
+ tpl_tr.appendChild(tpl_td.cloneNode(true));
+}
+
+for(let i = 0; i < 12; i++){ // amount of tests + 1 for first row
+
+ const tr = tpl_tr.cloneNode(true);
+ tr.id = "test-" + (i + 1);
+
+ root_body.appendChild(tr);
+ root_head.appendChild(tpl_td.cloneNode(true));
+}
+
+const headers = root_head.getElementsByTagName("td");
+
+// -----------------------------------------------------------
+
+await do_test("test-1", "without breach of modesty", [2684]);
+await do_test("test-2", "went softly stream", [2432]);
+await do_test("test-3", "princes of the ambition", [2259, 396]);
+await do_test("test-4", "five-thousand leagues", [7]);
+await do_test("test-5", "raise up soft", [2069]);
+await do_test("test-6", "disgust the bigness", [946]);
+await do_test("test-7", "bignes of splaknuk", [781]);
+await do_test("test-8", "matematikal musikal instruments", [1480]);
+await do_test("test-9", "composition of minerals gums juices vegetables", [1676, 2337]);
+await do_test("test-10", "general camberlayhn", [520]);
+await do_test("test-11", "the end defeat", [2209]);
+await do_test("test-12", "fast chief", [1275]);
+
+// ---------------------------------------
+
+async function do_test(id, query, ref){
+
+ const nodes = document.getElementById(id).getElementsByTagName("td");
+ nodes[0].firstChild.nodeValue = query;
+
+ for(let i = 0, current; i < lib.length; i++){
+
+ current = lib[i].replace("-0.7.0", "").replace("-match", "");
+ headers[i + 1].firstChild.nodeValue = current;
+
+ const node = nodes[i + 1];
+ const style = node.style;
+
+ node.firstChild.nodeValue = "run ...";
+
+ let results = await new Promise(function(resolve){
+
+ promise = resolve;
+ iframe.src = "test/" + lib[i] + "/?query=" + decodeURI(query) + (encode ? "&encode=true" : "") + "#match";
+ });
+
+ if(results.length){
+
+ switch(current){
+
+ case "elasticlunr":
+ case "lunr":
+ results = results.map(val => val.ref);
+ break;
+
+ case "wade":
+ results = results.map(val => val.index);
+ break;
+
+ case "js-search":
+ case "minisearch":
+ case "jsii":
+ case "bm25":
+ results = results.map(val => val.id);
+ break;
+
+ case "fuzzysearch":
+ results = results.map(val => text_data.indexOf(val));
+ break;
+ }
+ }
+
+ for(let a = 0; a < ref.length; a++){
+
+ const current = ref[a];
+
+ node.firstChild.nodeValue = results[0] || "-";
+ style.color = "#fff";
+ style.backgroundColor = "";
+
+
+ if((results[a] === current) ||
+ (results[a] === ("" + current))){
+
+ if(style.backgroundColor !== "orange"){
+
+ style.backgroundColor = "#0a0";
+ }
+ }
+ else if(!results.length ||
+ ((results.indexOf(current) === -1) &&
+ (results.indexOf(("" + current)) === -1))){
+
+ style.backgroundColor = "#f00";
+ break;
+ }
+ else{
+
+ style.backgroundColor = "orange";
+ }
+ }
+ }
+}
diff --git a/test/bm25/index.html b/test/bm25/index.html
new file mode 100644
index 0000000..ee4ce81
--- /dev/null
+++ b/test/bm25/index.html
@@ -0,0 +1,54 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: bm25
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/bulksearch-match/index.html b/test/bulksearch-match/index.html
new file mode 100644
index 0000000..8ff2104
--- /dev/null
+++ b/test/bulksearch-match/index.html
@@ -0,0 +1,51 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: bulksearch-0.1.3
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/bulksearch/index.html b/test/bulksearch/index.html
new file mode 100644
index 0000000..d1aa85f
--- /dev/null
+++ b/test/bulksearch/index.html
@@ -0,0 +1,54 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: bulksearch-0.1.3
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/elasticlunr/index.html b/test/elasticlunr/index.html
new file mode 100644
index 0000000..850d877
--- /dev/null
+++ b/test/elasticlunr/index.html
@@ -0,0 +1,50 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: elasticlunr-0.9.6
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-0.6.2/index.html b/test/flexsearch-0.6.2/index.html
new file mode 100644
index 0000000..c056c84
--- /dev/null
+++ b/test/flexsearch-0.6.2/index.html
@@ -0,0 +1,59 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-0.6.2
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-0.6.3/index.html b/test/flexsearch-0.6.3/index.html
new file mode 100644
index 0000000..5ffb4cf
--- /dev/null
+++ b/test/flexsearch-0.6.3/index.html
@@ -0,0 +1,59 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-0.6.3
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-0.7.0-context/index.html b/test/flexsearch-0.7.0-context/index.html
new file mode 100644
index 0000000..9636e6f
--- /dev/null
+++ b/test/flexsearch-0.7.0-context/index.html
@@ -0,0 +1,51 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
diff --git a/test/flexsearch-0.7.0-match/index.html b/test/flexsearch-0.7.0-match/index.html
new file mode 100644
index 0000000..a83f0fc
--- /dev/null
+++ b/test/flexsearch-0.7.0-match/index.html
@@ -0,0 +1,57 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
diff --git a/test/flexsearch-0.7.0/index.html b/test/flexsearch-0.7.0/index.html
new file mode 100644
index 0000000..e056ccf
--- /dev/null
+++ b/test/flexsearch-0.7.0/index.html
@@ -0,0 +1,68 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-balance/index.html b/test/flexsearch-balance/index.html
new file mode 100644
index 0000000..6374c9c
--- /dev/null
+++ b/test/flexsearch-balance/index.html
@@ -0,0 +1,39 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-ctx-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-default/index.html b/test/flexsearch-default/index.html
new file mode 100644
index 0000000..260dc71
--- /dev/null
+++ b/test/flexsearch-default/index.html
@@ -0,0 +1,39 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-ctx-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-doc/index.html b/test/flexsearch-doc/index.html
new file mode 100644
index 0000000..d4e9f44
--- /dev/null
+++ b/test/flexsearch-doc/index.html
@@ -0,0 +1,52 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-ctx-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-fast/index.html b/test/flexsearch-fast/index.html
new file mode 100644
index 0000000..fbca7f1
--- /dev/null
+++ b/test/flexsearch-fast/index.html
@@ -0,0 +1,39 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-ctx-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-match/index.html b/test/flexsearch-match/index.html
new file mode 100644
index 0000000..12ab3ab
--- /dev/null
+++ b/test/flexsearch-match/index.html
@@ -0,0 +1,39 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-ctx-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-memory/index.html b/test/flexsearch-memory/index.html
new file mode 100644
index 0000000..06a24b2
--- /dev/null
+++ b/test/flexsearch-memory/index.html
@@ -0,0 +1,38 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-ctx-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-score/index.html b/test/flexsearch-score/index.html
new file mode 100644
index 0000000..61d5782
--- /dev/null
+++ b/test/flexsearch-score/index.html
@@ -0,0 +1,38 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-ctx-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/flexsearch-speed/index.html b/test/flexsearch-speed/index.html
new file mode 100644
index 0000000..ebd9124
--- /dev/null
+++ b/test/flexsearch-speed/index.html
@@ -0,0 +1,38 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: flexsearch-ctx-0.7.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/fuse-match/index.html b/test/fuse-match/index.html
new file mode 100644
index 0000000..81327fe
--- /dev/null
+++ b/test/fuse-match/index.html
@@ -0,0 +1,52 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: fuse-3.3.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/fuse/index.html b/test/fuse/index.html
new file mode 100644
index 0000000..888e68e
--- /dev/null
+++ b/test/fuse/index.html
@@ -0,0 +1,49 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: fuse-3.3.0
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/fuzzysearch/index.html b/test/fuzzysearch/index.html
new file mode 100644
index 0000000..6070c1a
--- /dev/null
+++ b/test/fuzzysearch/index.html
@@ -0,0 +1,33 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: fuzzysearch
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/js-search/index.html b/test/js-search/index.html
new file mode 100644
index 0000000..e1539a8
--- /dev/null
+++ b/test/js-search/index.html
@@ -0,0 +1,44 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: js-search-1.4.2
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/jsii/index.html b/test/jsii/index.html
new file mode 100644
index 0000000..c567b94
--- /dev/null
+++ b/test/jsii/index.html
@@ -0,0 +1,48 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: jsii
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
+
diff --git a/test/lunr/index.html b/test/lunr/index.html
new file mode 100644
index 0000000..42b748e
--- /dev/null
+++ b/test/lunr/index.html
@@ -0,0 +1,49 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: lunr-2.3.5
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/lyra/index.html b/test/lyra/index.html
new file mode 100644
index 0000000..c656723
--- /dev/null
+++ b/test/lyra/index.html
@@ -0,0 +1,52 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: lyra-0.2.4
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
diff --git a/test/minisearch-match/index.html b/test/minisearch-match/index.html
new file mode 100644
index 0000000..214f1dc
--- /dev/null
+++ b/test/minisearch-match/index.html
@@ -0,0 +1,42 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: minisearch
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/minisearch/index.html b/test/minisearch/index.html
new file mode 100644
index 0000000..6ea9d55
--- /dev/null
+++ b/test/minisearch/index.html
@@ -0,0 +1,42 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: minisearch
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/test/wade/index.html b/test/wade/index.html
new file mode 100644
index 0000000..ecbfcae
--- /dev/null
+++ b/test/wade/index.html
@@ -0,0 +1,37 @@
+
+
+
+
+ Benchmark
+
+
+Benchmark: wade-0.3.3
+Indexed Text: "Gulliver's Travels" (Swift Jonathan 1726)
+
+
+
+
+
diff --git a/tpl/lib.html b/tpl/lib.html
new file mode 100644
index 0000000..20657c9
--- /dev/null
+++ b/tpl/lib.html
@@ -0,0 +1,3 @@
+
+ {{data}}
+
\ No newline at end of file
diff --git a/tpl/lib.js b/tpl/lib.js
new file mode 100644
index 0000000..d8c3724
--- /dev/null
+++ b/tpl/lib.js
@@ -0,0 +1,17 @@
+Mikado.register({
+ "t": "li",
+ "i": {
+ "t": "a",
+ "a": {
+ "href": [
+ "'test/' + data + '/'"
+ ]
+ },
+ "x": [
+ "data"
+ ]
+ },
+ "d": false,
+ "n": "lib",
+ "v": "0.7.44"
+});
\ No newline at end of file
diff --git a/tpl/row.html b/tpl/row.html
new file mode 100644
index 0000000..5c30639
--- /dev/null
+++ b/tpl/row.html
@@ -0,0 +1,12 @@
+
+ {{data.name}} |
+ {{data.size}} |
+ {{data.memory}} |
+ {{data['query-single']}} |
+ {{data['query-multi']}} |
+ {{data['query-long']}} |
+ {{data['query-dupes']}} |
+ {{data['not-found']}} |
+ {{data.index}} |
+ {{data.score}} |
+
diff --git a/tpl/row.js b/tpl/row.js
new file mode 100644
index 0000000..68b1e1e
--- /dev/null
+++ b/tpl/row.js
@@ -0,0 +1,104 @@
+Mikado.register({
+ "t": "tr",
+ "i": [
+ {
+ "t": "td",
+ "x": [
+ "data.name"
+ ]
+ },
+ {
+ "t": "td",
+ "a": {
+ "hidden": true
+ },
+ "s": [
+ "'background-color:' + data.color_size"
+ ],
+ "x": [
+ "data.size"
+ ]
+ },
+ {
+ "t": "td",
+ "s": [
+ "'background-color:' + data.color_memory"
+ ],
+ "x": [
+ "data.memory"
+ ]
+ },
+ {
+ "t": "td",
+ "s": [
+ "'background-color:' + data['color_query-single']"
+ ],
+ "x": [
+ "data['query-single']"
+ ]
+ },
+ {
+ "t": "td",
+ "s": [
+ "'background-color:' + data['color_query-multi']"
+ ],
+ "x": [
+ "data['query-multi']"
+ ]
+ },
+ {
+ "t": "td",
+ "s": [
+ "'background-color:' + data['color_query-long']"
+ ],
+ "x": [
+ "data['query-long']"
+ ]
+ },
+ {
+ "t": "td",
+ "s": [
+ "'background-color:' + data['color_query-dupes']"
+ ],
+ "x": [
+ "data['query-dupes']"
+ ]
+ },
+ {
+ "t": "td",
+ "s": [
+ "'background-color:' + data['color_not-found']"
+ ],
+ "x": [
+ "data['not-found']"
+ ]
+ },
+ {
+ "t": "td",
+ "i": {
+ "t": "b",
+ "x": [
+ "data.index"
+ ]
+ },
+ "s": [
+ "'background-color:' + data.color_index"
+ ]
+ },
+ {
+ "t": "td",
+ "i": {
+ "t": "b",
+ "x": [
+ "data.score"
+ ]
+ },
+ "s": [
+ "'background-color:' + data.color_score"
+ ]
+ }
+ ],
+ "d": false,
+ "n": "row",
+ "v": "0.7.44"
+});
\ No newline at end of file