12
12
(* **********************************************************************)
13
13
(* * Almost rewritten by authors of BuckleScript *)
14
14
15
-
15
+ [ @@@ bs.config {flags = [| " -bs-noassertfalse " |] }]
16
16
type ('k, 'v) node = {
17
17
mutable key : 'k ;
18
18
mutable value : 'v ;
@@ -29,10 +29,6 @@ module A = Belt_Array
29
29
module S = Belt_SortArray
30
30
31
31
32
- external unsafeCoerce : 'a option -> 'a = " %identity"
33
-
34
-
35
-
36
32
let treeHeight (n : _ t ) =
37
33
match n with
38
34
None -> 0
@@ -70,20 +66,23 @@ let bal l x d r =
70
66
let hl = match l with None -> 0 | Some n -> n.height in
71
67
let hr = match r with None -> 0 | Some n -> n.height in
72
68
if hl > hr + 2 then begin
73
- let {left = ll; key = lv; value = ld; right = lr} = l |. unsafeCoerce
74
- in
69
+ match l with None -> assert false
70
+ | Some { left = ll ; key = lv ; value = ld ; right = lr } ->
75
71
if treeHeight ll > = treeHeight lr then
76
72
create ll lv ld (create lr x d r)
77
73
else begin
78
- let lr = lr |. unsafeCoerce in
74
+ match lr with None -> assert false
75
+ | Some lr ->
79
76
create (create ll lv ld lr.left) lr.key lr.value (create lr.right x d r)
80
77
end
81
78
end else if hr > hl + 2 then begin
82
- let {left = rl; key = rv; value = rd; right = rr} = r |. unsafeCoerce in
79
+ match r with None -> assert false
80
+ | Some {left = rl ; key = rv ; value = rd ; right = rr } ->
83
81
if treeHeight rr > = treeHeight rl then
84
82
create (create l x d rl) rv rd rr
85
83
else begin
86
- let rl = rl |. unsafeCoerce in
84
+ match rl with None -> assert false
85
+ | Some rl ->
87
86
create (create l x d rl.left) rl.key rl.value (create rl.right rv rd rr)
88
87
end
89
88
end else
@@ -645,7 +644,8 @@ let rec has n x ~cmp =
645
644
L rotation, Some root node
646
645
*)
647
646
let rotateWithLeftChild k2 =
648
- let k1 = unsafeCoerce k2.left in
647
+ match k2.left with None -> assert false
648
+ | Some k1 ->
649
649
(k2.left < - k1.right);
650
650
(k1.right < - (Some k2 ));
651
651
let hlk2, hrk2 = (treeHeight k2.left, (treeHeight k2.right)) in
@@ -656,7 +656,8 @@ let rotateWithLeftChild k2 =
656
656
k1
657
657
(* right rotation *)
658
658
let rotateWithRightChild k1 =
659
- let k2 = unsafeCoerce k1.right in
659
+ match k1.right with None -> assert false
660
+ | Some k2 ->
660
661
(k1.right < - k2.left);
661
662
(k2.left < - (Some k1));
662
663
let hlk1, hrk1 = ((treeHeight k1.left), (treeHeight k1.right)) in
@@ -669,12 +670,14 @@ let rotateWithRightChild k1 =
669
670
double l rotation
670
671
*)
671
672
let doubleWithLeftChild k3 =
672
- let v = rotateWithRightChild (unsafeCoerce k3.left) in
673
+ let k3l = match k3.left with None -> assert false | Some x -> x in
674
+ let v = rotateWithRightChild k3l in
673
675
(k3.left < - (Some v ));
674
676
rotateWithLeftChild k3
675
677
676
678
let doubleWithRightChild k2 =
677
- let v = rotateWithLeftChild (unsafeCoerce k2.right) in
679
+ let k2r = match k2.right with None -> assert false | Some x -> x in
680
+ let v = rotateWithLeftChild k2r in
678
681
(k2.right < - (Some v));
679
682
rotateWithRightChild k2
680
683
@@ -687,17 +690,17 @@ let balMutate nt =
687
690
let l, r = (nt.left, nt.right) in
688
691
let hl, hr = (treeHeight l, treeHeight r) in
689
692
if hl > 2 + hr then
690
- let l = unsafeCoerce l in
691
- let {left = ll; right = lr} = l in
693
+ match l with None -> assert false
694
+ | Some {left = ll ; right = lr } ->
692
695
(if heightGe ll lr then
693
696
heightUpdateMutate (rotateWithLeftChild nt)
694
697
else
695
698
heightUpdateMutate (doubleWithLeftChild nt)
696
699
)
697
700
else
698
701
if hr > 2 + hl then
699
- let r = unsafeCoerce r in
700
- let {left = rl; right = rr} = r in
702
+ match r with None -> assert false
703
+ | Some {left = rl ; right = rr } ->
701
704
(if heightGe rr rl then
702
705
heightUpdateMutate (rotateWithRightChild nt)
703
706
else
0 commit comments