bs-platform
Version:
bucklescript compiler, ocaml standard libary by bucklescript and its required runtime support
779 lines (749 loc) • 20.5 kB
JavaScript
'use strict';
var $$Array = require("./array.js");
var Block = require("./block.js");
var Curry = require("./curry.js");
var Random = require("./random.js");
var Caml_obj = require("./caml_obj.js");
var Caml_hash = require("./caml_hash.js");
var Caml_array = require("./caml_array.js");
var Caml_primitive = require("./caml_primitive.js");
var CamlinternalLazy = require("./camlinternalLazy.js");
var Caml_missing_polyfill = require("./caml_missing_polyfill.js");
var Caml_builtin_exceptions = require("./caml_builtin_exceptions.js");
function hash(x) {
return Caml_hash.caml_hash(10, 100, 0, x);
}
function hash_param(n1, n2, x) {
return Caml_hash.caml_hash(n1, n2, 0, x);
}
function seeded_hash(seed, x) {
return Caml_hash.caml_hash(10, 100, seed, x);
}
var randomized = /* record */[/* contents */false];
function randomize(param) {
randomized[0] = true;
return /* () */0;
}
var prng = Block.__(246, [(function (param) {
return Random.State[/* make_self_init */1](/* () */0);
})]);
function power_2_above(_x, n) {
while(true) {
var x = _x;
if (x >= n || (x << 1) < x) {
return x;
} else {
_x = (x << 1);
continue ;
}
};
}
function create($staropt$star, initial_size) {
var random = $staropt$star !== undefined ? $staropt$star : 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
];
}
function clear(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;
}
function reset(h) {
var len = h[/* data */1].length;
if (h.length < 4 || 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;
}
}
function copy(h) {
return /* record */[
/* size */h[/* size */0],
/* data */$$Array.copy(h[/* data */1]),
/* seed */h[/* seed */2],
/* initial_size */h[/* initial_size */3]
];
}
function length(h) {
return h[/* size */0];
}
function resize(indexfun, h) {
var odata = h[/* data */1];
var osize = odata.length;
var nsize = (osize << 1);
if (nsize >= osize) {
var ndata = Caml_array.caml_make_vect(nsize, /* Empty */0);
h[/* data */1] = ndata;
var insert_bucket = function (param) {
if (param) {
var key = param[0];
insert_bucket(param[2]);
var nidx = Curry._2(indexfun, h, key);
return Caml_array.caml_array_set(ndata, nidx, /* Cons */[
key,
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;
}
}
function key_index(h, key) {
if (h.length >= 3) {
return Caml_hash.caml_hash(10, 100, h[/* seed */2], key) & (h[/* data */1].length - 1 | 0);
} else {
return Caml_missing_polyfill.not_implemented("caml_hash_univ_param") % h[/* data */1].length;
}
}
function add(h, key, info) {
var i = key_index(h, key);
var bucket_002 = Caml_array.caml_array_get(h[/* data */1], i);
var bucket = /* Cons */[
key,
info,
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(key_index, h);
} else {
return 0;
}
}
function remove(h, key) {
var remove_bucket = function (param) {
if (param) {
var next = param[2];
var k = param[0];
if (Caml_obj.caml_equal(k, key)) {
h[/* size */0] = h[/* size */0] - 1 | 0;
return next;
} else {
return /* Cons */[
k,
param[1],
remove_bucket(next)
];
}
} else {
return /* Empty */0;
}
};
var i = key_index(h, key);
return Caml_array.caml_array_set(h[/* data */1], i, remove_bucket(Caml_array.caml_array_get(h[/* data */1], i)));
}
function find(h, key) {
var match = Caml_array.caml_array_get(h[/* data */1], key_index(h, key));
if (match) {
if (Caml_obj.caml_equal(key, match[0])) {
return match[1];
} else {
var rest1 = match[2];
if (rest1) {
if (Caml_obj.caml_equal(key, rest1[0])) {
return rest1[1];
} else {
var rest2 = rest1[2];
if (rest2) {
if (Caml_obj.caml_equal(key, rest2[0])) {
return rest2[1];
} else {
var key$1 = key;
var _param = rest2[2];
while(true) {
var param = _param;
if (param) {
if (Caml_obj.caml_equal(key$1, param[0])) {
return param[1];
} else {
_param = param[2];
continue ;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
}
} else {
throw Caml_builtin_exceptions.not_found;
}
}
} else {
throw Caml_builtin_exceptions.not_found;
}
}
} else {
throw Caml_builtin_exceptions.not_found;
}
}
function find_all(h, key) {
var find_in_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
if (Caml_obj.caml_equal(param[0], key)) {
return /* :: */[
param[1],
find_in_bucket(rest)
];
} else {
_param = rest;
continue ;
}
} else {
return /* [] */0;
}
};
};
return find_in_bucket(Caml_array.caml_array_get(h[/* data */1], key_index(h, key)));
}
function replace(h, key, info) {
var replace_bucket = function (param) {
if (param) {
var next = param[2];
var k = param[0];
if (Caml_obj.caml_equal(k, key)) {
return /* Cons */[
key,
info,
next
];
} else {
return /* Cons */[
k,
param[1],
replace_bucket(next)
];
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
var i = key_index(h, key);
var l = Caml_array.caml_array_get(h[/* data */1], i);
try {
return Caml_array.caml_array_set(h[/* data */1], i, replace_bucket(l));
}
catch (exn){
if (exn === Caml_builtin_exceptions.not_found) {
Caml_array.caml_array_set(h[/* data */1], i, /* Cons */[
key,
info,
l
]);
h[/* size */0] = h[/* size */0] + 1 | 0;
if (h[/* size */0] > (h[/* data */1].length << 1)) {
return resize(key_index, h);
} else {
return 0;
}
} else {
throw exn;
}
}
}
function mem(h, key) {
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, key));
while(true) {
var param = _param;
if (param) {
if (Caml_obj.caml_equal(param[0], key)) {
return true;
} else {
_param = param[2];
continue ;
}
} else {
return false;
}
};
}
function iter(f, h) {
var do_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
Curry._2(f, param[0], param[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;
}
function fold(f, h, init) {
var do_bucket = function (_b, _accu) {
while(true) {
var accu = _accu;
var b = _b;
if (b) {
_accu = Curry._3(f, b[0], b[1], accu);
_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;
}
function bucket_length(_accu, _param) {
while(true) {
var param = _param;
var accu = _accu;
if (param) {
_param = param[2];
_accu = accu + 1 | 0;
continue ;
} else {
return accu;
}
};
}
function stats(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
];
}
function MakeSeeded(H) {
var key_index = function (h, key) {
return Curry._2(H[/* hash */1], h[/* seed */2], key) & (h[/* data */1].length - 1 | 0);
};
var add = function (h, key, info) {
var i = key_index(h, key);
var bucket_002 = Caml_array.caml_array_get(h[/* data */1], i);
var bucket = /* Cons */[
key,
info,
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(key_index, h);
} else {
return 0;
}
};
var remove = function (h, key) {
var remove_bucket = function (param) {
if (param) {
var next = param[2];
var k = param[0];
if (Curry._2(H[/* equal */0], k, key)) {
h[/* size */0] = h[/* size */0] - 1 | 0;
return next;
} else {
return /* Cons */[
k,
param[1],
remove_bucket(next)
];
}
} else {
return /* Empty */0;
}
};
var i = key_index(h, key);
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 match = Caml_array.caml_array_get(h[/* data */1], key_index(h, key));
if (match) {
var rest1 = match[2];
if (Curry._2(H[/* equal */0], key, match[0])) {
return match[1];
} else if (rest1) {
var rest2 = rest1[2];
if (Curry._2(H[/* equal */0], key, rest1[0])) {
return rest1[1];
} else if (rest2) {
if (Curry._2(H[/* equal */0], key, rest2[0])) {
return rest2[1];
} else {
var key$1 = key;
var _param = rest2[2];
while(true) {
var param = _param;
if (param) {
if (Curry._2(H[/* equal */0], key$1, param[0])) {
return param[1];
} else {
_param = param[2];
continue ;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
}
} else {
throw Caml_builtin_exceptions.not_found;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
var find_all = function (h, key) {
var find_in_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
if (Curry._2(H[/* equal */0], param[0], key)) {
return /* :: */[
param[1],
find_in_bucket(rest)
];
} else {
_param = rest;
continue ;
}
} else {
return /* [] */0;
}
};
};
return find_in_bucket(Caml_array.caml_array_get(h[/* data */1], key_index(h, key)));
};
var replace = function (h, key, info) {
var replace_bucket = function (param) {
if (param) {
var next = param[2];
var k = param[0];
if (Curry._2(H[/* equal */0], k, key)) {
return /* Cons */[
key,
info,
next
];
} else {
return /* Cons */[
k,
param[1],
replace_bucket(next)
];
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
var i = key_index(h, key);
var l = Caml_array.caml_array_get(h[/* data */1], i);
try {
return Caml_array.caml_array_set(h[/* data */1], i, replace_bucket(l));
}
catch (exn){
if (exn === Caml_builtin_exceptions.not_found) {
Caml_array.caml_array_set(h[/* data */1], i, /* Cons */[
key,
info,
l
]);
h[/* size */0] = h[/* size */0] + 1 | 0;
if (h[/* size */0] > (h[/* data */1].length << 1)) {
return resize(key_index, h);
} else {
return 0;
}
} else {
throw exn;
}
}
};
var mem = function (h, key) {
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, key));
while(true) {
var param = _param;
if (param) {
if (Curry._2(H[/* equal */0], param[0], key)) {
return true;
} else {
_param = param[2];
continue ;
}
} else {
return false;
}
};
};
return /* module */[
/* create */create,
/* clear */clear,
/* reset */reset,
/* copy */copy,
/* add */add,
/* remove */remove,
/* find */find,
/* find_all */find_all,
/* replace */replace,
/* mem */mem,
/* iter */iter,
/* fold */fold,
/* length */length,
/* stats */stats
];
}
function Make(H) {
var equal = H[/* equal */0];
var key_index = function (h, key) {
return Curry._1(H[/* hash */1], key) & (h[/* data */1].length - 1 | 0);
};
var add = function (h, key, info) {
var i = key_index(h, key);
var bucket_002 = Caml_array.caml_array_get(h[/* data */1], i);
var bucket = /* Cons */[
key,
info,
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(key_index, h);
} else {
return 0;
}
};
var remove = function (h, key) {
var remove_bucket = function (param) {
if (param) {
var next = param[2];
var k = param[0];
if (Curry._2(equal, k, key)) {
h[/* size */0] = h[/* size */0] - 1 | 0;
return next;
} else {
return /* Cons */[
k,
param[1],
remove_bucket(next)
];
}
} else {
return /* Empty */0;
}
};
var i = key_index(h, key);
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 match = Caml_array.caml_array_get(h[/* data */1], key_index(h, key));
if (match) {
var rest1 = match[2];
if (Curry._2(equal, key, match[0])) {
return match[1];
} else if (rest1) {
var rest2 = rest1[2];
if (Curry._2(equal, key, rest1[0])) {
return rest1[1];
} else if (rest2) {
if (Curry._2(equal, key, rest2[0])) {
return rest2[1];
} else {
var key$1 = key;
var _param = rest2[2];
while(true) {
var param = _param;
if (param) {
if (Curry._2(equal, key$1, param[0])) {
return param[1];
} else {
_param = param[2];
continue ;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
}
} else {
throw Caml_builtin_exceptions.not_found;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
var find_all = function (h, key) {
var find_in_bucket = function (_param) {
while(true) {
var param = _param;
if (param) {
var rest = param[2];
if (Curry._2(equal, param[0], key)) {
return /* :: */[
param[1],
find_in_bucket(rest)
];
} else {
_param = rest;
continue ;
}
} else {
return /* [] */0;
}
};
};
return find_in_bucket(Caml_array.caml_array_get(h[/* data */1], key_index(h, key)));
};
var replace = function (h, key, info) {
var replace_bucket = function (param) {
if (param) {
var next = param[2];
var k = param[0];
if (Curry._2(equal, k, key)) {
return /* Cons */[
key,
info,
next
];
} else {
return /* Cons */[
k,
param[1],
replace_bucket(next)
];
}
} else {
throw Caml_builtin_exceptions.not_found;
}
};
var i = key_index(h, key);
var l = Caml_array.caml_array_get(h[/* data */1], i);
try {
return Caml_array.caml_array_set(h[/* data */1], i, replace_bucket(l));
}
catch (exn){
if (exn === Caml_builtin_exceptions.not_found) {
Caml_array.caml_array_set(h[/* data */1], i, /* Cons */[
key,
info,
l
]);
h[/* size */0] = h[/* size */0] + 1 | 0;
if (h[/* size */0] > (h[/* data */1].length << 1)) {
return resize(key_index, h);
} else {
return 0;
}
} else {
throw exn;
}
}
};
var mem = function (h, key) {
var _param = Caml_array.caml_array_get(h[/* data */1], key_index(h, key));
while(true) {
var param = _param;
if (param) {
if (Curry._2(equal, param[0], key)) {
return true;
} else {
_param = param[2];
continue ;
}
} else {
return false;
}
};
};
var create$1 = function (sz) {
return create(false, sz);
};
return /* module */[
/* create */create$1,
/* clear */clear,
/* reset */reset,
/* copy */copy,
/* add */add,
/* remove */remove,
/* find */find,
/* find_all */find_all,
/* replace */replace,
/* mem */mem,
/* iter */iter,
/* fold */fold,
/* length */length,
/* stats */stats
];
}
var seeded_hash_param = Caml_hash.caml_hash;
exports.create = create;
exports.clear = clear;
exports.reset = reset;
exports.copy = copy;
exports.add = add;
exports.find = find;
exports.find_all = find_all;
exports.mem = mem;
exports.remove = remove;
exports.replace = replace;
exports.iter = iter;
exports.fold = fold;
exports.length = length;
exports.randomize = randomize;
exports.stats = stats;
exports.Make = Make;
exports.MakeSeeded = MakeSeeded;
exports.hash = hash;
exports.seeded_hash = seeded_hash;
exports.hash_param = hash_param;
exports.seeded_hash_param = seeded_hash_param;
/* No side effect */