Skip to content

Commit

Permalink
tweak
Browse files Browse the repository at this point in the history
  • Loading branch information
bobzhang committed Jan 8, 2018
1 parent 7645ff9 commit 71ada78
Show file tree
Hide file tree
Showing 2 changed files with 215 additions and 55 deletions.
66 changes: 65 additions & 1 deletion jscomp/others/bs_internalAVLset.ml
Original file line number Diff line number Diff line change
Expand Up @@ -402,8 +402,27 @@ let balMutate nt =
nt
end

let rec addMinElementMutate n v =
match toOpt n with
| None -> singleton0 v
| Some n ->
let l = left n in
let newL = (addMinElementMutate l v) in
begin
leftSet n newL;
return (balMutate n )
end
let rec addMaxElementMutate n v =
match toOpt n with
| None -> singleton0 v
| Some n ->
rightSet n (addMaxElementMutate (right n) v);
return (balMutate n )


(* [removeMinAuxMutateWithRoot nt n]
remove the minimum element from n, and
set such element to [nt]
*)
let rec removeMinAuxMutateWithRoot nt n =
let rn, ln = right n, left n in
match toOpt ln with
Expand All @@ -414,6 +433,51 @@ let rec removeMinAuxMutateWithRoot nt n =
leftSet n (removeMinAuxMutateWithRoot nt ln);
return (balMutate n)

let rec removeMinAuxMutateWithRef n v =
let rn, ln = right n, left n in
match toOpt ln with
| None -> v := key n; rn
| Some ln ->
leftSet n (removeMinAuxMutateWithRef ln v);
return (balMutate n)

let rec joinMutate ln v rn =
match toOpt ln, toOpt rn with
| None, _ -> addMinElementMutate rn v
| _, None -> addMaxElementMutate ln v
| Some l, Some r ->
let lh, rh = h l, h r in
if lh > rh + 2 then begin
rightSet l (joinMutate (right l) v rn );
return @@ balMutate l
end
else if rh > lh + 2 then begin
leftSet r (joinMutate ln v (left r));
return (balMutate r)
end
else create ln v rn

let concatMutate t1 t2 =
match toOpt t1, toOpt t2 with
| None, _ -> t2
| _, None -> t1
| _, Some t2n ->
let v = ref (key t2n) in
let t2r = removeMinAuxMutateWithRef t2n v in
joinMutate t1 !v t2r

let rec filterMutate s f =
match toOpt s with
| None -> empty
| Some n ->
let l, v, r = left n, key n, right n in
let newL = filterMutate l f in
let pv = f v [@bs] in
let newR = filterMutate r f in
if pv then
joinMutate newL v newR
else concatMutate newL newR




Expand Down
204 changes: 150 additions & 54 deletions lib/js/bs_internalAVLset.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,22 +93,6 @@ function singleton0(x) {
};
}

function addMinElement(v, n) {
if (n !== null) {
return bal(addMinElement(v, n.left), n.key, n.right);
} else {
return singleton0(v);
}
}

function addMaxElement(v, n) {
if (n !== null) {
return bal(n.left, n.key, addMaxElement(v, n.right));
} else {
return singleton0(v);
}
}

