Skip to content

Commit

Permalink
tweak
Browse files Browse the repository at this point in the history
  • Loading branch information
bobzhang committed Jan 5, 2018
1 parent aeed08a commit b1c549e
Show file tree
Hide file tree
Showing 2 changed files with 80 additions and 75 deletions.
69 changes: 35 additions & 34 deletions jscomp/others/bs_internalAVLset.ml
Original file line number Diff line number Diff line change
Expand Up @@ -139,32 +139,6 @@ let rec removeMinAuxWithRef n v =



(* [join ln v rn] return a balanced tree simliar to [create ln v rn]
bal, but no assumptions are made on the
relative heights of [ln] and [rn]. *)

let rec join ln v rn =
match (toOpt ln, toOpt rn) with
(None, _) -> addMinElement v rn
| (_, None) -> addMaxElement v ln
| Some l, Some r ->
let lh = h l in
let rh = h r in
if lh > rh + 2 then bal (left l) (key l) (join (right l) v rn) else
if rh > lh + 2 then bal (join ln v (left r)) (key r) (right r) else
create ln v rn

(* [concat l r]
No assumption on the heights of l and r. *)

let concat t1 t2 =
match (toOpt t1, toOpt t2) with
(None, _) -> t2
| (_, None) -> t1
| (_, Some t2n) ->
let v = ref (key t2n ) in
let t2r = removeMinAuxWithRef t2n v in
join t1 !v t2r

(* Implementation of the set operations *)

Expand Down Expand Up @@ -211,26 +185,53 @@ let rec exists0 n p =
exists0 (left n) p ||
exists0 (right n) p


(* [join ln v rn] return a balanced tree simliar to [create ln v rn]
bal, but no assumptions are made on the
relative heights of [ln] and [rn]. *)

let rec join ln v rn =
match (toOpt ln, toOpt rn) with
(None, _) -> addMinElement v rn
| (_, None) -> addMaxElement v ln
| Some l, Some r ->
let lh = h l in
let rh = h r in
if lh > rh + 2 then bal (left l) (key l) (join (right l) v rn) else
if rh > lh + 2 then bal (join ln v (left r)) (key r) (right r) else
create ln v rn

(* [concat l r]
No assumption on the heights of l and r. *)

let concat t1 t2 =
match (toOpt t1, toOpt t2) with
(None, _) -> t2
| (_, None) -> t1
| (_, Some t2n) ->
let v = ref (key t2n ) in
let t2r = removeMinAuxWithRef t2n v in
join t1 !v t2r


let rec filter0 n p =
match toOpt n with
| None -> empty
| Some n ->
(* call [p] in the expected left-to-right order *)
let newL = filter0 (left n) p in
let v = key n in
let l,v,r = left n, key n, right n in
let newL = filter0 l p in
let pv = p v [@bs] in
let newR = filter0 (right n) p in
let newR = filter0 r p in
if pv then join newL v newR else concat newL newR

let rec partition0 n p =
match toOpt n with
| None -> (empty, empty)
| Some n ->
(* call [p] in the expected left-to-right order *)
let (lt, lf) = partition0 (left n) p in
let v = key n in
let l,v,r = left n, key n, right n in
let (lt, lf) = partition0 l p in
let pv = p v [@bs] in
let (rt, rf) = partition0 (right n) p in
let (rt, rf) = partition0 r p in
if pv
then (join lt v rt, concat lf rf)
else (concat lt rt, join lf v rf)
Expand Down
86 changes: 45 additions & 41 deletions lib/js/bs_internalAVLset.js
Original file line number Diff line number Diff line change
Expand Up @@ -180,40 +180,6 @@ function removeMinAuxWithRef(n, v) {
}
}

function join(ln, v, rn) {
if (ln !== null) {
if (rn !== null) {
var lh = ln.h;
var rh = rn.h;
if (lh > (rh + 2 | 0)) {
return bal(ln.left, ln.key, join(ln.right, v, rn));
} else if (rh > (lh + 2 | 0)) {
return bal(join(ln, v, rn.left), rn.key, rn.right);
} else {
return create(ln, v, rn);
}
} else {
return addMaxElement(v, ln);
}
} else {
return addMinElement(v, rn);
}
}

function concat(t1, t2) {
if (t1 !== null) {
if (t2 !== null) {
var v = [t2.key];
var t2r = removeMinAuxWithRef(t2, v);
return join(t1, v[0], t2r);
} else {
return t1;
}
} else {
return t2;
}
}

var empty0 = null;

function isEmpty0(n) {
Expand Down Expand Up @@ -316,12 +282,48 @@ function exists0(_n, p) {
};
}

function join(ln, v, rn) {
if (ln !== null) {
if (rn !== null) {
var lh = ln.h;
var rh = rn.h;
if (lh > (rh + 2 | 0)) {
return bal(ln.left, ln.key, join(ln.right, v, rn));
} else if (rh > (lh + 2 | 0)) {
return bal(join(ln, v, rn.left), rn.key, rn.right);
} else {
return create(ln, v, rn);
}
} else {
return addMaxElement(v, ln);
}
} else {
return addMinElement(v, rn);
}
}

function concat(t1, t2) {
if (t1 !== null) {
if (t2 !== null) {
var v = [t2.key];
var t2r = removeMinAuxWithRef(t2, v);
return join(t1, v[0], t2r);
} else {
return t1;
}
} else {
return t2;
}
}

function filter0(n, p) {
if (n !== null) {
var newL = filter0(n.left, p);
var l = n.left;
var v = n.key;
var r = n.right;
var newL = filter0(l, p);
var pv = p(v);
var newR = filter0(n.right, p);
var newR = filter0(r, p);
if (pv) {
return join(newL, v, newR);
} else {
Expand All @@ -334,12 +336,14 @@ function filter0(n, p) {

function partition0(n, p) {
if (n !== null) {
var match = partition0(n.left, p);
var l = n.left;
var v = n.key;
var r = n.right;
var match = partition0(l, p);
var lf = match[1];
var lt = match[0];
var v = n.key;
var pv = p(v);
var match$1 = partition0(n.right, p);
var match$1 = partition0(r, p);
var rf = match$1[1];
var rt = match$1[0];
if (pv) {
Expand Down Expand Up @@ -617,15 +621,15 @@ exports.max0Aux = max0Aux;
exports.maxOpt0 = maxOpt0;
exports.maxNull0 = maxNull0;
exports.removeMinAuxWithRef = removeMinAuxWithRef;
exports.join = join;
exports.concat = concat;
exports.empty0 = empty0;
exports.isEmpty0 = isEmpty0;
exports.toEnum = toEnum;
exports.iter0 = iter0;
exports.fold0 = fold0;
exports.forAll0 = forAll0;
exports.exists0 = exists0;
exports.join = join;
exports.concat = concat;
exports.filter0 = filter0;
exports.partition0 = partition0;
exports.cardinalAux = cardinalAux;
Expand Down

0 comments on commit b1c549e

Please sign in to comment.