263 lines
6.3 KiB
JavaScript
263 lines
6.3 KiB
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_string(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_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 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_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 ;
|
|
} 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_string(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_string(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 */
|