function min0Aux(_n) {
while(true) {
var n = _n;
Expand Down Expand Up @@ -281,6 +265,22 @@ function exists0(_n, p) {
};
}

function addMinElement(n, v) {
if (n !== null) {
return bal(addMinElement(n.left, v), n.key, n.right);
} else {
return singleton0(v);
}
}

function addMaxElement(n, v) {
if (n !== null) {
return bal(n.left, n.key, addMaxElement(n.right, v));
} else {
return singleton0(v);
}
}

function join(ln, v, rn) {
if (ln !== null) {
if (rn !== null) {
Expand All @@ -294,10 +294,10 @@ function join(ln, v, rn) {
return create(ln, v, rn);
}
} else {
return addMaxElement(v, ln);
return addMaxElement(ln, v);
}
} else {
return addMinElement(v, rn);
return addMinElement(rn, v);
}
}

Expand All @@ -324,7 +324,11 @@ function filter0(n, p) {
var pv = p(v);
var newR = filter0(r, p);
if (pv) {
return join(newL, v, newR);
if (l === newL && r === newR) {
return n;
} else {
return join(newL, v, newR);
}
} else {
return concat(newL, newR);
}
Expand Down Expand Up @@ -465,6 +469,43 @@ function toArray0(n) {
}
}

function ofSortedArrayAux(arr, off, len) {
if (len > 3 || len < 0) {
var nl = len / 2 | 0;
var left = ofSortedArrayAux(arr, off, nl);
var mid = arr[off + nl | 0];
var right = ofSortedArrayAux(arr, (off + nl | 0) + 1 | 0, (len - nl | 0) - 1 | 0);
return create(left, mid, right);
} else {
switch (len) {
case 0 :
return empty0;
case 1 :
return singleton0(arr[off]);
case 2 :
var x0 = arr[off];
var x1 = arr[off + 1 | 0];
return {
left: singleton0(x0),
key: x1,
right: empty0,
h: 2
};
case 3 :
var x0$1 = arr[off];
var x1$1 = arr[off + 1 | 0];
var x2 = arr[off + 2 | 0];
return {
left: singleton0(x0$1),
key: x1$1,
right: singleton0(x2),
h: 2
};

}
}
}

function rotateWithLeftChild(k2) {
var k1 = k2.left;
k2.left = k1.right;
Expand Down Expand Up @@ -549,6 +590,26 @@ function balMutate(nt) {
}
}

function addMinElementMutate(n, v) {
if (n !== null) {
var l = n.left;
var newL = addMinElementMutate(l, v);
n.left = newL;
return balMutate(n);
} else {
return singleton0(v);
}
}

function addMaxElementMutate(n, v) {
if (n !== null) {
n.right = addMaxElementMutate(n.right, v);
return balMutate(n);
} else {
return singleton0(v);
}
}

function removeMinAuxMutateWithRoot(nt, n) {
var rn = n.right;
var ln = n.left;
Expand All @@ -561,40 +622,69 @@ function removeMinAuxMutateWithRoot(nt, n) {
}
}

function ofSortedArrayAux(arr, off, len) {
if (len > 3 || len < 0) {
var nl = len / 2 | 0;
var left = ofSortedArrayAux(arr, off, nl);
var mid = arr[off + nl | 0];
var right = ofSortedArrayAux(arr, (off + nl | 0) + 1 | 0, (len - nl | 0) - 1 | 0);
return create(left, mid, right);
function removeMinAuxMutateWithRef(n, v) {
var rn = n.right;
var ln = n.left;
if (ln !== null) {
n.left = removeMinAuxMutateWithRef(ln, v);
return balMutate(n);
} else {
switch (len) {
case 0 :
return empty0;
case 1 :
return singleton0(arr[off]);
case 2 :
var x0 = arr[off];
var x1 = arr[off + 1 | 0];
return {
left: singleton0(x0),
key: x1,
right: empty0,
h: 2
};
case 3 :
var x0$1 = arr[off];
var x1$1 = arr[off + 1 | 0];
var x2 = arr[off + 2 | 0];
return {
left: singleton0(x0$1),
key: x1$1,
right: singleton0(x2),
h: 2
};

v[0] = n.key;
return rn;
}
}

function joinMutate(ln, v, rn) {
if (ln !== null) {
if (rn !== null) {
var lh = ln.h;
var rh = rn.h;
if (lh > (rh + 2 | 0)) {
ln.right = joinMutate(ln.right, v, rn);
return balMutate(ln);
} else if (rh > (lh + 2 | 0)) {
rn.left = joinMutate(ln, v, rn.left);
return balMutate(rn);
} else {
return create(ln, v, rn);
}
} else {
return addMaxElementMutate(ln, v);
}
} else {
return addMinElementMutate(rn, v);
}
}

function concatMutate(t1, t2) {
if (t1 !== null) {
if (t2 !== null) {
var v = [t2.key];
var t2r = removeMinAuxMutateWithRef(t2, v);
return joinMutate(t1, v[0], t2r);
} else {
return t1;
}
} else {
return t2;
}
}

function filterMutate(s, f) {
if (s !== null) {
var l = s.left;
var v = s.key;
var r = s.right;
var newL = filterMutate(l, f);
var pv = f(v);
var newR = filterMutate(r, f);
if (pv) {
return joinMutate(newL, v, newR);
} else {
return concatMutate(newL, newR);
}
} else {
return null;
}
}

Expand All @@ -611,8 +701,6 @@ exports.create = create;
exports.heightGe = heightGe;
exports.bal = bal;
exports.singleton0 = singleton0;
exports.addMinElement = addMinElement;
exports.addMaxElement = addMaxElement;
exports.min0Aux = min0Aux;
exports.minOpt0 = minOpt0;
exports.minNull0 = minNull0;
Expand All @@ -627,6 +715,8 @@ exports.iter0 = iter0;
exports.fold0 = fold0;
exports.forAll0 = forAll0;
exports.exists0 = exists0;
exports.addMinElement = addMinElement;
exports.addMaxElement = addMaxElement;
exports.join = join;
exports.concat = concat;
exports.filter0 = filter0;
Expand All @@ -638,13 +728,19 @@ exports.toList0 = toList0;
exports.checkInvariant = checkInvariant;
exports.fillArray = fillArray;
exports.toArray0 = toArray0;
exports.ofSortedArrayAux = ofSortedArrayAux;
exports.rotateWithLeftChild = rotateWithLeftChild;
exports.rotateWithRightChild = rotateWithRightChild;
exports.doubleWithLeftChild = doubleWithLeftChild;
exports.doubleWithRightChild = doubleWithRightChild;
exports.heightUpdateMutate = heightUpdateMutate;
exports.balMutate = balMutate;
exports.addMinElementMutate = addMinElementMutate;
exports.addMaxElementMutate = addMaxElementMutate;
exports.removeMinAuxMutateWithRoot = removeMinAuxMutateWithRoot;
exports.ofSortedArrayAux = ofSortedArrayAux;
exports.removeMinAuxMutateWithRef = removeMinAuxMutateWithRef;
exports.joinMutate = joinMutate;
exports.concatMutate = concatMutate;
exports.filterMutate = filterMutate;
exports.ofSortedArrayUnsafe0 = ofSortedArrayUnsafe0;
/* No side effect */

0 comments on commit 71ada78

Please sign in to comment.