bs-platform
Version:
bucklescript compiler, ocaml standard libary by bucklescript and its required runtime support
286 lines (256 loc) • 7.44 kB
JavaScript
;
var Caml_option = require("./caml_option.js");
var Caml_hash_primitive = require("./caml_hash_primitive.js");
var Belt_internalBuckets = require("./belt_internalBuckets.js");
var Belt_internalBucketsType = require("./belt_internalBucketsType.js");
function copyBucketReHash(h_buckets, ndata_tail, _old_bucket) {
while(true) {
var old_bucket = _old_bucket;
if (old_bucket !== undefined) {
var s = old_bucket.key;
var nidx = Caml_hash_primitive.caml_hash_final_mix(Caml_hash_primitive.caml_hash_mix_string(0, s)) & (h_buckets.length - 1 | 0);
var match = ndata_tail[nidx];
if (match !== undefined) {
match.next = old_bucket;
} else {
h_buckets[nidx] = old_bucket;
}
ndata_tail[nidx] = old_bucket;
_old_bucket = old_bucket.next;
continue ;
} else {
return /* () */0;
}
};
}
function replaceInBucket(key, info, _cell) {
while(true) {
var cell = _cell;
if (cell.key === key) {
cell.value = info;
return false;
} else {
var match = cell.next;
if (match !== undefined) {
_cell = match;
continue ;
} else {
return true;
}
}
};
}
function set(h, key, value) {
var h_buckets = h.buckets;
var buckets_len = h_buckets.length;
var i = Caml_hash_primitive.caml_hash_final_mix(Caml_hash_primitive.caml_hash_mix_string(0, key)) & (buckets_len - 1 | 0);
var l = h_buckets[i];
if (l !== undefined) {
if (replaceInBucket(key, value, l)) {
h_buckets[i] = {
key: key,
value: value,
next: l
};
h.size = h.size + 1 | 0;
}
} else {
h_buckets[i] = {
key: key,
value: value,
next: undefined
};
h.size = h.size + 1 | 0;
}
if (h.size > (buckets_len << 1)) {
var h$1 = h;
var odata = h$1.buckets;
var osize = odata.length;
var nsize = (osize << 1);
if (nsize >= osize) {
var h_buckets$1 = new Array(nsize);
var ndata_tail = new Array(nsize);
h$1.buckets = h_buckets$1;
for(var i$1 = 0 ,i_finish = osize - 1 | 0; i$1 <= i_finish; ++i$1){
copyBucketReHash(h_buckets$1, ndata_tail, odata[i$1]);
}
for(var i$2 = 0 ,i_finish$1 = nsize - 1 | 0; i$2 <= i_finish$1; ++i$2){
var match = ndata_tail[i$2];
if (match !== undefined) {
match.next = undefined;
}
}
return /* () */0;
} else {
return 0;
}
} else {
return 0;
}
}
function remove(h, key) {
var h_buckets = h.buckets;
var i = Caml_hash_primitive.caml_hash_final_mix(Caml_hash_primitive.caml_hash_mix_string(0, key)) & (h_buckets.length - 1 | 0);
var bucket = h_buckets[i];
if (bucket !== undefined) {
if (bucket.key === key) {
h_buckets[i] = bucket.next;
h.size = h.size - 1 | 0;
return /* () */0;
} else {
var h$1 = h;
var key$1 = key;
var _prec = bucket;
var _buckets = bucket.next;
while(true) {
var buckets = _buckets;
var prec = _prec;
if (buckets !== undefined) {
var cell_next = buckets.next;
if (buckets.key === key$1) {
prec.next = cell_next;
h$1.size = h$1.size - 1 | 0;
return /* () */0;
} else {
_buckets = cell_next;
_prec = buckets;
continue ;
}
} else {
return /* () */0;
}
};
}
} else {
return /* () */0;
}
}
function get(h, key) {
var h_buckets = h.buckets;
var nid = Caml_hash_primitive.caml_hash_final_mix(Caml_hash_primitive.caml_hash_mix_string(0, key)) & (h_buckets.length - 1 | 0);
var match = h_buckets[nid];
if (match !== undefined) {
if (key === match.key) {
return Caml_option.some(match.value);
} else {
var match$1 = match.next;
if (match$1 !== undefined) {
if (key === match$1.key) {
return Caml_option.some(match$1.value);
} else {
var match$2 = match$1.next;
if (match$2 !== undefined) {
if (key === match$2.key) {
return Caml_option.some(match$2.value);
} else {
var key$1 = key;
var _buckets = match$2.next;
while(true) {
var buckets = _buckets;
if (buckets !== undefined) {
if (key$1 === buckets.key) {
return Caml_option.some(buckets.value);
} else {
_buckets = buckets.next;
continue ;
}
} else {
return undefined;
}
};
}
} else {
return undefined;
}
}
} else {
return undefined;
}
}
}
}
function has(h, key) {
var h_buckets = h.buckets;
var nid = Caml_hash_primitive.caml_hash_final_mix(Caml_hash_primitive.caml_hash_mix_string(0, key)) & (h_buckets.length - 1 | 0);
var bucket = h_buckets[nid];
if (bucket !== undefined) {
var key$1 = key;
var _cell = bucket;
while(true) {
var cell = _cell;
if (cell.key === key$1) {
return true;
} else {
var match = cell.next;
if (match !== undefined) {
_cell = match;
continue ;
} else {
return false;
}
}
};
} else {
return false;
}
}
function make(hintSize) {
return Belt_internalBucketsType.make(/* () */0, /* () */0, hintSize);
}
function size(prim) {
return prim.size;
}
function fromArray(arr) {
var len = arr.length;
var v = Belt_internalBucketsType.make(/* () */0, /* () */0, len);
for(var i = 0 ,i_finish = len - 1 | 0; i <= i_finish; ++i){
var match = arr[i];
set(v, match[0], match[1]);
}
return v;
}
function mergeMany(h, arr) {
var len = arr.length;
for(var i = 0 ,i_finish = len - 1 | 0; i <= i_finish; ++i){
var match = arr[i];
set(h, match[0], match[1]);
}
return /* () */0;
}
var clear = Belt_internalBucketsType.clear;
var isEmpty = Belt_internalBucketsType.isEmpty;
var copy = Belt_internalBuckets.copy;
var forEachU = Belt_internalBuckets.forEachU;
var forEach = Belt_internalBuckets.forEach;
var reduceU = Belt_internalBuckets.reduceU;
var reduce = Belt_internalBuckets.reduce;
var keepMapInPlaceU = Belt_internalBuckets.keepMapInPlaceU;
var keepMapInPlace = Belt_internalBuckets.keepMapInPlace;
var toArray = Belt_internalBuckets.toArray;
var keysToArray = Belt_internalBuckets.keysToArray;
var valuesToArray = Belt_internalBuckets.valuesToArray;
var getBucketHistogram = Belt_internalBuckets.getBucketHistogram;
var logStats = Belt_internalBuckets.logStats;
exports.make = make;
exports.clear = clear;
exports.isEmpty = isEmpty;
exports.set = set;
exports.copy = copy;
exports.get = get;
exports.has = has;
exports.remove = remove;
exports.forEachU = forEachU;
exports.forEach = forEach;
exports.reduceU = reduceU;
exports.reduce = reduce;
exports.keepMapInPlaceU = keepMapInPlaceU;
exports.keepMapInPlace = keepMapInPlace;
exports.size = size;
exports.toArray = toArray;
exports.keysToArray = keysToArray;
exports.valuesToArray = valuesToArray;
exports.fromArray = fromArray;
exports.mergeMany = mergeMany;
exports.getBucketHistogram = getBucketHistogram;
exports.logStats = logStats;
/* No side effect */