UNPKG

rescript

Version:
375 lines (359 loc) 8.05 kB
import * as Belt_Array from "./belt_Array.js"; function sortedLengthAuxMore(xs, _prec, _acc, len) { while(true) { var acc = _acc; var prec = _prec; if (acc >= len) { return acc; } var v = xs[acc]; if (prec <= v) { return acc; } _acc = acc + 1 | 0; _prec = v; continue ; }; } function strictlySortedLength(xs) { var len = xs.length; if (len === 0 || len === 1) { return len; } var x0 = xs[0]; var x1 = xs[1]; if (x0 < x1) { var _prec = x1; var _acc = 2; while(true) { var acc = _acc; var prec = _prec; if (acc >= len) { return acc; } var v = xs[acc]; if (prec >= v) { return acc; } _acc = acc + 1 | 0; _prec = v; continue ; }; } else if (x0 > x1) { return -sortedLengthAuxMore(xs, x1, 2, len) | 0; } else { return 1; } } function isSorted(a) { var len = a.length; if (len === 0) { return true; } else { var _i = 0; var last_bound = len - 1 | 0; while(true) { var i = _i; if (i === last_bound) { return true; } if (a[i] > a[i + 1 | 0]) { return false; } _i = i + 1 | 0; continue ; }; } } function merge(src, src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs) { var src1r = src1ofs + src1len | 0; var src2r = src2ofs + src2len | 0; var _i1 = src1ofs; var _s1 = src[src1ofs]; var _i2 = src2ofs; var _s2 = src2[src2ofs]; var _d = dstofs; while(true) { var d = _d; var s2 = _s2; var i2 = _i2; var s1 = _s1; var i1 = _i1; if (s1 <= s2) { dst[d] = s1; var i1$1 = i1 + 1 | 0; if (i1$1 >= src1r) { return Belt_Array.blitUnsafe(src2, i2, dst, d + 1 | 0, src2r - i2 | 0); } _d = d + 1 | 0; _s1 = src[i1$1]; _i1 = i1$1; continue ; } dst[d] = s2; var i2$1 = i2 + 1 | 0; if (i2$1 >= src2r) { return Belt_Array.blitUnsafe(src, i1, dst, d + 1 | 0, src1r - i1 | 0); } _d = d + 1 | 0; _s2 = src2[i2$1]; _i2 = i2$1; continue ; }; } function union(src, src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs) { var src1r = src1ofs + src1len | 0; var src2r = src2ofs + src2len | 0; var _i1 = src1ofs; var _s1 = src[src1ofs]; var _i2 = src2ofs; var _s2 = src2[src2ofs]; var _d = dstofs; while(true) { var d = _d; var s2 = _s2; var i2 = _i2; var s1 = _s1; var i1 = _i1; if (s1 < s2) { dst[d] = s1; var i1$1 = i1 + 1 | 0; var d$1 = d + 1 | 0; if (i1$1 < src1r) { _d = d$1; _s1 = src[i1$1]; _i1 = i1$1; continue ; } Belt_Array.blitUnsafe(src2, i2, dst, d$1, src2r - i2 | 0); return (d$1 + src2r | 0) - i2 | 0; } if (s1 === s2) { dst[d] = s1; var i1$2 = i1 + 1 | 0; var i2$1 = i2 + 1 | 0; var d$2 = d + 1 | 0; if (!(i1$2 < src1r && i2$1 < src2r)) { if (i1$2 === src1r) { Belt_Array.blitUnsafe(src2, i2$1, dst, d$2, src2r - i2$1 | 0); return (d$2 + src2r | 0) - i2$1 | 0; } else { Belt_Array.blitUnsafe(src, i1$2, dst, d$2, src1r - i1$2 | 0); return (d$2 + src1r | 0) - i1$2 | 0; } } _d = d$2; _s2 = src2[i2$1]; _i2 = i2$1; _s1 = src[i1$2]; _i1 = i1$2; continue ; } dst[d] = s2; var i2$2 = i2 + 1 | 0; var d$3 = d + 1 | 0; if (i2$2 < src2r) { _d = d$3; _s2 = src2[i2$2]; _i2 = i2$2; continue ; } Belt_Array.blitUnsafe(src, i1, dst, d$3, src1r - i1 | 0); return (d$3 + src1r | 0) - i1 | 0; }; } function intersect(src, src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs) { var src1r = src1ofs + src1len | 0; var src2r = src2ofs + src2len | 0; var _i1 = src1ofs; var _s1 = src[src1ofs]; var _i2 = src2ofs; var _s2 = src2[src2ofs]; var _d = dstofs; while(true) { var d = _d; var s2 = _s2; var i2 = _i2; var s1 = _s1; var i1 = _i1; if (s1 < s2) { var i1$1 = i1 + 1 | 0; if (i1$1 >= src1r) { return d; } _s1 = src[i1$1]; _i1 = i1$1; continue ; } if (s1 === s2) { dst[d] = s1; var i1$2 = i1 + 1 | 0; var i2$1 = i2 + 1 | 0; var d$1 = d + 1 | 0; if (!(i1$2 < src1r && i2$1 < src2r)) { return d$1; } _d = d$1; _s2 = src2[i2$1]; _i2 = i2$1; _s1 = src[i1$2]; _i1 = i1$2; continue ; } var i2$2 = i2 + 1 | 0; if (i2$2 >= src2r) { return d; } _s2 = src2[i2$2]; _i2 = i2$2; continue ; }; } function diff(src, src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs) { var src1r = src1ofs + src1len | 0; var src2r = src2ofs + src2len | 0; var _i1 = src1ofs; var _s1 = src[src1ofs]; var _i2 = src2ofs; var _s2 = src2[src2ofs]; var _d = dstofs; while(true) { var d = _d; var s2 = _s2; var i2 = _i2; var s1 = _s1; var i1 = _i1; if (s1 < s2) { dst[d] = s1; var d$1 = d + 1 | 0; var i1$1 = i1 + 1 | 0; if (i1$1 >= src1r) { return d$1; } _d = d$1; _s1 = src[i1$1]; _i1 = i1$1; continue ; } if (s1 === s2) { var i1$2 = i1 + 1 | 0; var i2$1 = i2 + 1 | 0; if (!(i1$2 < src1r && i2$1 < src2r)) { if (i1$2 === src1r) { return d; } else { Belt_Array.blitUnsafe(src, i1$2, dst, d, src1r - i1$2 | 0); return (d + src1r | 0) - i1$2 | 0; } } _s2 = src2[i2$1]; _i2 = i2$1; _s1 = src[i1$2]; _i1 = i1$2; continue ; } var i2$2 = i2 + 1 | 0; if (i2$2 < src2r) { _s2 = src2[i2$2]; _i2 = i2$2; continue ; } Belt_Array.blitUnsafe(src, i1, dst, d, src1r - i1 | 0); return (d + src1r | 0) - i1 | 0; }; } function insertionSort(src, srcofs, dst, dstofs, len) { for(var i = 0; i < len; ++i){ var e = src[srcofs + i | 0]; var j = (dstofs + i | 0) - 1 | 0; while(j >= dstofs && dst[j] > e) { dst[j + 1 | 0] = dst[j]; j = j - 1 | 0; }; dst[j + 1 | 0] = e; } } function sortTo(src, srcofs, dst, dstofs, len) { if (len <= 5) { return insertionSort(src, srcofs, dst, dstofs, len); } var l1 = len / 2 | 0; var l2 = len - l1 | 0; sortTo(src, srcofs + l1 | 0, dst, dstofs + l1 | 0, l2); sortTo(src, srcofs, src, srcofs + l2 | 0, l1); merge(src, srcofs + l2 | 0, l1, dst, dstofs + l1 | 0, l2, dst, dstofs); } function stableSortInPlace(a) { var l = a.length; if (l <= 5) { return insertionSort(a, 0, a, 0, l); } var l1 = l / 2 | 0; var l2 = l - l1 | 0; var t = new Array(l2); sortTo(a, l1, t, 0, l2); sortTo(a, 0, a, l2, l1); merge(a, l2, l1, t, 0, l2, a, 0); } function stableSort(a) { var b = a.slice(0); stableSortInPlace(b); return b; } function binarySearch(sorted, key) { var len = sorted.length; if (len === 0) { return -1; } var lo = sorted[0]; if (key < lo) { return -1; } var hi = sorted[len - 1 | 0]; if (key > hi) { return -(len + 1 | 0) | 0; } else { var _lo = 0; var _hi = len - 1 | 0; while(true) { var hi$1 = _hi; var lo$1 = _lo; var mid = (lo$1 + hi$1 | 0) / 2 | 0; var midVal = sorted[mid]; if (key === midVal) { return mid; } if (key < midVal) { if (hi$1 === mid) { if (sorted[lo$1] === key) { return lo$1; } else { return -(hi$1 + 1 | 0) | 0; } } _hi = mid; continue ; } if (lo$1 === mid) { if (sorted[hi$1] === key) { return hi$1; } else { return -(hi$1 + 1 | 0) | 0; } } _lo = mid; continue ; }; } } export { strictlySortedLength , isSorted , stableSortInPlace , stableSort , binarySearch , union , intersect , diff , } /* No side effect */