UNPKG

bs-platform

Version:

bucklescript compiler, ocaml standard libary by bucklescript and its required runtime support

1,188 lines (1,096 loc) 24.5 kB
'use strict'; var Curry = require("./curry.js"); var Caml_option = require("./caml_option.js"); var Belt_SortArray = require("./belt_SortArray.js"); function treeHeight(n) { if (n !== null) { return n.height; } else { return 0; } } function copy(n) { if (n !== null) { var l = n.left; var r = n.right; return { key: n.key, value: n.value, height: n.height, left: copy(l), right: copy(r) }; } else { return n; } } function create(l, x, d, r) { var hl = treeHeight(l); var hr = treeHeight(r); return { key: x, value: d, height: hl >= hr ? hl + 1 | 0 : hr + 1 | 0, left: l, right: r }; } function singleton(x, d) { return { key: x, value: d, height: 1, left: null, right: null }; } function heightGe(l, r) { if (r !== null) { if (l !== null) { return l.height >= r.height; } else { return false; } } else { return true; } } function updateValue(n, newValue) { if (n.value === newValue) { return n; } else { return { key: n.key, value: newValue, height: n.height, left: n.left, right: n.right }; } } function bal(l, x, d, r) { var hl = l !== null ? l.height : 0; var hr = r !== null ? r.height : 0; if (hl > (hr + 2 | 0)) { var ll = l.left; var lv = l.key; var ld = l.value; var lr = l.right; if (treeHeight(ll) >= treeHeight(lr)) { return create(ll, lv, ld, create(lr, x, d, r)); } else { var lrl = lr.left; var lrv = lr.key; var lrd = lr.value; var lrr = lr.right; return create(create(ll, lv, ld, lrl), lrv, lrd, create(lrr, x, d, r)); } } else if (hr > (hl + 2 | 0)) { var rl = r.left; var rv = r.key; var rd = r.value; var rr = r.right; if (treeHeight(rr) >= treeHeight(rl)) { return create(create(l, x, d, rl), rv, rd, rr); } else { var rll = rl.left; var rlv = rl.key; var rld = rl.value; var rlr = rl.right; return create(create(l, x, d, rll), rlv, rld, create(rlr, rv, rd, rr)); } } else { return { key: x, value: d, height: hl >= hr ? hl + 1 | 0 : hr + 1 | 0, left: l, right: r }; } } function minKey0Aux(_n) { while(true) { var n = _n; var match = n.left; if (match !== null) { _n = match; continue ; } else { return n.key; } }; } function minKey(n) { if (n !== null) { return Caml_option.some(minKey0Aux(n)); } } function minKeyUndefined(n) { if (n !== null) { return minKey0Aux(n); } } function maxKey0Aux(_n) { while(true) { var n = _n; var match = n.right; if (match !== null) { _n = match; continue ; } else { return n.key; } }; } function maxKey(n) { if (n !== null) { return Caml_option.some(maxKey0Aux(n)); } } function maxKeyUndefined(n) { if (n !== null) { return maxKey0Aux(n); } } function minKV0Aux(_n) { while(true) { var n = _n; var match = n.left; if (match !== null) { _n = match; continue ; } else { return /* tuple */[ n.key, n.value ]; } }; } function minimum(n) { if (n !== null) { return minKV0Aux(n); } } function minUndefined(n) { if (n !== null) { return minKV0Aux(n); } } function maxKV0Aux(_n) { while(true) { var n = _n; var match = n.right; if (match !== null) { _n = match; continue ; } else { return /* tuple */[ n.key, n.value ]; } }; } function maximum(n) { if (n !== null) { return maxKV0Aux(n); } } function maxUndefined(n) { if (n !== null) { return maxKV0Aux(n); } } function removeMinAuxWithRef(n, kr, vr) { var ln = n.left; var rn = n.right; var kn = n.key; var vn = n.value; if (ln !== null) { return bal(removeMinAuxWithRef(ln, kr, vr), kn, vn, rn); } else { kr[0] = kn; vr[0] = vn; return rn; } } function isEmpty(x) { return x === null; } function stackAllLeft(_v, _s) { while(true) { var s = _s; var v = _v; if (v !== null) { _s = /* :: */[ v, s ]; _v = v.left; continue ; } else { return s; } }; } function findFirstByU(n, p) { if (n !== null) { var left = findFirstByU(n.left, p); if (left !== undefined) { return left; } else { var v = n.key; var d = n.value; var pvd = p(v, d); if (pvd) { return /* tuple */[ v, d ]; } else { var right = findFirstByU(n.right, p); if (right !== undefined) { return right; } else { return ; } } } } } function findFirstBy(n, p) { return findFirstByU(n, Curry.__2(p)); } function forEachU(_n, f) { while(true) { var n = _n; if (n !== null) { forEachU(n.left, f); f(n.key, n.value); _n = n.right; continue ; } else { return /* () */0; } }; } function forEach(n, f) { return forEachU(n, Curry.__2(f)); } function mapU(n, f) { if (n !== null) { var newLeft = mapU(n.left, f); var newD = f(n.value); var newRight = mapU(n.right, f); return { key: n.key, value: newD, height: n.height, left: newLeft, right: newRight }; } else { return null; } } function map(n, f) { return mapU(n, Curry.__1(f)); } function mapWithKeyU(n, f) { if (n !== null) { var key = n.key; var newLeft = mapWithKeyU(n.left, f); var newD = f(key, n.value); var newRight = mapWithKeyU(n.right, f); return { key: key, value: newD, height: n.height, left: newLeft, right: newRight }; } else { return null; } } function mapWithKey(n, f) { return mapWithKeyU(n, Curry.__2(f)); } function reduceU(_m, _accu, f) { while(true) { var accu = _accu; var m = _m; if (m !== null) { var l = m.left; var v = m.key; var d = m.value; var r = m.right; _accu = f(reduceU(l, accu, f), v, d); _m = r; continue ; } else { return accu; } }; } function reduce(m, accu, f) { return reduceU(m, accu, Curry.__3(f)); } function everyU(_n, p) { while(true) { var n = _n; if (n !== null) { if (p(n.key, n.value) && everyU(n.left, p)) { _n = n.right; continue ; } else { return false; } } else { return true; } }; } function every(n, p) { return everyU(n, Curry.__2(p)); } function someU(_n, p) { while(true) { var n = _n; if (n !== null) { if (p(n.key, n.value) || someU(n.left, p)) { return true; } else { _n = n.right; continue ; } } else { return false; } }; } function some(n, p) { return someU(n, Curry.__2(p)); } function addMinElement(n, k, v) { if (n !== null) { return bal(addMinElement(n.left, k, v), n.key, n.value, n.right); } else { return singleton(k, v); } } function addMaxElement(n, k, v) { if (n !== null) { return bal(n.left, n.key, n.value, addMaxElement(n.right, k, v)); } else { return singleton(k, v); } } function join(ln, v, d, rn) { if (ln !== null) { if (rn !== null) { var ll = ln.left; var lv = ln.key; var ld = ln.value; var lr = ln.right; var lh = ln.height; var rl = rn.left; var rv = rn.key; var rd = rn.value; var rr = rn.right; var rh = rn.height; if (lh > (rh + 2 | 0)) { return bal(ll, lv, ld, join(lr, v, d, rn)); } else if (rh > (lh + 2 | 0)) { return bal(join(ln, v, d, rl), rv, rd, rr); } else { return create(ln, v, d, rn); } } else { return addMaxElement(ln, v, d); } } else { return addMinElement(rn, v, d); } } function concat(t1, t2) { if (t1 !== null) { if (t2 !== null) { var kr = /* record */[/* contents */t2.key]; var vr = /* record */[/* contents */t2.value]; var t2r = removeMinAuxWithRef(t2, kr, vr); return join(t1, kr[0], vr[0], t2r); } else { return t1; } } else { return t2; } } function concatOrJoin(t1, v, d, t2) { if (d !== undefined) { return join(t1, v, Caml_option.valFromOption(d), t2); } else { return concat(t1, t2); } } function keepSharedU(n, p) { if (n !== null) { var v = n.key; var d = n.value; var newLeft = keepSharedU(n.left, p); var pvd = p(v, d); var newRight = keepSharedU(n.right, p); if (pvd) { return join(newLeft, v, d, newRight); } else { return concat(newLeft, newRight); } } else { return null; } } function keepShared(n, p) { return keepSharedU(n, Curry.__2(p)); } function keepMapU(n, p) { if (n !== null) { var v = n.key; var d = n.value; var newLeft = keepMapU(n.left, p); var pvd = p(v, d); var newRight = keepMapU(n.right, p); if (pvd !== undefined) { return join(newLeft, v, Caml_option.valFromOption(pvd), newRight); } else { return concat(newLeft, newRight); } } else { return null; } } function keepMap(n, p) { return keepMapU(n, Curry.__2(p)); } function partitionSharedU(n, p) { if (n !== null) { var key = n.key; var value = n.value; var match = partitionSharedU(n.left, p); var lf = match[1]; var lt = match[0]; var pvd = p(key, value); var match$1 = partitionSharedU(n.right, p); var rf = match$1[1]; var rt = match$1[0]; if (pvd) { return /* tuple */[ join(lt, key, value, rt), concat(lf, rf) ]; } else { return /* tuple */[ concat(lt, rt), join(lf, key, value, rf) ]; } } else { return /* tuple */[ null, null ]; } } function partitionShared(n, p) { return partitionSharedU(n, Curry.__2(p)); } function lengthNode(n) { var l = n.left; var r = n.right; var sizeL = l !== null ? lengthNode(l) : 0; var sizeR = r !== null ? lengthNode(r) : 0; return (1 + sizeL | 0) + sizeR | 0; } function size(n) { if (n !== null) { return lengthNode(n); } else { return 0; } } function toListAux(_n, _accu) { while(true) { var accu = _accu; var n = _n; if (n !== null) { var l = n.left; var r = n.right; var k = n.key; var v = n.value; _accu = /* :: */[ /* tuple */[ k, v ], toListAux(r, accu) ]; _n = l; continue ; } else { return accu; } }; } function toList(s) { return toListAux(s, /* [] */0); } function checkInvariantInternal(_v) { while(true) { var v = _v; if (v !== null) { var l = v.left; var r = v.right; var diff = treeHeight(l) - treeHeight(r) | 0; if (!(diff <= 2 && diff >= -2)) { throw new Error("File \"belt_internalAVLtree.ml\", line 385, characters 6-12"); } checkInvariantInternal(l); _v = r; continue ; } else { return /* () */0; } }; } function fillArrayKey(_n, _i, arr) { while(true) { var i = _i; var n = _n; var l = n.left; var v = n.key; var r = n.right; var next = l !== null ? fillArrayKey(l, i, arr) : i; arr[next] = v; var rnext = next + 1 | 0; if (r !== null) { _i = rnext; _n = r; continue ; } else { return rnext; } }; } function fillArrayValue(_n, _i, arr) { while(true) { var i = _i; var n = _n; var l = n.left; var r = n.right; var next = l !== null ? fillArrayValue(l, i, arr) : i; arr[next] = n.value; var rnext = next + 1 | 0; if (r !== null) { _i = rnext; _n = r; continue ; } else { return rnext; } }; } function fillArray(_n, _i, arr) { while(true) { var i = _i; var n = _n; var l = n.left; var v = n.key; var r = n.right; var next = l !== null ? fillArray(l, i, arr) : i; arr[next] = /* tuple */[ v, n.value ]; var rnext = next + 1 | 0; if (r !== null) { _i = rnext; _n = r; continue ; } else { return rnext; } }; } function toArray(n) { if (n !== null) { var size = lengthNode(n); var v = new Array(size); fillArray(n, 0, v); return v; } else { return /* array */[]; } } function keysToArray(n) { if (n !== null) { var size = lengthNode(n); var v = new Array(size); fillArrayKey(n, 0, v); return v; } else { return /* array */[]; } } function valuesToArray(n) { if (n !== null) { var size = lengthNode(n); var v = new Array(size); fillArrayValue(n, 0, v); return v; } else { return /* array */[]; } } function fromSortedArrayRevAux(arr, off, len) { switch (len) { case 0 : return null; case 1 : var match = arr[off]; return singleton(match[0], match[1]); case 2 : var match_000 = arr[off]; var match_001 = arr[off - 1 | 0]; var match$1 = match_001; var match$2 = match_000; return { key: match$1[0], value: match$1[1], height: 2, left: singleton(match$2[0], match$2[1]), right: null }; case 3 : var match_000$1 = arr[off]; var match_001$1 = arr[off - 1 | 0]; var match_002 = arr[off - 2 | 0]; var match$3 = match_002; var match$4 = match_001$1; var match$5 = match_000$1; return { key: match$4[0], value: match$4[1], height: 2, left: singleton(match$5[0], match$5[1]), right: singleton(match$3[0], match$3[1]) }; default: var nl = len / 2 | 0; var left = fromSortedArrayRevAux(arr, off, nl); var match$6 = arr[off - nl | 0]; var right = fromSortedArrayRevAux(arr, (off - nl | 0) - 1 | 0, (len - nl | 0) - 1 | 0); return create(left, match$6[0], match$6[1], right); } } function fromSortedArrayAux(arr, off, len) { switch (len) { case 0 : return null; case 1 : var match = arr[off]; return singleton(match[0], match[1]); case 2 : var match_000 = arr[off]; var match_001 = arr[off + 1 | 0]; var match$1 = match_001; var match$2 = match_000; return { key: match$1[0], value: match$1[1], height: 2, left: singleton(match$2[0], match$2[1]), right: null }; case 3 : var match_000$1 = arr[off]; var match_001$1 = arr[off + 1 | 0]; var match_002 = arr[off + 2 | 0]; var match$3 = match_002; var match$4 = match_001$1; var match$5 = match_000$1; return { key: match$4[0], value: match$4[1], height: 2, left: singleton(match$5[0], match$5[1]), right: singleton(match$3[0], match$3[1]) }; default: var nl = len / 2 | 0; var left = fromSortedArrayAux(arr, off, nl); var match$6 = arr[off + nl | 0]; var right = fromSortedArrayAux(arr, (off + nl | 0) + 1 | 0, (len - nl | 0) - 1 | 0); return create(left, match$6[0], match$6[1], right); } } function fromSortedArrayUnsafe(arr) { return fromSortedArrayAux(arr, 0, arr.length); } function cmpU(s1, s2, kcmp, vcmp) { var len1 = size(s1); var len2 = size(s2); if (len1 === len2) { var _e1 = stackAllLeft(s1, /* [] */0); var _e2 = stackAllLeft(s2, /* [] */0); var kcmp$1 = kcmp; var vcmp$1 = vcmp; while(true) { var e2 = _e2; var e1 = _e1; if (e1 && e2) { var h2 = e2[0]; var h1 = e1[0]; var c = kcmp$1(h1.key, h2.key); if (c === 0) { var cx = vcmp$1(h1.value, h2.value); if (cx === 0) { _e2 = stackAllLeft(h2.right, e2[1]); _e1 = stackAllLeft(h1.right, e1[1]); continue ; } else { return cx; } } else { return c; } } else { return 0; } }; } else if (len1 < len2) { return -1; } else { return 1; } } function cmp(s1, s2, kcmp, vcmp) { return cmpU(s1, s2, kcmp, Curry.__2(vcmp)); } function eqU(s1, s2, kcmp, veq) { var len1 = size(s1); var len2 = size(s2); if (len1 === len2) { var _e1 = stackAllLeft(s1, /* [] */0); var _e2 = stackAllLeft(s2, /* [] */0); var kcmp$1 = kcmp; var veq$1 = veq; while(true) { var e2 = _e2; var e1 = _e1; if (e1 && e2) { var h2 = e2[0]; var h1 = e1[0]; if (kcmp$1(h1.key, h2.key) === 0 && veq$1(h1.value, h2.value)) { _e2 = stackAllLeft(h2.right, e2[1]); _e1 = stackAllLeft(h1.right, e1[1]); continue ; } else { return false; } } else { return true; } }; } else { return false; } } function eq(s1, s2, kcmp, veq) { return eqU(s1, s2, kcmp, Curry.__2(veq)); } function get(_n, x, cmp) { while(true) { var n = _n; if (n !== null) { var v = n.key; var c = cmp(x, v); if (c === 0) { return Caml_option.some(n.value); } else { _n = c < 0 ? n.left : n.right; continue ; } } else { return ; } }; } function getUndefined(_n, x, cmp) { while(true) { var n = _n; if (n !== null) { var v = n.key; var c = cmp(x, v); if (c === 0) { return n.value; } else { _n = c < 0 ? n.left : n.right; continue ; } } else { return ; } }; } function getExn(_n, x, cmp) { while(true) { var n = _n; if (n !== null) { var v = n.key; var c = cmp(x, v); if (c === 0) { return n.value; } else { _n = c < 0 ? n.left : n.right; continue ; } } else { throw new Error("getExn0"); } }; } function getWithDefault(_n, x, def, cmp) { while(true) { var n = _n; if (n !== null) { var v = n.key; var c = cmp(x, v); if (c === 0) { return n.value; } else { _n = c < 0 ? n.left : n.right; continue ; } } else { return def; } }; } function has(_n, x, cmp) { while(true) { var n = _n; if (n !== null) { var v = n.key; var c = cmp(x, v); if (c === 0) { return true; } else { _n = c < 0 ? n.left : n.right; continue ; } } else { return false; } }; } function rotateWithLeftChild(k2) { var k1 = k2.left; k2.left = k1.right; k1.right = k2; var hlk2 = treeHeight(k2.left); var hrk2 = treeHeight(k2.right); k2.height = ( hlk2 > hrk2 ? hlk2 : hrk2 ) + 1 | 0; var hlk1 = treeHeight(k1.left); var hk2 = k2.height; k1.height = ( hlk1 > hk2 ? hlk1 : hk2 ) + 1 | 0; return k1; } function rotateWithRightChild(k1) { var k2 = k1.right; k1.right = k2.left; k2.left = k1; var hlk1 = treeHeight(k1.left); var hrk1 = treeHeight(k1.right); k1.height = ( hlk1 > hrk1 ? hlk1 : hrk1 ) + 1 | 0; var hrk2 = treeHeight(k2.right); var hk1 = k1.height; k2.height = ( hrk2 > hk1 ? hrk2 : hk1 ) + 1 | 0; return k2; } function doubleWithLeftChild(k3) { var v = rotateWithRightChild(k3.left); k3.left = v; return rotateWithLeftChild(k3); } function doubleWithRightChild(k2) { var v = rotateWithLeftChild(k2.right); k2.right = v; return rotateWithRightChild(k2); } function heightUpdateMutate(t) { var hlt = treeHeight(t.left); var hrt = treeHeight(t.right); t.height = ( hlt > hrt ? hlt : hrt ) + 1 | 0; return t; } function balMutate(nt) { var l = nt.left; var r = nt.right; var hl = treeHeight(l); var hr = treeHeight(r); if (hl > (2 + hr | 0)) { var ll = l.left; var lr = l.right; if (heightGe(ll, lr)) { return heightUpdateMutate(rotateWithLeftChild(nt)); } else { return heightUpdateMutate(doubleWithLeftChild(nt)); } } else if (hr > (2 + hl | 0)) { var rl = r.left; var rr = r.right; if (heightGe(rr, rl)) { return heightUpdateMutate(rotateWithRightChild(nt)); } else { return heightUpdateMutate(doubleWithRightChild(nt)); } } else { nt.height = ( hl > hr ? hl : hr ) + 1 | 0; return nt; } } function updateMutate(t, x, data, cmp) { if (t !== null) { var k = t.key; var c = cmp(x, k); if (c === 0) { t.value = data; return t; } else { var l = t.left; var r = t.right; if (c < 0) { var ll = updateMutate(l, x, data, cmp); t.left = ll; } else { t.right = updateMutate(r, x, data, cmp); } return balMutate(t); } } else { return singleton(x, data); } } function fromArray(xs, cmp) { var len = xs.length; if (len === 0) { return null; } else { var next = Belt_SortArray.strictlySortedLengthU(xs, (function (param, param$1) { return cmp(param[0], param$1[0]) < 0; })); var result; if (next >= 0) { result = fromSortedArrayAux(xs, 0, next); } else { next = -next | 0; result = fromSortedArrayRevAux(xs, next - 1 | 0, next); } for(var i = next ,i_finish = len - 1 | 0; i <= i_finish; ++i){ var match = xs[i]; result = updateMutate(result, match[0], match[1], cmp); } return result; } } function removeMinAuxWithRootMutate(nt, n) { var rn = n.right; var ln = n.left; if (ln !== null) { n.left = removeMinAuxWithRootMutate(nt, ln); return balMutate(n); } else { nt.key = n.key; return rn; } } var empty = null; exports.copy = copy; exports.create = create; exports.bal = bal; exports.singleton = singleton; exports.updateValue = updateValue; exports.minKey = minKey; exports.minKeyUndefined = minKeyUndefined; exports.maxKey = maxKey; exports.maxKeyUndefined = maxKeyUndefined; exports.minimum = minimum; exports.minUndefined = minUndefined; exports.maximum = maximum; exports.maxUndefined = maxUndefined; exports.removeMinAuxWithRef = removeMinAuxWithRef; exports.empty = empty; exports.isEmpty = isEmpty; exports.stackAllLeft = stackAllLeft; exports.findFirstByU = findFirstByU; exports.findFirstBy = findFirstBy; exports.forEachU = forEachU; exports.forEach = forEach; exports.mapU = mapU; exports.map = map; exports.mapWithKeyU = mapWithKeyU; exports.mapWithKey = mapWithKey; exports.reduceU = reduceU; exports.reduce = reduce; exports.everyU = everyU; exports.every = every; exports.someU = someU; exports.some = some; exports.join = join; exports.concat = concat; exports.concatOrJoin = concatOrJoin; exports.keepSharedU = keepSharedU; exports.keepShared = keepShared; exports.keepMapU = keepMapU; exports.keepMap = keepMap; exports.partitionSharedU = partitionSharedU; exports.partitionShared = partitionShared; exports.lengthNode = lengthNode; exports.size = size; exports.toList = toList; exports.checkInvariantInternal = checkInvariantInternal; exports.fillArray = fillArray; exports.toArray = toArray; exports.keysToArray = keysToArray; exports.valuesToArray = valuesToArray; exports.fromSortedArrayAux = fromSortedArrayAux; exports.fromSortedArrayRevAux = fromSortedArrayRevAux; exports.fromSortedArrayUnsafe = fromSortedArrayUnsafe; exports.cmpU = cmpU; exports.cmp = cmp; exports.eqU = eqU; exports.eq = eq; exports.get = get; exports.getUndefined = getUndefined; exports.getWithDefault = getWithDefault; exports.getExn = getExn; exports.has = has; exports.fromArray = fromArray; exports.updateMutate = updateMutate; exports.balMutate = balMutate; exports.removeMinAuxWithRootMutate = removeMinAuxWithRootMutate; /* No side effect */