@rescript/std
Version:
The motiviation of this repo is that when ReScript users want to share their library with JS users, the JS users don't need have ReScript toolchain installed, this makes sharing code with JS users easier (more details on that topic can be found in our [Ex
263 lines (231 loc) • 6.39 kB
JavaScript
'use strict';
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) {
return ;
}
var nidx = Caml_hash_primitive.hash_final_mix(Caml_hash_primitive.hash_mix_int(0, old_bucket.key)) & (h_buckets.length - 1 | 0);
var tail = ndata_tail[nidx];
if (tail !== undefined) {
tail.next = old_bucket;
} else {
h_buckets[nidx] = old_bucket;
}
ndata_tail[nidx] = old_bucket;
_old_bucket = old_bucket.next;
continue ;
};
}
function replaceInBucket(key, info, _cell) {
while(true) {
var cell = _cell;
if (cell.key === key) {
cell.value = info;
return false;
}
var cell$1 = cell.next;
if (cell$1 === undefined) {
return true;
}
_cell = cell$1;
continue ;
};
}
function set(h, key, value) {
var h_buckets = h.buckets;
var buckets_len = h_buckets.length;
var i = Caml_hash_primitive.hash_final_mix(Caml_hash_primitive.hash_mix_int(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 odata = h.buckets;
var osize = odata.length;
var nsize = (osize << 1);
if (nsize < osize) {
return ;
}
var h_buckets$1 = new Array(nsize);
var ndata_tail = new Array(nsize);
h.buckets = h_buckets$1;
for(var i$1 = 0; i$1 < osize; ++i$1){
copyBucketReHash(h_buckets$1, ndata_tail, odata[i$1]);
}
for(var i$2 = 0; i$2 < nsize; ++i$2){
var tail = ndata_tail[i$2];
if (tail !== undefined) {
tail.next = undefined;
}
}
return ;
}
}
function remove(h, key) {
var h_buckets = h.buckets;
var i = Caml_hash_primitive.hash_final_mix(Caml_hash_primitive.hash_mix_int(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 ;
} else {
var _prec = bucket;
var _buckets = bucket.next;
while(true) {
var buckets = _buckets;
var prec = _prec;
if (buckets === undefined) {
return ;
}
var cell_next = buckets.next;
if (buckets.key === key) {
prec.next = cell_next;
h.size = h.size - 1 | 0;
return ;
}
_buckets = cell_next;
_prec = buckets;
continue ;
};
}
}
}
function get(h, key) {
var h_buckets = h.buckets;
var nid = Caml_hash_primitive.hash_final_mix(Caml_hash_primitive.hash_mix_int(0, key)) & (h_buckets.length - 1 | 0);
var cell1 = h_buckets[nid];
if (cell1 === undefined) {
return ;
}
if (key === cell1.key) {
return Caml_option.some(cell1.value);
}
var cell2 = cell1.next;
if (cell2 === undefined) {
return ;
}
if (key === cell2.key) {
return Caml_option.some(cell2.value);
}
var cell3 = cell2.next;
if (cell3 !== undefined) {
if (key === cell3.key) {
return Caml_option.some(cell3.value);
} else {
var _buckets = cell3.next;
while(true) {
var buckets = _buckets;
if (buckets === undefined) {
return ;
}
if (key === buckets.key) {
return Caml_option.some(buckets.value);
}
_buckets = buckets.next;
continue ;
};
}
}
}
function has(h, key) {
var h_buckets = h.buckets;
var nid = Caml_hash_primitive.hash_final_mix(Caml_hash_primitive.hash_mix_int(0, key)) & (h_buckets.length - 1 | 0);
var bucket = h_buckets[nid];
if (bucket !== undefined) {
var _cell = bucket;
while(true) {
var cell = _cell;
if (cell.key === key) {
return true;
}
var nextCell = cell.next;
if (nextCell === undefined) {
return false;
}
_cell = nextCell;
continue ;
};
} else {
return false;
}
}
function make(hintSize) {
return Belt_internalBucketsType.make(undefined, undefined, hintSize);
}
function size(h) {
return h.size;
}
function fromArray(arr) {
var len = arr.length;
var v = Belt_internalBucketsType.make(undefined, undefined, len);
for(var i = 0; i < len; ++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 < len; ++i){
var match = arr[i];
set(h, match[0], match[1]);
}
}
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 */