bs-platform
Version:
bucklescript compiler, ocaml standard libary by bucklescript and its required runtime support
1,770 lines (1,725 loc) • 133 kB
JavaScript
'use strict';
var Obj = require("./obj.js");
var Sys = require("./sys.js");
var $$Array = require("./array.js");
var Block = require("./block.js");
var Curry = require("./curry.js");
var Random = require("./random.js");
var Hashtbl = require("./hashtbl.js");
var Caml_array = require("./caml_array.js");
var Caml_int32 = require("./caml_int32.js");
var Caml_option = require("./caml_option.js");
var Caml_primitive = require("./caml_primitive.js");
var CamlinternalLazy = require("./camlinternalLazy.js");
var Caml_builtin_exceptions = require("./caml_builtin_exceptions.js");
function create(param) {
return Obj.Ephemeron[/* create */0](1);
}
function get_key(t) {
return Obj.Ephemeron[/* get_key */2](t, 0);
}
function get_key_copy(t) {
return Obj.Ephemeron[/* get_key_copy */3](t, 0);
}
function set_key(t, k) {
return Obj.Ephemeron[/* set_key */4](t, 0, k);
}
function unset_key(t) {
return Obj.Ephemeron[/* unset_key */5](t, 0);
}
function check_key(t) {
return Obj.Ephemeron[/* check_key */6](t, 0);
}
function blit_key(t1, t2) {
return Obj.Ephemeron[/* blit_key */7](t1, 0, t2, 0, 1);
}
function get_data(t) {
return Obj.Ephemeron[/* get_data */8](t);
}
function get_data_copy(t) {
return Obj.Ephemeron[/* get_data_copy */9](t);
}
function set_data(t, d) {
return Obj.Ephemeron[/* set_data */10](t, d);
}
function unset_data(t) {
return Obj.Ephemeron[/* unset_data */11](t);
}
function check_data(t) {
return Obj.Ephemeron[/* check_data */12](t);
}
function blit_data(t1, t2) {
return Obj.Ephemeron[/* blit_data */13](t1, t2);
}
function MakeSeeded(H) {
var create = function (k, d) {
var c = Obj.Ephemeron[/* create */0](1);
Obj.Ephemeron[/* set_data */10](c, d);
set_key(c, k);
return c;
};
var hash = H[/* hash */1];
var equal = function (c, k) {
var match = get_key(c);
if (match !== undefined) {
if (Curry._2(H[/* equal */0], k, Caml_option.valFromOption(match))) {
return /* ETrue */0;
} else {
return /* EFalse */1;
}
} else {
return /* EDead */2;
}
};
var set_key_data = function (c, k, d) {
Obj.Ephemeron[/* unset_data */11](c);
set_key(c, k);
return Obj.Ephemeron[/* set_data */10](c, d);
};
var power_2_above = function (_x, n) {
while(true) {
var x = _x;
if (x >= n || (x << 1) > Sys.max_array_length) {
return x;
} else {
_x = (x << 1);
continue ;
}
};
};
var prng = Block.__(246, [(function (param) {
return Random.State[/* make_self_init */1](/* () */0);
})]);
var create$1 = function ($staropt$star, initial_size) {
var random = $staropt$star !== undefined ? $staropt$star : Hashtbl.is_randomized(/* () */0);
var s = power_2_above(16, initial_size);
var seed;
if (random) {
var tag = prng.tag | 0;
seed = Random.State[/* bits */3](tag === 250 ? prng[0] : (
tag === 246 ? CamlinternalLazy.force_lazy_block(prng) : prng
));
} else {
seed = 0;
}
return /* record */[
/* size */0,
/* data */Caml_array.caml_make_vect(s, /* Empty */0),
/* seed */seed,
/* initial_size */s
];
};
var clear = function (h) {
h[/* size */0] = 0;
var len = h[/* data */1].length;
for(var i = 0 ,i_finish = len - 1 | 0; i <= i_finish; ++i){
Caml_array.caml_array_set(h[/* data */1], i, /* Empty */0);
}
return /* () */0;
};
var reset = function (h) {
var len = h[/* data */1].length;
if (len === h[/* initial_size */3]) {
return clear(h);
} else {
h[/* size */0] = 0;
h[/* data */1] = Caml_array.caml_make_vect(h[/* initial_size */3], /* Empty */0);
return /* () */0;
}
};
var copy = function (h) {
return /* record */[
/* size */h[/* size */0],
/* data */$$Array.copy(h[/* data */1]),
/* seed */h[/* seed */2],
/* initial_size */h[/* initial_size */3]
];
};
var key_index = function (h, hkey) {
return hkey & (h[/* data */1].length - 1 | 0);
};
var clean = function (h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (check_key(c)) {
return /* Cons */[
param[0],
c,
do_bucket(rest)
];
} else {
h[/* size */0] = h[/* size */0] - 1 | 0;
_param = rest;
continue ;
}
} else {
return /* Empty */0;
}
};
};
var d = h[/* data */1];
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
Caml_array.caml_array_set(d, i, do_bucket(Caml_array.caml_array_get(d, i)));
}
return /* () */0;
};
var resize = function (h) {
var odata = h[/* data */1];
var osize = odata.length;
var nsize = (osize << 1);
clean(h);
if (nsize < Sys.max_array_length && h[/* size */0] >= (osize >>> 1)) {
var ndata = Caml_array.caml_make_vect(nsize, /* Empty */0);
h[/* data */1] = ndata;
var insert_bucket = function (param) {
if (param) {
var hkey = param[0];
insert_bucket(param[2]);
var nidx = key_index(h, hkey);
return Caml_array.caml_array_set(ndata, nidx, /* Cons */[
hkey,
param[1],
Caml_array.caml_array_get(ndata, nidx)
]);
} else {
return /* () */0;
}
};
for(var i = 0 ,i_finish = osize - 1 | 0; i <= i_finish; ++i){
insert_bucket(Caml_array.caml_array_get(odata, i));
}
return /* () */0;
} else {
return 0;
}
};
var add = function (h, key, info) {
var hkey = Curry._2(hash, h[/* seed */2], key);
var i = key_index(h, hkey);
var container = create(key, info);
var bucket_002 = Caml_array.caml_array_get(h[/* data */1], i);
var bucket = /* Cons */[
hkey,
container,
bucket_002
];
Caml_array.caml_array_set(h[/* data */1], i, bucket);
h[/* size */0] = h[/* size */0] + 1 | 0;
if (h[/* size */0] > (h[/* data */1].length << 1)) {
return resize(h);
} else {
return 0;
}
};
var remove = function (h, key) {
var hkey = Curry._2(hash, h[/* seed */2], key);
var remove_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var next = param[2];
var c = param[1];
var hk = param[0];
if (hkey === hk) {
var match = equal(c, key);
switch (match) {
case 0 :
h[/* size */0] = h[/* size */0] - 1 | 0;
return next;
case 1 :
return /* Cons */[
hk,
c,
remove_bucket(next)
];
case 2 :
h[/* size */0] = h[/* size */0] - 1 | 0;
_param = next;
continue ;
}
} else {
return /* Cons */[
hk,
c,
remove_bucket(next)
];
}
} else {
return /* Empty */0;
}
};
};
var i = key_index(h, hkey);
return Caml_array.caml_array_set(h[/* data */1], i, remove_bucket(Caml_array.caml_array_get(h[/* data */1], i)));
};
var find = function (h, key) {
var hkey = Curry._2(hash, h[/* seed */2], key);
var key$1 = key;
var hkey$1 = hkey;
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey));
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (hkey$1 === param[0]) {
var match = equal(c, key$1);
if (match !== 0) {
_param = rest;
continue ;
} else {
var match$1 = get_data(c);
if (match$1 !== undefined) {
return Caml_option.valFromOption(match$1);
} else {
_param = rest;
continue ;
}
}
} else {
_param = rest;
continue ;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
};
var find_opt = function (h, key) {
var hkey = Curry._2(hash, h[/* seed */2], key);
var key$1 = key;
var hkey$1 = hkey;
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey));
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (hkey$1 === param[0]) {
var match = equal(c, key$1);
if (match !== 0) {
_param = rest;
continue ;
} else {
var d = get_data(c);
if (d !== undefined) {
return d;
} else {
_param = rest;
continue ;
}
}
} else {
_param = rest;
continue ;
}
} else {
return undefined;
}
};
};
var find_all = function (h, key) {
var hkey = Curry._2(hash, h[/* seed */2], key);
var find_in_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (hkey === param[0]) {
var match = equal(c, key);
if (match !== 0) {
_param = rest;
continue ;
} else {
var match$1 = get_data(c);
if (match$1 !== undefined) {
return /* :: */[
Caml_option.valFromOption(match$1),
find_in_bucket(rest)
];
} else {
_param = rest;
continue ;
}
}
} else {
_param = rest;
continue ;
}
} else {
return /* [] */0;
}
};
};
return find_in_bucket(Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey)));
};
var replace = function (h, key, info) {
var hkey = Curry._2(hash, h[/* seed */2], key);
var i = key_index(h, hkey);
var l = Caml_array.caml_array_get(h[/* data */1], i);
try {
var _param = l;
while(true) {
var param = _param;
if (param) {
var next = param[2];
var c = param[1];
if (hkey === param[0]) {
var match = equal(c, key);
if (match !== 0) {
_param = next;
continue ;
} else {
return set_key_data(c, key, info);
}
} else {
_param = next;
continue ;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
}
catch (exn){
if (exn === Caml_builtin_exceptions.not_found) {
var container = create(key, info);
Caml_array.caml_array_set(h[/* data */1], i, /* Cons */[
hkey,
container,
l
]);
h[/* size */0] = h[/* size */0] + 1 | 0;
if (h[/* size */0] > (h[/* data */1].length << 1)) {
return resize(h);
} else {
return 0;
}
} else {
throw exn;
}
}
};
var mem = function (h, key) {
var hkey = Curry._2(hash, h[/* seed */2], key);
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey));
while(true) {
var param = _param;
if (param) {
var rest = param[2];
if (param[0] === hkey) {
var match = equal(param[1], key);
if (match !== 0) {
_param = rest;
continue ;
} else {
return true;
}
} else {
_param = rest;
continue ;
}
} else {
return false;
}
};
};
var iter = function (f, h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var c = param[1];
var match = get_key(c);
var match$1 = get_data(c);
if (match !== undefined) {
if (match$1 !== undefined) {
Curry._2(f, Caml_option.valFromOption(match), Caml_option.valFromOption(match$1));
}
}
_param = param[2];
continue ;
} else {
return /* () */0;
}
};
};
var d = h[/* data */1];
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
do_bucket(Caml_array.caml_array_get(d, i));
}
return /* () */0;
};
var fold = function (f, h, init) {
var do_bucket = function (_b, _accu) {
while(true) {
var accu = _accu;
var b = _b;
if (b) {
var c = b[1];
var match = get_key(c);
var match$1 = get_data(c);
var accu$1 = match !== undefined && match$1 !== undefined ? Curry._3(f, Caml_option.valFromOption(match), Caml_option.valFromOption(match$1), accu) : accu;
_accu = accu$1;
_b = b[2];
continue ;
} else {
return accu;
}
};
};
var d = h[/* data */1];
var accu = init;
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
accu = do_bucket(Caml_array.caml_array_get(d, i), accu);
}
return accu;
};
var filter_map_inplace = function (f, h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
var match = get_key(c);
var match$1 = get_data(c);
if (match !== undefined) {
if (match$1 !== undefined) {
var k = Caml_option.valFromOption(match);
var match$2 = Curry._2(f, k, Caml_option.valFromOption(match$1));
if (match$2 !== undefined) {
set_key_data(c, k, Caml_option.valFromOption(match$2));
return /* Cons */[
param[0],
c,
do_bucket(rest)
];
} else {
_param = rest;
continue ;
}
} else {
_param = rest;
continue ;
}
} else {
_param = rest;
continue ;
}
} else {
return /* Empty */0;
}
};
};
var d = h[/* data */1];
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
Caml_array.caml_array_set(d, i, do_bucket(Caml_array.caml_array_get(d, i)));
}
return /* () */0;
};
var length = function (h) {
return h[/* size */0];
};
var bucket_length = function (_accu, _param) {
while(true) {
var param = _param;
var accu = _accu;
if (param) {
_param = param[2];
_accu = accu + 1 | 0;
continue ;
} else {
return accu;
}
};
};
var stats = function (h) {
var mbl = $$Array.fold_left((function (m, b) {
return Caml_primitive.caml_int_max(m, bucket_length(0, b));
}), 0, h[/* data */1]);
var histo = Caml_array.caml_make_vect(mbl + 1 | 0, 0);
$$Array.iter((function (b) {
var l = bucket_length(0, b);
return Caml_array.caml_array_set(histo, l, Caml_array.caml_array_get(histo, l) + 1 | 0);
}), h[/* data */1]);
return /* record */[
/* num_bindings */h[/* size */0],
/* num_buckets */h[/* data */1].length,
/* max_bucket_length */mbl,
/* bucket_histogram */histo
];
};
var bucket_length_alive = function (_accu, _param) {
while(true) {
var param = _param;
var accu = _accu;
if (param) {
var rest = param[2];
if (check_key(param[1])) {
_param = rest;
_accu = accu + 1 | 0;
continue ;
} else {
_param = rest;
continue ;
}
} else {
return accu;
}
};
};
var stats_alive = function (h) {
var size = /* record */[/* contents */0];
var mbl = $$Array.fold_left((function (m, b) {
return Caml_primitive.caml_int_max(m, bucket_length_alive(0, b));
}), 0, h[/* data */1]);
var histo = Caml_array.caml_make_vect(mbl + 1 | 0, 0);
$$Array.iter((function (b) {
var l = bucket_length_alive(0, b);
size[0] = size[0] + l | 0;
return Caml_array.caml_array_set(histo, l, Caml_array.caml_array_get(histo, l) + 1 | 0);
}), h[/* data */1]);
return /* record */[
/* num_bindings */size[0],
/* num_buckets */h[/* data */1].length,
/* max_bucket_length */mbl,
/* bucket_histogram */histo
];
};
return /* module */[
/* create */create$1,
/* clear */clear,
/* reset */reset,
/* copy */copy,
/* add */add,
/* remove */remove,
/* find */find,
/* find_opt */find_opt,
/* find_all */find_all,
/* replace */replace,
/* mem */mem,
/* iter */iter,
/* filter_map_inplace */filter_map_inplace,
/* fold */fold,
/* length */length,
/* stats */stats,
/* clean */clean,
/* stats_alive */stats_alive
];
}
function Make(H) {
var equal = H[/* equal */0];
var hash = function (_seed, x) {
return Curry._1(H[/* hash */1], x);
};
var create = function (k, d) {
var c = Obj.Ephemeron[/* create */0](1);
Obj.Ephemeron[/* set_data */10](c, d);
set_key(c, k);
return c;
};
var equal$1 = function (c, k) {
var match = get_key(c);
if (match !== undefined) {
if (Curry._2(equal, k, Caml_option.valFromOption(match))) {
return /* ETrue */0;
} else {
return /* EFalse */1;
}
} else {
return /* EDead */2;
}
};
var set_key_data = function (c, k, d) {
Obj.Ephemeron[/* unset_data */11](c);
set_key(c, k);
return Obj.Ephemeron[/* set_data */10](c, d);
};
var power_2_above = function (_x, n) {
while(true) {
var x = _x;
if (x >= n || (x << 1) > Sys.max_array_length) {
return x;
} else {
_x = (x << 1);
continue ;
}
};
};
var prng = Block.__(246, [(function (param) {
return Random.State[/* make_self_init */1](/* () */0);
})]);
var clear = function (h) {
h[/* size */0] = 0;
var len = h[/* data */1].length;
for(var i = 0 ,i_finish = len - 1 | 0; i <= i_finish; ++i){
Caml_array.caml_array_set(h[/* data */1], i, /* Empty */0);
}
return /* () */0;
};
var reset = function (h) {
var len = h[/* data */1].length;
if (len === h[/* initial_size */3]) {
return clear(h);
} else {
h[/* size */0] = 0;
h[/* data */1] = Caml_array.caml_make_vect(h[/* initial_size */3], /* Empty */0);
return /* () */0;
}
};
var copy = function (h) {
return /* record */[
/* size */h[/* size */0],
/* data */$$Array.copy(h[/* data */1]),
/* seed */h[/* seed */2],
/* initial_size */h[/* initial_size */3]
];
};
var key_index = function (h, hkey) {
return hkey & (h[/* data */1].length - 1 | 0);
};
var clean = function (h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (check_key(c)) {
return /* Cons */[
param[0],
c,
do_bucket(rest)
];
} else {
h[/* size */0] = h[/* size */0] - 1 | 0;
_param = rest;
continue ;
}
} else {
return /* Empty */0;
}
};
};
var d = h[/* data */1];
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
Caml_array.caml_array_set(d, i, do_bucket(Caml_array.caml_array_get(d, i)));
}
return /* () */0;
};
var resize = function (h) {
var odata = h[/* data */1];
var osize = odata.length;
var nsize = (osize << 1);
clean(h);
if (nsize < Sys.max_array_length && h[/* size */0] >= (osize >>> 1)) {
var ndata = Caml_array.caml_make_vect(nsize, /* Empty */0);
h[/* data */1] = ndata;
var insert_bucket = function (param) {
if (param) {
var hkey = param[0];
insert_bucket(param[2]);
var nidx = key_index(h, hkey);
return Caml_array.caml_array_set(ndata, nidx, /* Cons */[
hkey,
param[1],
Caml_array.caml_array_get(ndata, nidx)
]);
} else {
return /* () */0;
}
};
for(var i = 0 ,i_finish = osize - 1 | 0; i <= i_finish; ++i){
insert_bucket(Caml_array.caml_array_get(odata, i));
}
return /* () */0;
} else {
return 0;
}
};
var add = function (h, key, info) {
var hkey = hash(h[/* seed */2], key);
var i = key_index(h, hkey);
var container = create(key, info);
var bucket_002 = Caml_array.caml_array_get(h[/* data */1], i);
var bucket = /* Cons */[
hkey,
container,
bucket_002
];
Caml_array.caml_array_set(h[/* data */1], i, bucket);
h[/* size */0] = h[/* size */0] + 1 | 0;
if (h[/* size */0] > (h[/* data */1].length << 1)) {
return resize(h);
} else {
return 0;
}
};
var remove = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var remove_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var next = param[2];
var c = param[1];
var hk = param[0];
if (hkey === hk) {
var match = equal$1(c, key);
switch (match) {
case 0 :
h[/* size */0] = h[/* size */0] - 1 | 0;
return next;
case 1 :
return /* Cons */[
hk,
c,
remove_bucket(next)
];
case 2 :
h[/* size */0] = h[/* size */0] - 1 | 0;
_param = next;
continue ;
}
} else {
return /* Cons */[
hk,
c,
remove_bucket(next)
];
}
} else {
return /* Empty */0;
}
};
};
var i = key_index(h, hkey);
return Caml_array.caml_array_set(h[/* data */1], i, remove_bucket(Caml_array.caml_array_get(h[/* data */1], i)));
};
var find = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var key$1 = key;
var hkey$1 = hkey;
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey));
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (hkey$1 === param[0]) {
var match = equal$1(c, key$1);
if (match !== 0) {
_param = rest;
continue ;
} else {
var match$1 = get_data(c);
if (match$1 !== undefined) {
return Caml_option.valFromOption(match$1);
} else {
_param = rest;
continue ;
}
}
} else {
_param = rest;
continue ;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
};
var find_opt = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var key$1 = key;
var hkey$1 = hkey;
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey));
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (hkey$1 === param[0]) {
var match = equal$1(c, key$1);
if (match !== 0) {
_param = rest;
continue ;
} else {
var d = get_data(c);
if (d !== undefined) {
return d;
} else {
_param = rest;
continue ;
}
}
} else {
_param = rest;
continue ;
}
} else {
return undefined;
}
};
};
var find_all = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var find_in_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (hkey === param[0]) {
var match = equal$1(c, key);
if (match !== 0) {
_param = rest;
continue ;
} else {
var match$1 = get_data(c);
if (match$1 !== undefined) {
return /* :: */[
Caml_option.valFromOption(match$1),
find_in_bucket(rest)
];
} else {
_param = rest;
continue ;
}
}
} else {
_param = rest;
continue ;
}
} else {
return /* [] */0;
}
};
};
return find_in_bucket(Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey)));
};
var replace = function (h, key, info) {
var hkey = hash(h[/* seed */2], key);
var i = key_index(h, hkey);
var l = Caml_array.caml_array_get(h[/* data */1], i);
try {
var _param = l;
while(true) {
var param = _param;
if (param) {
var next = param[2];
var c = param[1];
if (hkey === param[0]) {
var match = equal$1(c, key);
if (match !== 0) {
_param = next;
continue ;
} else {
return set_key_data(c, key, info);
}
} else {
_param = next;
continue ;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
}
catch (exn){
if (exn === Caml_builtin_exceptions.not_found) {
var container = create(key, info);
Caml_array.caml_array_set(h[/* data */1], i, /* Cons */[
hkey,
container,
l
]);
h[/* size */0] = h[/* size */0] + 1 | 0;
if (h[/* size */0] > (h[/* data */1].length << 1)) {
return resize(h);
} else {
return 0;
}
} else {
throw exn;
}
}
};
var mem = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey));
while(true) {
var param = _param;
if (param) {
var rest = param[2];
if (param[0] === hkey) {
var match = equal$1(param[1], key);
if (match !== 0) {
_param = rest;
continue ;
} else {
return true;
}
} else {
_param = rest;
continue ;
}
} else {
return false;
}
};
};
var iter = function (f, h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var c = param[1];
var match = get_key(c);
var match$1 = get_data(c);
if (match !== undefined) {
if (match$1 !== undefined) {
Curry._2(f, Caml_option.valFromOption(match), Caml_option.valFromOption(match$1));
}
}
_param = param[2];
continue ;
} else {
return /* () */0;
}
};
};
var d = h[/* data */1];
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
do_bucket(Caml_array.caml_array_get(d, i));
}
return /* () */0;
};
var fold = function (f, h, init) {
var do_bucket = function (_b, _accu) {
while(true) {
var accu = _accu;
var b = _b;
if (b) {
var c = b[1];
var match = get_key(c);
var match$1 = get_data(c);
var accu$1 = match !== undefined && match$1 !== undefined ? Curry._3(f, Caml_option.valFromOption(match), Caml_option.valFromOption(match$1), accu) : accu;
_accu = accu$1;
_b = b[2];
continue ;
} else {
return accu;
}
};
};
var d = h[/* data */1];
var accu = init;
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
accu = do_bucket(Caml_array.caml_array_get(d, i), accu);
}
return accu;
};
var filter_map_inplace = function (f, h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
var match = get_key(c);
var match$1 = get_data(c);
if (match !== undefined) {
if (match$1 !== undefined) {
var k = Caml_option.valFromOption(match);
var match$2 = Curry._2(f, k, Caml_option.valFromOption(match$1));
if (match$2 !== undefined) {
set_key_data(c, k, Caml_option.valFromOption(match$2));
return /* Cons */[
param[0],
c,
do_bucket(rest)
];
} else {
_param = rest;
continue ;
}
} else {
_param = rest;
continue ;
}
} else {
_param = rest;
continue ;
}
} else {
return /* Empty */0;
}
};
};
var d = h[/* data */1];
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
Caml_array.caml_array_set(d, i, do_bucket(Caml_array.caml_array_get(d, i)));
}
return /* () */0;
};
var length = function (h) {
return h[/* size */0];
};
var bucket_length = function (_accu, _param) {
while(true) {
var param = _param;
var accu = _accu;
if (param) {
_param = param[2];
_accu = accu + 1 | 0;
continue ;
} else {
return accu;
}
};
};
var stats = function (h) {
var mbl = $$Array.fold_left((function (m, b) {
return Caml_primitive.caml_int_max(m, bucket_length(0, b));
}), 0, h[/* data */1]);
var histo = Caml_array.caml_make_vect(mbl + 1 | 0, 0);
$$Array.iter((function (b) {
var l = bucket_length(0, b);
return Caml_array.caml_array_set(histo, l, Caml_array.caml_array_get(histo, l) + 1 | 0);
}), h[/* data */1]);
return /* record */[
/* num_bindings */h[/* size */0],
/* num_buckets */h[/* data */1].length,
/* max_bucket_length */mbl,
/* bucket_histogram */histo
];
};
var bucket_length_alive = function (_accu, _param) {
while(true) {
var param = _param;
var accu = _accu;
if (param) {
var rest = param[2];
if (check_key(param[1])) {
_param = rest;
_accu = accu + 1 | 0;
continue ;
} else {
_param = rest;
continue ;
}
} else {
return accu;
}
};
};
var stats_alive = function (h) {
var size = /* record */[/* contents */0];
var mbl = $$Array.fold_left((function (m, b) {
return Caml_primitive.caml_int_max(m, bucket_length_alive(0, b));
}), 0, h[/* data */1]);
var histo = Caml_array.caml_make_vect(mbl + 1 | 0, 0);
$$Array.iter((function (b) {
var l = bucket_length_alive(0, b);
size[0] = size[0] + l | 0;
return Caml_array.caml_array_set(histo, l, Caml_array.caml_array_get(histo, l) + 1 | 0);
}), h[/* data */1]);
return /* record */[
/* num_bindings */size[0],
/* num_buckets */h[/* data */1].length,
/* max_bucket_length */mbl,
/* bucket_histogram */histo
];
};
var create$1 = function (sz) {
var $staropt$star = false;
var initial_size = sz;
var random = $staropt$star !== undefined ? $staropt$star : Hashtbl.is_randomized(/* () */0);
var s = power_2_above(16, initial_size);
var seed;
if (random) {
var tag = prng.tag | 0;
seed = Random.State[/* bits */3](tag === 250 ? prng[0] : (
tag === 246 ? CamlinternalLazy.force_lazy_block(prng) : prng
));
} else {
seed = 0;
}
return /* record */[
/* size */0,
/* data */Caml_array.caml_make_vect(s, /* Empty */0),
/* seed */seed,
/* initial_size */s
];
};
return /* module */[
/* create */create$1,
/* clear */clear,
/* reset */reset,
/* copy */copy,
/* add */add,
/* remove */remove,
/* find */find,
/* find_opt */find_opt,
/* find_all */find_all,
/* replace */replace,
/* mem */mem,
/* iter */iter,
/* filter_map_inplace */filter_map_inplace,
/* fold */fold,
/* length */length,
/* stats */stats,
/* clean */clean,
/* stats_alive */stats_alive
];
}
function create$1(param) {
return Obj.Ephemeron[/* create */0](2);
}
function get_key1(t) {
return Obj.Ephemeron[/* get_key */2](t, 0);
}
function get_key1_copy(t) {
return Obj.Ephemeron[/* get_key_copy */3](t, 0);
}
function set_key1(t, k) {
return Obj.Ephemeron[/* set_key */4](t, 0, k);
}
function unset_key1(t) {
return Obj.Ephemeron[/* unset_key */5](t, 0);
}
function check_key1(t) {
return Obj.Ephemeron[/* check_key */6](t, 0);
}
function get_key2(t) {
return Obj.Ephemeron[/* get_key */2](t, 1);
}
function get_key2_copy(t) {
return Obj.Ephemeron[/* get_key_copy */3](t, 1);
}
function set_key2(t, k) {
return Obj.Ephemeron[/* set_key */4](t, 1, k);
}
function unset_key2(t) {
return Obj.Ephemeron[/* unset_key */5](t, 1);
}
function check_key2(t) {
return Obj.Ephemeron[/* check_key */6](t, 1);
}
function blit_key1(t1, t2) {
return Obj.Ephemeron[/* blit_key */7](t1, 0, t2, 0, 1);
}
function blit_key2(t1, t2) {
return Obj.Ephemeron[/* blit_key */7](t1, 1, t2, 1, 1);
}
function blit_key12(t1, t2) {
return Obj.Ephemeron[/* blit_key */7](t1, 0, t2, 0, 2);
}
function get_data$1(t) {
return Obj.Ephemeron[/* get_data */8](t);
}
function get_data_copy$1(t) {
return Obj.Ephemeron[/* get_data_copy */9](t);
}
function set_data$1(t, d) {
return Obj.Ephemeron[/* set_data */10](t, d);
}
function unset_data$1(t) {
return Obj.Ephemeron[/* unset_data */11](t);
}
function check_data$1(t) {
return Obj.Ephemeron[/* check_data */12](t);
}
function blit_data$1(t1, t2) {
return Obj.Ephemeron[/* blit_data */13](t1, t2);
}
function MakeSeeded$1(H1, H2) {
var create = function (param, d) {
var c = Obj.Ephemeron[/* create */0](2);
Obj.Ephemeron[/* set_data */10](c, d);
set_key1(c, param[0]);
set_key2(c, param[1]);
return c;
};
var hash = function (seed, param) {
return Curry._2(H1[/* hash */1], seed, param[0]) + Caml_int32.imul(Curry._2(H2[/* hash */1], seed, param[1]), 65599) | 0;
};
var equal = function (c, param) {
var match = get_key1(c);
var match$1 = get_key2(c);
if (match !== undefined && match$1 !== undefined) {
if (Curry._2(H1[/* equal */0], param[0], Caml_option.valFromOption(match)) && Curry._2(H2[/* equal */0], param[1], Caml_option.valFromOption(match$1))) {
return /* ETrue */0;
} else {
return /* EFalse */1;
}
} else {
return /* EDead */2;
}
};
var get_key = function (c) {
var match = get_key1(c);
var match$1 = get_key2(c);
if (match !== undefined && match$1 !== undefined) {
return /* tuple */[
Caml_option.valFromOption(match),
Caml_option.valFromOption(match$1)
];
}
};
var set_key_data = function (c, param, d) {
Obj.Ephemeron[/* unset_data */11](c);
set_key1(c, param[0]);
set_key2(c, param[1]);
return Obj.Ephemeron[/* set_data */10](c, d);
};
var check_key = function (c) {
if (Obj.Ephemeron[/* check_key */6](c, 0)) {
return Obj.Ephemeron[/* check_key */6](c, 1);
} else {
return false;
}
};
var power_2_above = function (_x, n) {
while(true) {
var x = _x;
if (x >= n || (x << 1) > Sys.max_array_length) {
return x;
} else {
_x = (x << 1);
continue ;
}
};
};
var prng = Block.__(246, [(function (param) {
return Random.State[/* make_self_init */1](/* () */0);
})]);
var create$1 = function ($staropt$star, initial_size) {
var random = $staropt$star !== undefined ? $staropt$star : Hashtbl.is_randomized(/* () */0);
var s = power_2_above(16, initial_size);
var seed;
if (random) {
var tag = prng.tag | 0;
seed = Random.State[/* bits */3](tag === 250 ? prng[0] : (
tag === 246 ? CamlinternalLazy.force_lazy_block(prng) : prng
));
} else {
seed = 0;
}
return /* record */[
/* size */0,
/* data */Caml_array.caml_make_vect(s, /* Empty */0),
/* seed */seed,
/* initial_size */s
];
};
var clear = function (h) {
h[/* size */0] = 0;
var len = h[/* data */1].length;
for(var i = 0 ,i_finish = len - 1 | 0; i <= i_finish; ++i){
Caml_array.caml_array_set(h[/* data */1], i, /* Empty */0);
}
return /* () */0;
};
var reset = function (h) {
var len = h[/* data */1].length;
if (len === h[/* initial_size */3]) {
return clear(h);
} else {
h[/* size */0] = 0;
h[/* data */1] = Caml_array.caml_make_vect(h[/* initial_size */3], /* Empty */0);
return /* () */0;
}
};
var copy = function (h) {
return /* record */[
/* size */h[/* size */0],
/* data */$$Array.copy(h[/* data */1]),
/* seed */h[/* seed */2],
/* initial_size */h[/* initial_size */3]
];
};
var key_index = function (h, hkey) {
return hkey & (h[/* data */1].length - 1 | 0);
};
var clean = function (h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (check_key(c)) {
return /* Cons */[
param[0],
c,
do_bucket(rest)
];
} else {
h[/* size */0] = h[/* size */0] - 1 | 0;
_param = rest;
continue ;
}
} else {
return /* Empty */0;
}
};
};
var d = h[/* data */1];
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
Caml_array.caml_array_set(d, i, do_bucket(Caml_array.caml_array_get(d, i)));
}
return /* () */0;
};
var resize = function (h) {
var odata = h[/* data */1];
var osize = odata.length;
var nsize = (osize << 1);
clean(h);
if (nsize < Sys.max_array_length && h[/* size */0] >= (osize >>> 1)) {
var ndata = Caml_array.caml_make_vect(nsize, /* Empty */0);
h[/* data */1] = ndata;
var insert_bucket = function (param) {
if (param) {
var hkey = param[0];
insert_bucket(param[2]);
var nidx = key_index(h, hkey);
return Caml_array.caml_array_set(ndata, nidx, /* Cons */[
hkey,
param[1],
Caml_array.caml_array_get(ndata, nidx)
]);
} else {
return /* () */0;
}
};
for(var i = 0 ,i_finish = osize - 1 | 0; i <= i_finish; ++i){
insert_bucket(Caml_array.caml_array_get(odata, i));
}
return /* () */0;
} else {
return 0;
}
};
var add = function (h, key, info) {
var hkey = hash(h[/* seed */2], key);
var i = key_index(h, hkey);
var container = create(key, info);
var bucket_002 = Caml_array.caml_array_get(h[/* data */1], i);
var bucket = /* Cons */[
hkey,
container,
bucket_002
];
Caml_array.caml_array_set(h[/* data */1], i, bucket);
h[/* size */0] = h[/* size */0] + 1 | 0;
if (h[/* size */0] > (h[/* data */1].length << 1)) {
return resize(h);
} else {
return 0;
}
};
var remove = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var remove_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var next = param[2];
var c = param[1];
var hk = param[0];
if (hkey === hk) {
var match = equal(c, key);
switch (match) {
case 0 :
h[/* size */0] = h[/* size */0] - 1 | 0;
return next;
case 1 :
return /* Cons */[
hk,
c,
remove_bucket(next)
];
case 2 :
h[/* size */0] = h[/* size */0] - 1 | 0;
_param = next;
continue ;
}
} else {
return /* Cons */[
hk,
c,
remove_bucket(next)
];
}
} else {
return /* Empty */0;
}
};
};
var i = key_index(h, hkey);
return Caml_array.caml_array_set(h[/* data */1], i, remove_bucket(Caml_array.caml_array_get(h[/* data */1], i)));
};
var find = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var key$1 = key;
var hkey$1 = hkey;
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey));
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (hkey$1 === param[0]) {
var match = equal(c, key$1);
if (match !== 0) {
_param = rest;
continue ;
} else {
var match$1 = get_data$1(c);
if (match$1 !== undefined) {
return Caml_option.valFromOption(match$1);
} else {
_param = rest;
continue ;
}
}
} else {
_param = rest;
continue ;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
};
var find_opt = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var key$1 = key;
var hkey$1 = hkey;
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey));
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (hkey$1 === param[0]) {
var match = equal(c, key$1);
if (match !== 0) {
_param = rest;
continue ;
} else {
var d = get_data$1(c);
if (d !== undefined) {
return d;
} else {
_param = rest;
continue ;
}
}
} else {
_param = rest;
continue ;
}
} else {
return undefined;
}
};
};
var find_all = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var find_in_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
if (hkey === param[0]) {
var match = equal(c, key);
if (match !== 0) {
_param = rest;
continue ;
} else {
var match$1 = get_data$1(c);
if (match$1 !== undefined) {
return /* :: */[
Caml_option.valFromOption(match$1),
find_in_bucket(rest)
];
} else {
_param = rest;
continue ;
}
}
} else {
_param = rest;
continue ;
}
} else {
return /* [] */0;
}
};
};
return find_in_bucket(Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey)));
};
var replace = function (h, key, info) {
var hkey = hash(h[/* seed */2], key);
var i = key_index(h, hkey);
var l = Caml_array.caml_array_get(h[/* data */1], i);
try {
var _param = l;
while(true) {
var param = _param;
if (param) {
var next = param[2];
var c = param[1];
if (hkey === param[0]) {
var match = equal(c, key);
if (match !== 0) {
_param = next;
continue ;
} else {
return set_key_data(c, key, info);
}
} else {
_param = next;
continue ;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
}
catch (exn){
if (exn === Caml_builtin_exceptions.not_found) {
var container = create(key, info);
Caml_array.caml_array_set(h[/* data */1], i, /* Cons */[
hkey,
container,
l
]);
h[/* size */0] = h[/* size */0] + 1 | 0;
if (h[/* size */0] > (h[/* data */1].length << 1)) {
return resize(h);
} else {
return 0;
}
} else {
throw exn;
}
}
};
var mem = function (h, key) {
var hkey = hash(h[/* seed */2], key);
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, hkey));
while(true) {
var param = _param;
if (param) {
var rest = param[2];
if (param[0] === hkey) {
var match = equal(param[1], key);
if (match !== 0) {
_param = rest;
continue ;
} else {
return true;
}
} else {
_param = rest;
continue ;
}
} else {
return false;
}
};
};
var iter = function (f, h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var c = param[1];
var match = get_key(c);
var match$1 = get_data$1(c);
if (match !== undefined) {
if (match$1 !== undefined) {
Curry._2(f, Caml_option.valFromOption(match), Caml_option.valFromOption(match$1));
}
}
_param = param[2];
continue ;
} else {
return /* () */0;
}
};
};
var d = h[/* data */1];
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
do_bucket(Caml_array.caml_array_get(d, i));
}
return /* () */0;
};
var fold = function (f, h, init) {
var do_bucket = function (_b, _accu) {
while(true) {
var accu = _accu;
var b = _b;
if (b) {
var c = b[1];
var match = get_key(c);
var match$1 = get_data$1(c);
var accu$1 = match !== undefined && match$1 !== undefined ? Curry._3(f, Caml_option.valFromOption(match), Caml_option.valFromOption(match$1), accu) : accu;
_accu = accu$1;
_b = b[2];
continue ;
} else {
return accu;
}
};
};
var d = h[/* data */1];
var accu = init;
for(var i = 0 ,i_finish = d.length - 1 | 0; i <= i_finish; ++i){
accu = do_bucket(Caml_array.caml_array_get(d, i), accu);
}
return accu;
};
var filter_map_inplace = function (f, h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
var c = param[1];
var match = get_key(c);
var match$1 = get_data$1(c);
if (match !== undefined) {
if (match$1 !== undefined) {
var k = Caml_option.valFromOption(match);
var match$2 = Curry._2(f, k, Caml_option.valFromOption(match$1));
if (match$2 !== undefined) {
set_key_data(c, k, Caml_option.valFromOption(match$2));
return /* Cons */[
param[0],
c,
do_bucket(rest)
];
} else {
_param = rest;
continue ;
}
} else {
_param = rest;
continue ;
}
} else {
_param = rest;
continue ;
}