Skip to content

Commit

Permalink
simplified bal
Browse files Browse the repository at this point in the history
  • Loading branch information
bobzhang committed Jan 5, 2018
1 parent ad00b15 commit 4828ce8
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 76 deletions.
65 changes: 29 additions & 36 deletions jscomp/others/bs_internalAVLset.ml
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@ type 'elt node = {
}
[@@bs.deriving abstract]

module A = Bs_Array

external toOpt : 'a Js.null -> 'a option = "#null_to_opt"
external return : 'a -> 'a Js.null = "%identity"
external empty : 'a Js.null = "#null"

external unsafeCoerce : 'a Js.null -> 'a = "%identity"
type ('elt, 'id) t0 = 'elt node Js.null
(* Sets are represented by balanced binary trees (the heights of the
children differ by at most 2 *)
Expand Down Expand Up @@ -57,33 +58,25 @@ let bal l v r =
let hl = match toOpt l with None -> 0 | Some n -> h n in
let hr = match toOpt r with None -> 0 | Some n -> h n in
if hl > hr + 2 then begin
match toOpt l with
| None -> assert false
| Some n (* Node(ll, lv, lr, _) *) ->
let ll,lv,lr = left n, key n, right n in
if heightGe ll lr then
create ll lv (create lr v r)
else begin
match toOpt lr with
None -> assert false
| Some n (* (lrl, lrv, lrr, _) *) ->
let lrl, lrv, lrr = left n, key n, right n in
create (create ll lv lrl) lrv (create lrr v r)
end
let n = unsafeCoerce l in (* [l] could not be empty *)
let ll,lv,lr = left n, key n, right n in
if heightGe ll lr then
create ll lv (create lr v r)
else begin
let n = unsafeCoerce lr in (* [lr] could not be empty*)
let lrl, lrv, lrr = left n, key n, right n in
create (create ll lv lrl) lrv (create lrr v r)
end
end else if hr > hl + 2 then begin
match toOpt r with
None -> assert false
| Some n (* (rl, rv, rr, _) *) ->
let rl,rv,rr = left n, key n, right n in
if heightGe rr rl then
create (create l v rl) rv rr
else begin
match toOpt rl with
None -> assert false
| Some n (* (rll, rlv, rlr, _)*) ->
let rll, rlv, rlr = left n, key n, right n in
create (create l v rll) rlv (create rlr rv rr)
end
let n = unsafeCoerce r in (* [r] could not be empty *)
let rl,rv,rr = left n, key n, right n in
if heightGe rr rl then
create (create l v rl) rv rr
else begin
let n = unsafeCoerce rl in (* [rl] could not be empty *)
let rll, rlv, rlr = left n, key n, right n in
create (create l v rll) rlv (create rlr rv rr)
end
end else
return @@ node ~left:l ~key:v ~right:r ~h:(if hl >= hr then hl + 1 else hr + 1)

Expand Down Expand Up @@ -200,6 +193,7 @@ let rec iter0 n f =
| Some n ->
iter0 (left n) f; f (key n) [@bs]; iter0 (right n) f


let rec fold0 s accu f =
match toOpt s with
| None -> accu
Expand Down Expand Up @@ -268,17 +262,17 @@ let rec length0 n =
| Some n ->
cardinalAux n

let rec elements_aux accu n =
let rec toListAux accu n =
match toOpt n with
| None -> accu
| Some n ->
let l,k,r = left n, key n, right n in
elements_aux
(k :: elements_aux accu r)
toListAux
(k :: toListAux accu r)
l

let toList0 s =
elements_aux [] s
toListAux [] s

let rec checkInvariant (v : _ t0) =
match toOpt v with
Expand All @@ -288,7 +282,7 @@ let rec checkInvariant (v : _ t0) =
let diff = height l - height r in
diff <=2 && diff >= -2 && checkInvariant l && checkInvariant r

module A = Bs_Array


let rec fillArray n i arr =
let l,v,r = left n, key n, right n in
Expand All @@ -304,8 +298,7 @@ let rec fillArray n i arr =
| Some r ->
fillArray r rnext arr

(* TODO: binary search tree to array efficiency
*)

let toArray0 n =
match toOpt n with
| None -> [||]
Expand All @@ -317,7 +310,7 @@ let toArray0 n =



external unsafeCoerce : 'a Js.null -> 'a = "%identity"


(*
L rotation, return root node
Expand Down Expand Up @@ -434,6 +427,6 @@ let rec ofSortedArrayAux arr off len =
create left mid right



let ofSortedArrayUnsafe0 arr =
ofSortedArrayAux arr 0 (A.length arr)
8 changes: 3 additions & 5 deletions jscomp/others/bs_internalSet.ml
Original file line number Diff line number Diff line change
Expand Up @@ -169,11 +169,9 @@ let eq0 ~cmp s1 s2 =

let rec subset0 ~cmp (s1 : _ t0) (s2 : _ t0) =
match N.(toOpt s1, toOpt s2) with
None, _ ->
true
| _, None ->
false
| Some t1 , Some t2 (* Node (l1, v1, r1, _), (Node (l2, v2, r2, _) as t2) *) ->
| None, _ -> true
| _, None -> false
| Some t1 , Some t2 ->
let l1,v1,r1 = N.(left t1, key t1, right t1) in
let l2,v2,r2 = N.(left t2, key t2, right t2) in
let c = (Bs_Cmp.getCmp cmp) v1 v2 [@bs] in
Expand Down
58 changes: 23 additions & 35 deletions lib/js/bs_internalAVLset.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,40 +51,28 @@ function bal(l, v, r) {
var hl = l !== null ? l.h : 0;
var hr = r !== null ? r.h : 0;
if (hl > (hr + 2 | 0)) {
if (l !== null) {
var ll = l.left;
var lv = l.key;
var lr = l.right;
if (heightGe(ll, lr)) {
return create(ll, lv, create(lr, v, r));
} else if (lr !== null) {
var lrl = lr.left;
var lrv = lr.key;
var lrr = lr.right;
return create(create(ll, lv, lrl), lrv, create(lrr, v, r));
} else {
return /* assert false */0;
}
var ll = l.left;
var lv = l.key;
var lr = l.right;
if (heightGe(ll, lr)) {
return create(ll, lv, create(lr, v, r));
} else {
return /* assert false */0;
var lrl = lr.left;
var lrv = lr.key;
var lrr = lr.right;
return create(create(ll, lv, lrl), lrv, create(lrr, v, r));
}
} else if (hr > (hl + 2 | 0)) {
if (r !== null) {
var rl = r.left;
var rv = r.key;
var rr = r.right;
if (heightGe(rr, rl)) {
return create(create(l, v, rl), rv, rr);
} else if (rl !== null) {
var rll = rl.left;
var rlv = rl.key;
var rlr = rl.right;
return create(create(l, v, rll), rlv, create(rlr, rv, rr));
} else {
return /* assert false */0;
}
var rl = r.left;
var rv = r.key;
var rr = r.right;
if (heightGe(rr, rl)) {
return create(create(l, v, rl), rv, rr);
} else {
return /* assert false */0;
var rll = rl.left;
var rlv = rl.key;
var rlr = rl.right;
return create(create(l, v, rll), rlv, create(rlr, rv, rr));
}
} else {
return {
Expand Down Expand Up @@ -398,7 +386,7 @@ function length0(n) {
}
}

function elements_aux(_accu, _n) {
function toListAux(_accu, _n) {
while(true) {
var n = _n;
var accu = _accu;
Expand All @@ -409,7 +397,7 @@ function elements_aux(_accu, _n) {
_n = l;
_accu = /* :: */[
k,
elements_aux(accu, r)
toListAux(accu, r)
];
continue ;

Expand All @@ -420,7 +408,7 @@ function elements_aux(_accu, _n) {
}

function toList0(s) {
return elements_aux(/* [] */0, s);
return toListAux(/* [] */0, s);
}

function checkInvariant(_v) {
Expand Down Expand Up @@ -622,6 +610,7 @@ function ofSortedArrayUnsafe0(arr) {

var A = 0;

exports.A = A;
exports.height = height;
exports.copy = copy;
exports.create = create;
Expand Down Expand Up @@ -651,10 +640,9 @@ exports.filter0 = filter0;
exports.partition0 = partition0;
exports.cardinalAux = cardinalAux;
exports.length0 = length0;
exports.elements_aux = elements_aux;
exports.toListAux = toListAux;
exports.toList0 = toList0;
exports.checkInvariant = checkInvariant;
exports.A = A;
exports.fillArray = fillArray;
exports.toArray0 = toArray0;
exports.rotateWithLeftChild = rotateWithLeftChild;
Expand Down

0 comments on commit 4828ce8

Please sign in to comment.