512 lines
10 KiB
JavaScript
512 lines
10 KiB
JavaScript
|
|
||
|
|
||
|
import * as Curry from "./curry.js";
|
||
|
import * as Caml_obj from "./caml_obj.js";
|
||
|
import * as Caml_array from "./caml_array.js";
|
||
|
import * as Caml_exceptions from "./caml_exceptions.js";
|
||
|
import * as Caml_js_exceptions from "./caml_js_exceptions.js";
|
||
|
|
||
|
var make_float = Caml_array.make_float;
|
||
|
|
||
|
var Floatarray = {};
|
||
|
|
||
|
function init(l, f) {
|
||
|
if (l === 0) {
|
||
|
return [];
|
||
|
}
|
||
|
if (l < 0) {
|
||
|
throw {
|
||
|
RE_EXN_ID: "Invalid_argument",
|
||
|
_1: "Array.init",
|
||
|
Error: new Error()
|
||
|
};
|
||
|
}
|
||
|
var res = Caml_array.make(l, Curry._1(f, 0));
|
||
|
for(var i = 1; i < l; ++i){
|
||
|
res[i] = Curry._1(f, i);
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
function make_matrix(sx, sy, init) {
|
||
|
var res = Caml_array.make(sx, []);
|
||
|
for(var x = 0; x < sx; ++x){
|
||
|
res[x] = Caml_array.make(sy, init);
|
||
|
}
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
function copy(a) {
|
||
|
var l = a.length;
|
||
|
if (l === 0) {
|
||
|
return [];
|
||
|
} else {
|
||
|
return Caml_array.sub(a, 0, l);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function append(a1, a2) {
|
||
|
var l1 = a1.length;
|
||
|
if (l1 === 0) {
|
||
|
return copy(a2);
|
||
|
} else if (a2.length === 0) {
|
||
|
return Caml_array.sub(a1, 0, l1);
|
||
|
} else {
|
||
|
return a1.concat(a2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function sub(a, ofs, len) {
|
||
|
if (ofs < 0 || len < 0 || ofs > (a.length - len | 0)) {
|
||
|
throw {
|
||
|
RE_EXN_ID: "Invalid_argument",
|
||
|
_1: "Array.sub",
|
||
|
Error: new Error()
|
||
|
};
|
||
|
}
|
||
|
return Caml_array.sub(a, ofs, len);
|
||
|
}
|
||
|
|
||
|
function fill(a, ofs, len, v) {
|
||
|
if (ofs < 0 || len < 0 || ofs > (a.length - len | 0)) {
|
||
|
throw {
|
||
|
RE_EXN_ID: "Invalid_argument",
|
||
|
_1: "Array.fill",
|
||
|
Error: new Error()
|
||
|
};
|
||
|
}
|
||
|
for(var i = ofs ,i_finish = ofs + len | 0; i < i_finish; ++i){
|
||
|
a[i] = v;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function blit(a1, ofs1, a2, ofs2, len) {
|
||
|
if (len < 0 || ofs1 < 0 || ofs1 > (a1.length - len | 0) || ofs2 < 0 || ofs2 > (a2.length - len | 0)) {
|
||
|
throw {
|
||
|
RE_EXN_ID: "Invalid_argument",
|
||
|
_1: "Array.blit",
|
||
|
Error: new Error()
|
||
|
};
|
||
|
}
|
||
|
Caml_array.blit(a1, ofs1, a2, ofs2, len);
|
||
|
}
|
||
|
|
||
|
function iter(f, a) {
|
||
|
for(var i = 0 ,i_finish = a.length; i < i_finish; ++i){
|
||
|
Curry._1(f, a[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function iter2(f, a, b) {
|
||
|
if (a.length !== b.length) {
|
||
|
throw {
|
||
|
RE_EXN_ID: "Invalid_argument",
|
||
|
_1: "Array.iter2: arrays must have the same length",
|
||
|
Error: new Error()
|
||
|
};
|
||
|
}
|
||
|
for(var i = 0 ,i_finish = a.length; i < i_finish; ++i){
|
||
|
Curry._2(f, a[i], b[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function map(f, a) {
|
||
|
var l = a.length;
|
||
|
if (l === 0) {
|
||
|
return [];
|
||
|
}
|
||
|
var r = Caml_array.make(l, Curry._1(f, a[0]));
|
||
|
for(var i = 1; i < l; ++i){
|
||
|
r[i] = Curry._1(f, a[i]);
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
function map2(f, a, b) {
|
||
|
var la = a.length;
|
||
|
var lb = b.length;
|
||
|
if (la !== lb) {
|
||
|
throw {
|
||
|
RE_EXN_ID: "Invalid_argument",
|
||
|
_1: "Array.map2: arrays must have the same length",
|
||
|
Error: new Error()
|
||
|
};
|
||
|
}
|
||
|
if (la === 0) {
|
||
|
return [];
|
||
|
}
|
||
|
var r = Caml_array.make(la, Curry._2(f, a[0], b[0]));
|
||
|
for(var i = 1; i < la; ++i){
|
||
|
r[i] = Curry._2(f, a[i], b[i]);
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
function iteri(f, a) {
|
||
|
for(var i = 0 ,i_finish = a.length; i < i_finish; ++i){
|
||
|
Curry._2(f, i, a[i]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function mapi(f, a) {
|
||
|
var l = a.length;
|
||
|
if (l === 0) {
|
||
|
return [];
|
||
|
}
|
||
|
var r = Caml_array.make(l, Curry._2(f, 0, a[0]));
|
||
|
for(var i = 1; i < l; ++i){
|
||
|
r[i] = Curry._2(f, i, a[i]);
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
function to_list(a) {
|
||
|
var _i = a.length - 1 | 0;
|
||
|
var _res = /* [] */0;
|
||
|
while(true) {
|
||
|
var res = _res;
|
||
|
var i = _i;
|
||
|
if (i < 0) {
|
||
|
return res;
|
||
|
}
|
||
|
_res = {
|
||
|
hd: a[i],
|
||
|
tl: res
|
||
|
};
|
||
|
_i = i - 1 | 0;
|
||
|
continue ;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function list_length(_accu, _param) {
|
||
|
while(true) {
|
||
|
var param = _param;
|
||
|
var accu = _accu;
|
||
|
if (!param) {
|
||
|
return accu;
|
||
|
}
|
||
|
_param = param.tl;
|
||
|
_accu = accu + 1 | 0;
|
||
|
continue ;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function of_list(l) {
|
||
|
if (!l) {
|
||
|
return [];
|
||
|
}
|
||
|
var a = Caml_array.make(list_length(0, l), l.hd);
|
||
|
var _i = 1;
|
||
|
var _param = l.tl;
|
||
|
while(true) {
|
||
|
var param = _param;
|
||
|
var i = _i;
|
||
|
if (!param) {
|
||
|
return a;
|
||
|
}
|
||
|
a[i] = param.hd;
|
||
|
_param = param.tl;
|
||
|
_i = i + 1 | 0;
|
||
|
continue ;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function fold_left(f, x, a) {
|
||
|
var r = x;
|
||
|
for(var i = 0 ,i_finish = a.length; i < i_finish; ++i){
|
||
|
r = Curry._2(f, r, a[i]);
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
function fold_right(f, a, x) {
|
||
|
var r = x;
|
||
|
for(var i = a.length - 1 | 0; i >= 0; --i){
|
||
|
r = Curry._2(f, a[i], r);
|
||
|
}
|
||
|
return r;
|
||
|
}
|
||
|
|
||
|
function exists(p, a) {
|
||
|
var n = a.length;
|
||
|
var _i = 0;
|
||
|
while(true) {
|
||
|
var i = _i;
|
||
|
if (i === n) {
|
||
|
return false;
|
||
|
}
|
||
|
if (Curry._1(p, a[i])) {
|
||
|
return true;
|
||
|
}
|
||
|
_i = i + 1 | 0;
|
||
|
continue ;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function for_all(p, a) {
|
||
|
var n = a.length;
|
||
|
var _i = 0;
|
||
|
while(true) {
|
||
|
var i = _i;
|
||
|
if (i === n) {
|
||
|
return true;
|
||
|
}
|
||
|
if (!Curry._1(p, a[i])) {
|
||
|
return false;
|
||
|
}
|
||
|
_i = i + 1 | 0;
|
||
|
continue ;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function mem(x, a) {
|
||
|
var n = a.length;
|
||
|
var _i = 0;
|
||
|
while(true) {
|
||
|
var i = _i;
|
||
|
if (i === n) {
|
||
|
return false;
|
||
|
}
|
||
|
if (Caml_obj.equal(a[i], x)) {
|
||
|
return true;
|
||
|
}
|
||
|
_i = i + 1 | 0;
|
||
|
continue ;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function memq(x, a) {
|
||
|
var n = a.length;
|
||
|
var _i = 0;
|
||
|
while(true) {
|
||
|
var i = _i;
|
||
|
if (i === n) {
|
||
|
return false;
|
||
|
}
|
||
|
if (x === a[i]) {
|
||
|
return true;
|
||
|
}
|
||
|
_i = i + 1 | 0;
|
||
|
continue ;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
var Bottom = /* @__PURE__ */Caml_exceptions.create("ArrayLabels.Bottom");
|
||
|
|
||
|
function sort(cmp, a) {
|
||
|
var maxson = function (l, i) {
|
||
|
var i31 = ((i + i | 0) + i | 0) + 1 | 0;
|
||
|
var x = i31;
|
||
|
if ((i31 + 2 | 0) < l) {
|
||
|
if (Curry._2(cmp, Caml_array.get(a, i31), Caml_array.get(a, i31 + 1 | 0)) < 0) {
|
||
|
x = i31 + 1 | 0;
|
||
|
}
|
||
|
if (Curry._2(cmp, Caml_array.get(a, x), Caml_array.get(a, i31 + 2 | 0)) < 0) {
|
||
|
x = i31 + 2 | 0;
|
||
|
}
|
||
|
return x;
|
||
|
}
|
||
|
if ((i31 + 1 | 0) < l && Curry._2(cmp, Caml_array.get(a, i31), Caml_array.get(a, i31 + 1 | 0)) < 0) {
|
||
|
return i31 + 1 | 0;
|
||
|
}
|
||
|
if (i31 < l) {
|
||
|
return i31;
|
||
|
}
|
||
|
throw {
|
||
|
RE_EXN_ID: Bottom,
|
||
|
_1: i,
|
||
|
Error: new Error()
|
||
|
};
|
||
|
};
|
||
|
var trickle = function (l, i, e) {
|
||
|
try {
|
||
|
var _i = i;
|
||
|
while(true) {
|
||
|
var i$1 = _i;
|
||
|
var j = maxson(l, i$1);
|
||
|
if (Curry._2(cmp, Caml_array.get(a, j), e) <= 0) {
|
||
|
return Caml_array.set(a, i$1, e);
|
||
|
}
|
||
|
Caml_array.set(a, i$1, Caml_array.get(a, j));
|
||
|
_i = j;
|
||
|
continue ;
|
||
|
};
|
||
|
}
|
||
|
catch (raw_i){
|
||
|
var i$2 = Caml_js_exceptions.internalToOCamlException(raw_i);
|
||
|
if (i$2.RE_EXN_ID === Bottom) {
|
||
|
return Caml_array.set(a, i$2._1, e);
|
||
|
}
|
||
|
throw i$2;
|
||
|
}
|
||
|
};
|
||
|
var bubble = function (l, i) {
|
||
|
try {
|
||
|
var _i = i;
|
||
|
while(true) {
|
||
|
var i$1 = _i;
|
||
|
var j = maxson(l, i$1);
|
||
|
Caml_array.set(a, i$1, Caml_array.get(a, j));
|
||
|
_i = j;
|
||
|
continue ;
|
||
|
};
|
||
|
}
|
||
|
catch (raw_i){
|
||
|
var i$2 = Caml_js_exceptions.internalToOCamlException(raw_i);
|
||
|
if (i$2.RE_EXN_ID === Bottom) {
|
||
|
return i$2._1;
|
||
|
}
|
||
|
throw i$2;
|
||
|
}
|
||
|
};
|
||
|
var trickleup = function (_i, e) {
|
||
|
while(true) {
|
||
|
var i = _i;
|
||
|
var father = (i - 1 | 0) / 3 | 0;
|
||
|
if (i === father) {
|
||
|
throw {
|
||
|
RE_EXN_ID: "Assert_failure",
|
||
|
_1: [
|
||
|
"arrayLabels.ml",
|
||
|
236,
|
||
|
4
|
||
|
],
|
||
|
Error: new Error()
|
||
|
};
|
||
|
}
|
||
|
if (Curry._2(cmp, Caml_array.get(a, father), e) >= 0) {
|
||
|
return Caml_array.set(a, i, e);
|
||
|
}
|
||
|
Caml_array.set(a, i, Caml_array.get(a, father));
|
||
|
if (father <= 0) {
|
||
|
return Caml_array.set(a, 0, e);
|
||
|
}
|
||
|
_i = father;
|
||
|
continue ;
|
||
|
};
|
||
|
};
|
||
|
var l = a.length;
|
||
|
for(var i = ((l + 1 | 0) / 3 | 0) - 1 | 0; i >= 0; --i){
|
||
|
trickle(l, i, Caml_array.get(a, i));
|
||
|
}
|
||
|
for(var i$1 = l - 1 | 0; i$1 >= 2; --i$1){
|
||
|
var e = Caml_array.get(a, i$1);
|
||
|
Caml_array.set(a, i$1, Caml_array.get(a, 0));
|
||
|
trickleup(bubble(i$1, 0), e);
|
||
|
}
|
||
|
if (l <= 1) {
|
||
|
return ;
|
||
|
}
|
||
|
var e$1 = Caml_array.get(a, 1);
|
||
|
Caml_array.set(a, 1, Caml_array.get(a, 0));
|
||
|
Caml_array.set(a, 0, e$1);
|
||
|
}
|
||
|
|
||
|
function stable_sort(cmp, a) {
|
||
|
var merge = function (src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs) {
|
||
|
var src1r = src1ofs + src1len | 0;
|
||
|
var src2r = src2ofs + src2len | 0;
|
||
|
var _i1 = src1ofs;
|
||
|
var _s1 = Caml_array.get(a, src1ofs);
|
||
|
var _i2 = src2ofs;
|
||
|
var _s2 = Caml_array.get(src2, src2ofs);
|
||
|
var _d = dstofs;
|
||
|
while(true) {
|
||
|
var d = _d;
|
||
|
var s2 = _s2;
|
||
|
var i2 = _i2;
|
||
|
var s1 = _s1;
|
||
|
var i1 = _i1;
|
||
|
if (Curry._2(cmp, s1, s2) <= 0) {
|
||
|
Caml_array.set(dst, d, s1);
|
||
|
var i1$1 = i1 + 1 | 0;
|
||
|
if (i1$1 >= src1r) {
|
||
|
return blit(src2, i2, dst, d + 1 | 0, src2r - i2 | 0);
|
||
|
}
|
||
|
_d = d + 1 | 0;
|
||
|
_s1 = Caml_array.get(a, i1$1);
|
||
|
_i1 = i1$1;
|
||
|
continue ;
|
||
|
}
|
||
|
Caml_array.set(dst, d, s2);
|
||
|
var i2$1 = i2 + 1 | 0;
|
||
|
if (i2$1 >= src2r) {
|
||
|
return blit(a, i1, dst, d + 1 | 0, src1r - i1 | 0);
|
||
|
}
|
||
|
_d = d + 1 | 0;
|
||
|
_s2 = Caml_array.get(src2, i2$1);
|
||
|
_i2 = i2$1;
|
||
|
continue ;
|
||
|
};
|
||
|
};
|
||
|
var isortto = function (srcofs, dst, dstofs, len) {
|
||
|
for(var i = 0; i < len; ++i){
|
||
|
var e = Caml_array.get(a, srcofs + i | 0);
|
||
|
var j = (dstofs + i | 0) - 1 | 0;
|
||
|
while(j >= dstofs && Curry._2(cmp, Caml_array.get(dst, j), e) > 0) {
|
||
|
Caml_array.set(dst, j + 1 | 0, Caml_array.get(dst, j));
|
||
|
j = j - 1 | 0;
|
||
|
};
|
||
|
Caml_array.set(dst, j + 1 | 0, e);
|
||
|
}
|
||
|
};
|
||
|
var sortto = function (srcofs, dst, dstofs, len) {
|
||
|
if (len <= 5) {
|
||
|
return isortto(srcofs, dst, dstofs, len);
|
||
|
}
|
||
|
var l1 = len / 2 | 0;
|
||
|
var l2 = len - l1 | 0;
|
||
|
sortto(srcofs + l1 | 0, dst, dstofs + l1 | 0, l2);
|
||
|
sortto(srcofs, a, srcofs + l2 | 0, l1);
|
||
|
merge(srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs);
|
||
|
};
|
||
|
var l = a.length;
|
||
|
if (l <= 5) {
|
||
|
return isortto(0, a, 0, l);
|
||
|
}
|
||
|
var l1 = l / 2 | 0;
|
||
|
var l2 = l - l1 | 0;
|
||
|
var t = Caml_array.make(l2, Caml_array.get(a, 0));
|
||
|
sortto(l1, t, 0, l2);
|
||
|
sortto(0, a, l2, l1);
|
||
|
merge(l2, l1, t, 0, l2, a, 0);
|
||
|
}
|
||
|
|
||
|
var create_matrix = make_matrix;
|
||
|
|
||
|
var concat = Caml_array.concat;
|
||
|
|
||
|
var fast_sort = stable_sort;
|
||
|
|
||
|
export {
|
||
|
init ,
|
||
|
make_matrix ,
|
||
|
create_matrix ,
|
||
|
append ,
|
||
|
concat ,
|
||
|
sub ,
|
||
|
copy ,
|
||
|
fill ,
|
||
|
blit ,
|
||
|
to_list ,
|
||
|
of_list ,
|
||
|
iter ,
|
||
|
map ,
|
||
|
iteri ,
|
||
|
mapi ,
|
||
|
fold_left ,
|
||
|
fold_right ,
|
||
|
iter2 ,
|
||
|
map2 ,
|
||
|
exists ,
|
||
|
for_all ,
|
||
|
mem ,
|
||
|
memq ,
|
||
|
make_float ,
|
||
|
sort ,
|
||
|
stable_sort ,
|
||
|
fast_sort ,
|
||
|
Floatarray ,
|
||
|
}
|
||
|
/* No side effect */
|