From 99df2302d9e9b6ca67e69b25f8d4ade8ff67dc64 Mon Sep 17 00:00:00 2001 From: Hongbo Zhang Date: Tue, 30 Jan 2018 15:31:39 +0800 Subject: [PATCH 1/2] enough tests for set/setm --- jscomp/others/bs_Cmp.ml | 2 +- jscomp/others/bs_Cmp.mli | 2 +- jscomp/others/bs_MapIntM.ml | 2 +- jscomp/others/bs_MapM.ml | 4 +- jscomp/others/bs_MapStringM.ml | 2 +- jscomp/others/bs_SetIntM.ml | 215 ++++++++---------- jscomp/others/bs_SetM.ml | 167 +++++++------- jscomp/others/bs_SetStringM.ml | 215 ++++++++---------- jscomp/others/bs_SortedMapDict.ml | 8 +- jscomp/others/bs_SortedSetDict.ml | 8 +- jscomp/others/bs_internalAVLset.ml | 16 +- jscomp/others/bs_internalAVLtree.ml | 18 +- jscomp/others/bs_internalMapInt.ml | 2 +- jscomp/others/bs_internalMapString.ml | 2 +- jscomp/others/internal_map.cppo.ml | 2 +- jscomp/others/mapm.cppo.ml | 2 +- jscomp/others/setm.cppo.ml | 215 ++++++++---------- jscomp/test/bs_poly_mutable_set_test.js | 170 ++++++++++++-- jscomp/test/bs_poly_mutable_set_test.ml | 45 +++- jscomp/test/bs_poly_set_test.js | 13 ++ jscomp/test/bs_poly_set_test.ml | 6 +- lib/js/bs_SetIntM.js | 288 +++++++++++------------- lib/js/bs_SetM.js | 203 ++++++++--------- lib/js/bs_SetStringM.js | 288 +++++++++++------------- 24 files changed, 991 insertions(+), 904 deletions(-) diff --git a/jscomp/others/bs_Cmp.ml b/jscomp/others/bs_Cmp.ml index 4cbafa7d74..3af4a403cb 100644 --- a/jscomp/others/bs_Cmp.ml +++ b/jscomp/others/bs_Cmp.ml @@ -26,7 +26,7 @@ type 'a compare = ('a -> 'a -> int [@bs]) type ('a,'id) cmp = 'a compare -external getCmpIntenral : ('a,'id) cmp -> 'a compare = "%identity" +external getCmpInternal : ('a,'id) cmp -> 'a compare = "%identity" module type T = sig type id diff --git a/jscomp/others/bs_Cmp.mli b/jscomp/others/bs_Cmp.mli index 29e12f0146..9762f314aa 100644 --- a/jscomp/others/bs_Cmp.mli +++ b/jscomp/others/bs_Cmp.mli @@ -27,7 +27,7 @@ type 'a compare = 'a -> 'a -> int [@bs] type ('a, 'id) cmp (** only used for data structures, not exported for client usage *) -external getCmpIntenral: ('a,'id) cmp -> 'a compare = "%identity" +external getCmpInternal: ('a,'id) cmp -> 'a compare = "%identity" module type T = sig type id diff --git a/jscomp/others/bs_MapIntM.ml b/jscomp/others/bs_MapIntM.ml index 44c5972994..eb42524486 100644 --- a/jscomp/others/bs_MapIntM.ml +++ b/jscomp/others/bs_MapIntM.ml @@ -92,7 +92,7 @@ let rec updateDone t (x : key) f = | None -> t) | Some nt -> let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) + (* let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in *) if k = x then begin match f (Some (N.value nt)) [@bs] with | None -> diff --git a/jscomp/others/bs_MapM.ml b/jscomp/others/bs_MapM.ml index e5227cbcce..aab0dcd260 100644 --- a/jscomp/others/bs_MapM.ml +++ b/jscomp/others/bs_MapM.ml @@ -42,7 +42,7 @@ type ('k, 'v, 'id) t = ('k, 'v, 'id) S.t let rec removeMutateAux nt x ~cmp = let k = N.key nt in - let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in if c = 0 then let l,r = N.(left nt, right nt) in match N.(toOpt l, toOpt r) with @@ -106,7 +106,7 @@ let rec updateDone t x f ~cmp = | None -> t) | Some nt -> let k = N.key nt in - let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in if c = 0 then begin match f (Some (N.value nt)) [@bs] with | None -> diff --git a/jscomp/others/bs_MapStringM.ml b/jscomp/others/bs_MapStringM.ml index f10192d7c0..d7ac2c950d 100644 --- a/jscomp/others/bs_MapStringM.ml +++ b/jscomp/others/bs_MapStringM.ml @@ -92,7 +92,7 @@ let rec updateDone t (x : key) f = | None -> t) | Some nt -> let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) + (* let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in *) if k = x then begin match f (Some (N.value nt)) [@bs] with | None -> diff --git a/jscomp/others/bs_SetIntM.ml b/jscomp/others/bs_SetIntM.ml index d1d6ba4d07..4e0febbe25 100644 --- a/jscomp/others/bs_SetIntM.ml +++ b/jscomp/others/bs_SetIntM.ml @@ -14,161 +14,83 @@ type t = { -let rec removeMutateAux nt (x : elt)= +let rec remove0 nt (x : elt)= let k = N.key nt in if x = k then let l,r = N.(left nt, right nt) in match N.(toOpt l, toOpt r) with + | None, _ -> r + | _, None -> l | Some _, Some nr -> N.rightSet nt (N.removeMinAuxWithRootMutate nt nr); N.return (N.balMutate nt) - | None, Some _ -> - r - | (Some _ | None ), None -> l else begin if x < k then match N.toOpt (N.left nt) with | None -> N.return nt | Some l -> - N.leftSet nt (removeMutateAux l x ); + N.leftSet nt (remove0 l x ); N.return (N.balMutate nt) else match N.toOpt (N.right nt) with | None -> N.return nt | Some r -> - N.rightSet nt (removeMutateAux r x); + N.rightSet nt (remove0 r x); N.return (N.balMutate nt) end -let addArrayMutate t xs = - let v = ref t in - for i = 0 to A.length xs - 1 do - v := I.addMutate !v (A.getUnsafe xs i) - done ; - !v - - -let removeMutate nt x = - match N.toOpt nt with - | None -> nt - | Some nt -> removeMutateAux nt x - - -let empty () = t ~data:N.empty - -let isEmpty d = - N.isEmpty (data d) - -let singleton x = - t ~data:(N.singleton x) - -let minimum d = - N.minimum (data d) - -let minUndefined d = - N.minUndefined (data d) - -let maximum d = - N.maximum (data d) - -let maxUndefined d = - N.maxUndefined (data d) - -let forEach d f = - N.forEach (data d) f - -let reduce d acc cb = - N.reduce (data d) acc cb -let every d p = - N.every (data d) p -let some d p = - N.some (data d) p - -let keepBy d p = - t ~data:(N.filterCopy (data d) p ) -let partition d p = - let a , b = N.partitionCopy (data d) p in - t ~data:a, t ~data:b -let size d = - N.size (data d) -let toList d = - N.toList (data d) -let toArray d = - N.toArray (data d) -let ofSortedArrayUnsafe xs = - t ~data:(N.ofSortedArrayUnsafe xs) -let checkInvariantInternal d = - N.checkInvariantInternal (data d) - -let add d k = - let old_data = data d in - let v = I.addMutate old_data k in - if v != old_data then - dataSet d v - - - -let mergeMany d arr = - let old_data = data d in - let v = addArrayMutate old_data arr in - if v != old_data then - dataSet d v - - let remove d v = - let old_data = data d in - let v = removeMutate old_data v in - if v != old_data then - dataSet d v - + let oldRoot = data d in + match N.toOpt oldRoot with + | None -> () + | Some oldRoot2 -> + let newRoot = remove0 oldRoot2 v in + if newRoot != oldRoot then + dataSet d newRoot -let rec removeArrayMutateAux t xs i len = +let rec removeMany0 t xs i len = if i < len then let ele = A.getUnsafe xs i in - let u = removeMutateAux t ele in + let u = remove0 t ele in match N.toOpt u with | None -> N.empty - | Some t -> removeArrayMutateAux t xs (i+1) len + | Some t -> removeMany0 t xs (i+1) len else N.return t + let removeMany (d : t) xs = let oldRoot = data d in match N.toOpt oldRoot with | None -> () | Some nt -> let len = A.length xs in - let newRoot = removeArrayMutateAux nt xs 0 len in - if newRoot != oldRoot then - dataSet d newRoot - - -let rec removeMutateCheckAux nt (x : elt) removed = + dataSet d (removeMany0 nt xs 0 len) + +let rec removeCheck0 nt (x : elt) removed = let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) if x = k then let () = removed := true in let l,r = N.(left nt, right nt) in match N.(toOpt l, toOpt r) with + | None, _ -> r + | _ , None -> l | Some _, Some nr -> N.rightSet nt (N.removeMinAuxWithRootMutate nt nr); N.return (N.balMutate nt) - | None, Some _ -> - r - | (Some _ | None ), None -> l else begin if x < k then match N.toOpt (N.left nt) with | None -> N.return nt | Some l -> - N.leftSet nt (removeMutateCheckAux l x removed); + N.leftSet nt (removeCheck0 l x removed); N.return (N.balMutate nt) else match N.toOpt (N.right nt) with | None -> N.return nt | Some r -> - N.rightSet nt (removeMutateCheckAux r x removed); + N.rightSet nt (removeCheck0 r x removed); N.return (N.balMutate nt) end @@ -180,39 +102,98 @@ let removeCheck (d : t) v = | None -> false | Some oldRoot2 -> let removed = ref false in - let newRoot = removeMutateCheckAux oldRoot2 v removed in + let newRoot = removeCheck0 oldRoot2 v removed in if newRoot != oldRoot then dataSet d newRoot ; !removed - - -let rec addMutateCheckAux t (x : elt) added = + +let rec addCheck0 t (x : elt) added = match N.toOpt t with | None -> added := true; N.singleton x | Some nt -> let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) if x = k then t else let l, r = N.(left nt, right nt) in (if x < k then - let ll = addMutateCheckAux l x added in + let ll = addCheck0 l x added in N.leftSet nt ll else - N.rightSet nt (addMutateCheckAux r x added ); + N.rightSet nt (addCheck0 r x added ); ); N.return (N.balMutate nt) let addCheck (m : t) e = - let oldRoot = data m in + let oldRoot = data m in let added = ref false in - let newRoot = addMutateCheckAux oldRoot e added in + let newRoot = addCheck0 oldRoot e added in if newRoot != oldRoot then dataSet m newRoot; - !added + !added + +let add d k = + let oldRoot = data d in + let v = I.addMutate oldRoot k in + if v != oldRoot then + dataSet d v + + +let addArrayMutate t xs = + let v = ref t in + for i = 0 to A.length xs - 1 do + v := I.addMutate !v (A.getUnsafe xs i) + done ; + !v + +let mergeMany d arr = + dataSet d (addArrayMutate (data d) arr) + + + +let empty () = t ~data:N.empty + +let isEmpty d = + N.isEmpty (data d) + +let minimum d = + N.minimum (data d) + +let minUndefined d = + N.minUndefined (data d) + +let maximum d = + N.maximum (data d) + +let maxUndefined d = + N.maxUndefined (data d) + +let forEach d f = + N.forEach (data d) f + +let reduce d acc cb = + N.reduce (data d) acc cb +let every d p = + N.every (data d) p +let some d p = + N.some (data d) p + +let size d = + N.size (data d) +let toList d = + N.toList (data d) +let toArray d = + N.toArray (data d) + + +let ofSortedArrayUnsafe xs = + t ~data:(N.ofSortedArrayUnsafe xs) +let checkInvariantInternal d = + N.checkInvariantInternal (data d) + + let ofArray xs = t ~data:(I.ofArray xs) @@ -227,9 +208,9 @@ let getUndefined d x = I.getUndefined (data d) x let getExn d x = I.getExn (data d) x + let split d key = - let s = data d in - let arr = N.toArray s in + let arr = N.toArray (data d) in let i = S.binarySearch arr key in let len = A.length arr in if i < 0 then @@ -248,6 +229,11 @@ let split d key = ~data:(N.ofSortedArrayAux arr (i+1) (len - i - 1)) ), true +let keepBy d p = + t ~data:(N.filterCopy (data d) p ) +let partition d p = + let a , b = N.partitionCopy (data d) p in + t ~data:a, t ~data:b let subset a b = I.subset (data a) (data b) let intersect dataa datab = let dataa, datab = data dataa, data datab in @@ -261,7 +247,6 @@ let intersect dataa datab = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp; - (* let p = Bs_Cmp.getCmpIntenral M.cmp in *) if ((A.getUnsafe tmp (sizea - 1) < A.getUnsafe tmp sizea)) || @@ -286,7 +271,6 @@ let diff dataa datab : t = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp; - (* let p = Bs_Cmp.getCmpIntenral M.cmp in *) if ( (A.getUnsafe tmp (sizea - 1)) < (A.getUnsafe tmp sizea)) || @@ -310,7 +294,6 @@ let union (dataa : t) (datab : t) : t = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp ; - (* let p = (Bs_Cmp.getCmpIntenral M.cmp) in *) if (A.getUnsafe tmp (sizea - 1) < A.getUnsafe tmp sizea) then diff --git a/jscomp/others/bs_SetM.ml b/jscomp/others/bs_SetM.ml index 0de46965af..724807afdc 100644 --- a/jscomp/others/bs_SetM.ml +++ b/jscomp/others/bs_SetM.ml @@ -43,31 +43,30 @@ end type ('k, 'id) t = ('k, 'id) S.t -let rec removeMutateAux nt x ~cmp = +let rec remove0 nt x ~cmp = let k = N.key nt in - let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in + let c = cmp x k [@bs] in if c = 0 then let l,r = N.(left nt, right nt) in match N.(toOpt l, toOpt r) with + | None, _ -> r + | _, None -> l | Some _, Some nr -> N.rightSet nt (N.removeMinAuxWithRootMutate nt nr); N.return (N.balMutate nt) - | None, Some _ -> - r - | (Some _ | None ), None -> l - else + else begin if c < 0 then match N.toOpt (N.left nt) with | None -> N.return nt | Some l -> - N.leftSet nt (removeMutateAux ~cmp l x ); + N.leftSet nt (remove0 ~cmp l x ); N.return (N.balMutate nt) else match N.toOpt (N.right nt) with | None -> N.return nt | Some r -> - N.rightSet nt (removeMutateAux ~cmp r x); + N.rightSet nt (remove0 ~cmp r x); N.return (N.balMutate nt) end @@ -76,18 +75,18 @@ let remove d v = match N.toOpt oldRoot with | None -> () | Some oldRoot2 -> - let newRoot = removeMutateAux ~cmp:(S.cmp d) oldRoot2 v in + let newRoot = remove0 ~cmp:(Bs_Cmp.getCmpInternal (S.cmp d)) oldRoot2 v in if newRoot != oldRoot then S.dataSet d newRoot -let rec removeArrayMutateAux t xs i len ~cmp = +let rec removeMany0 t xs i len ~cmp = if i < len then let ele = A.getUnsafe xs i in - let u = removeMutateAux t ele ~cmp in + let u = remove0 t ele ~cmp in match N.toOpt u with | None -> N.empty - | Some t -> removeArrayMutateAux t xs (i+1) len ~cmp + | Some t -> removeMany0 t xs (i+1) len ~cmp else N.return t let removeMany d xs = @@ -96,37 +95,36 @@ let removeMany d xs = | None -> () | Some nt -> let len = A.length xs in - let newRoot = removeArrayMutateAux nt xs 0 len ~cmp:(S.cmp d) in - if newRoot != oldRoot then - S.dataSet d newRoot + S.dataSet d + (removeMany0 nt xs 0 len + ~cmp:(Bs_Cmp.getCmpInternal (S.cmp d))) -let rec removeMutateCheckAux nt x removed ~cmp= +let rec removeCheck0 nt x removed ~cmp= let k = N.key nt in - let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in if c = 0 then let () = removed := true in let l,r = N.(left nt, right nt) in match N.(toOpt l, toOpt r) with + | None, _ -> r + | _, None -> l | Some _, Some nr -> N.rightSet nt (N.removeMinAuxWithRootMutate nt nr); N.return (N.balMutate nt) - | None, Some _ -> - r - | (Some _ | None ), None -> l else begin if c < 0 then match N.toOpt (N.left nt) with | None -> N.return nt | Some l -> - N.leftSet nt (removeMutateCheckAux ~cmp l x removed); + N.leftSet nt (removeCheck0 ~cmp l x removed); N.return (N.balMutate nt) else match N.toOpt (N.right nt) with | None -> N.return nt | Some r -> - N.rightSet nt (removeMutateCheckAux ~cmp r x removed); + N.rightSet nt (removeCheck0 ~cmp r x removed); N.return (N.balMutate nt) end @@ -138,72 +136,56 @@ let removeCheck d v = | None -> false | Some oldRoot2 -> let removed = ref false in - let newRoot = removeMutateCheckAux ~cmp:(S.cmp d) oldRoot2 v removed in + let newRoot = removeCheck0 ~cmp:(S.cmp d) oldRoot2 v removed in if newRoot != oldRoot then S.dataSet d newRoot ; !removed -let rec addMutateCheckAux t x added ~cmp = +let rec addCheck0 t x added ~cmp = match N.toOpt t with | None -> added := true; N.singleton x | Some nt -> let k = N.key nt in - let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in + let c = cmp x k [@bs] in if c = 0 then t else let l, r = N.(left nt, right nt) in (if c < 0 then - let ll = addMutateCheckAux ~cmp l x added in + let ll = addCheck0 ~cmp l x added in N.leftSet nt ll else - N.rightSet nt (addMutateCheckAux ~cmp r x added ); + N.rightSet nt (addCheck0 ~cmp r x added ); ); N.return (N.balMutate nt) let addCheck m e = - let oldRoot = S.data m in + let oldRoot = S.data m in let added = ref false in - let newRoot = addMutateCheckAux ~cmp:(S.cmp m) oldRoot e added in + let newRoot = addCheck0 ~cmp:(Bs_Cmp.getCmpInternal (S.cmp m)) oldRoot e added in if newRoot != oldRoot then S.dataSet m newRoot; !added +let add m e = + let oldRoot = S.data m in + let newRoot = N.addMutate ~cmp:(S.cmp m) oldRoot e in + if newRoot != oldRoot then + S.dataSet m newRoot -let split d key = - let arr = N.toArray (S.data d) in - let cmp = S.cmp d in - let i = Sort.binarySearchBy arr key (Bs_Cmp.getCmpIntenral cmp) in - let len = A.length arr in - if i < 0 then - let next = - i -1 in - (S.t - ~data:(N.ofSortedArrayAux arr 0 next) - ~cmp - , - S.t - ~data:(N.ofSortedArrayAux arr next (len - next)) - ~cmp - ), false - else - (S.t - ~data:(N.ofSortedArrayAux arr 0 i) - ~cmp, - S.t - ~data:(N.ofSortedArrayAux arr (i+1) (len - i - 1)) - ~cmp - ), true - -let keepBy d p = - S.t ~data:(N.filterCopy (S.data d) p ) ~cmp:(S.cmp d) +let addArrayMutate t xs ~cmp = + let v = ref t in + for i = 0 to A.length xs - 1 do + v := N.addMutate !v (A.getUnsafe xs i) ~cmp + done; + !v -let partition d p = - let cmp = S.cmp d in - let a, b = N.partitionCopy (S.data d) p in - S.t ~data:a ~cmp, S.t ~data:b ~cmp +let mergeMany d xs = + S.dataSet d (addArrayMutate (S.data d) xs ~cmp:(S.cmp d)) + let empty (type elt) (type id) ~(dict : (elt, id) dict) = let module M = (val dict) in @@ -242,6 +224,13 @@ let ofSortedArrayUnsafe (type elt) (type id) xs ~(dict : (elt,id) dict) : _ t = let checkInvariantInternal d = N.checkInvariantInternal (S.data d) + +let ofArray (type elt) (type id) data ~(dict : (elt,id) dict) = + let module M = (val dict) in + let cmp = M.cmp in + S.t ~cmp ~data:(N.ofArray ~cmp data) + + let cmp d0 d1 = N.cmp ~cmp:(S.cmp d0) (S.data d0) (S.data d1) @@ -257,29 +246,38 @@ let getUndefined d x = let getExn d x = N.getExn ~cmp:(S.cmp d) (S.data d) x -let has d x = - N.has ~cmp:(S.cmp d) (S.data d) x - -let ofArray (type elt) (type id) data ~(dict : (elt,id) dict) = - let module M = (val dict) in - let cmp = M.cmp in - S.t ~cmp ~data:(N.ofArray ~cmp data) - -let add m e = - let oldRoot = S.data m in - let newRoot = N.addMutate ~cmp:(S.cmp m) oldRoot e in - if newRoot != oldRoot then - S.dataSet m newRoot -let addArrayMutate t xs ~cmp = - let v = ref t in - for i = 0 to A.length xs - 1 do - v := N.addMutate !v (A.getUnsafe xs i) ~cmp - done; - !v +let split d key = + let arr = N.toArray (S.data d) in + let cmp = S.cmp d in + let i = Sort.binarySearchBy arr key (Bs_Cmp.getCmpInternal cmp) in + let len = A.length arr in + if i < 0 then + let next = - i -1 in + (S.t + ~data:(N.ofSortedArrayAux arr 0 next) + ~cmp + , + S.t + ~data:(N.ofSortedArrayAux arr next (len - next)) + ~cmp + ), false + else + (S.t + ~data:(N.ofSortedArrayAux arr 0 i) + ~cmp, + S.t + ~data:(N.ofSortedArrayAux arr (i+1) (len - i - 1)) + ~cmp + ), true + +let keepBy d p = + S.t ~data:(N.filterCopy (S.data d) p ) ~cmp:(S.cmp d) -let mergeMany d xs = - S.dataSet d (addArrayMutate (S.data d) xs ~cmp:(S.cmp d)) +let partition d p = + let cmp = S.cmp d in + let a, b = N.partitionCopy (S.data d) p in + S.t ~data:a ~cmp, S.t ~data:b ~cmp let subset a b = @@ -297,7 +295,7 @@ let intersect a b : _ t = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp; - let p = Bs_Cmp.getCmpIntenral cmp in + let p = Bs_Cmp.getCmpInternal cmp in if (p (A.getUnsafe tmp (sizea - 1)) (A.getUnsafe tmp sizea) [@bs] < 0) || @@ -326,7 +324,7 @@ let diff a b : _ t = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp; - let p = Bs_Cmp.getCmpIntenral cmp in + let p = Bs_Cmp.getCmpInternal cmp in if (p (A.getUnsafe tmp (sizea - 1)) (A.getUnsafe tmp sizea) [@bs] < 0) || @@ -353,7 +351,7 @@ let union a b = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp ; - let p = (Bs_Cmp.getCmpIntenral cmp) in + let p = (Bs_Cmp.getCmpInternal cmp) in if p (A.getUnsafe tmp (sizea - 1)) (A.getUnsafe tmp sizea) [@bs] < 0 then @@ -362,6 +360,9 @@ let union a b = let tmp2 = A.makeUninitializedUnsafe totalSize in let k = Sort.union tmp 0 sizea tmp sizea sizeb tmp2 0 p in S.t ~data:(N.ofSortedArrayAux tmp2 0 k) ~cmp + +let has d x = + N.has ~cmp:(S.cmp d) (S.data d) x let copy d = S.t ~data:(N.copy (S.data d)) ~cmp:(S.cmp d) diff --git a/jscomp/others/bs_SetStringM.ml b/jscomp/others/bs_SetStringM.ml index fd0c0faeae..8beedde116 100644 --- a/jscomp/others/bs_SetStringM.ml +++ b/jscomp/others/bs_SetStringM.ml @@ -14,161 +14,83 @@ type t = { -let rec removeMutateAux nt (x : elt)= +let rec remove0 nt (x : elt)= let k = N.key nt in if x = k then let l,r = N.(left nt, right nt) in match N.(toOpt l, toOpt r) with + | None, _ -> r + | _, None -> l | Some _, Some nr -> N.rightSet nt (N.removeMinAuxWithRootMutate nt nr); N.return (N.balMutate nt) - | None, Some _ -> - r - | (Some _ | None ), None -> l else begin if x < k then match N.toOpt (N.left nt) with | None -> N.return nt | Some l -> - N.leftSet nt (removeMutateAux l x ); + N.leftSet nt (remove0 l x ); N.return (N.balMutate nt) else match N.toOpt (N.right nt) with | None -> N.return nt | Some r -> - N.rightSet nt (removeMutateAux r x); + N.rightSet nt (remove0 r x); N.return (N.balMutate nt) end -let addArrayMutate t xs = - let v = ref t in - for i = 0 to A.length xs - 1 do - v := I.addMutate !v (A.getUnsafe xs i) - done ; - !v - - -let removeMutate nt x = - match N.toOpt nt with - | None -> nt - | Some nt -> removeMutateAux nt x - - -let empty () = t ~data:N.empty - -let isEmpty d = - N.isEmpty (data d) - -let singleton x = - t ~data:(N.singleton x) - -let minimum d = - N.minimum (data d) - -let minUndefined d = - N.minUndefined (data d) - -let maximum d = - N.maximum (data d) - -let maxUndefined d = - N.maxUndefined (data d) - -let forEach d f = - N.forEach (data d) f - -let reduce d acc cb = - N.reduce (data d) acc cb -let every d p = - N.every (data d) p -let some d p = - N.some (data d) p - -let keepBy d p = - t ~data:(N.filterCopy (data d) p ) -let partition d p = - let a , b = N.partitionCopy (data d) p in - t ~data:a, t ~data:b -let size d = - N.size (data d) -let toList d = - N.toList (data d) -let toArray d = - N.toArray (data d) -let ofSortedArrayUnsafe xs = - t ~data:(N.ofSortedArrayUnsafe xs) -let checkInvariantInternal d = - N.checkInvariantInternal (data d) - -let add d k = - let old_data = data d in - let v = I.addMutate old_data k in - if v != old_data then - dataSet d v - - - -let mergeMany d arr = - let old_data = data d in - let v = addArrayMutate old_data arr in - if v != old_data then - dataSet d v - - let remove d v = - let old_data = data d in - let v = removeMutate old_data v in - if v != old_data then - dataSet d v - + let oldRoot = data d in + match N.toOpt oldRoot with + | None -> () + | Some oldRoot2 -> + let newRoot = remove0 oldRoot2 v in + if newRoot != oldRoot then + dataSet d newRoot -let rec removeArrayMutateAux t xs i len = +let rec removeMany0 t xs i len = if i < len then let ele = A.getUnsafe xs i in - let u = removeMutateAux t ele in + let u = remove0 t ele in match N.toOpt u with | None -> N.empty - | Some t -> removeArrayMutateAux t xs (i+1) len + | Some t -> removeMany0 t xs (i+1) len else N.return t + let removeMany (d : t) xs = let oldRoot = data d in match N.toOpt oldRoot with | None -> () | Some nt -> let len = A.length xs in - let newRoot = removeArrayMutateAux nt xs 0 len in - if newRoot != oldRoot then - dataSet d newRoot - - -let rec removeMutateCheckAux nt (x : elt) removed = + dataSet d (removeMany0 nt xs 0 len) + +let rec removeCheck0 nt (x : elt) removed = let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) if x = k then let () = removed := true in let l,r = N.(left nt, right nt) in match N.(toOpt l, toOpt r) with + | None, _ -> r + | _ , None -> l | Some _, Some nr -> N.rightSet nt (N.removeMinAuxWithRootMutate nt nr); N.return (N.balMutate nt) - | None, Some _ -> - r - | (Some _ | None ), None -> l else begin if x < k then match N.toOpt (N.left nt) with | None -> N.return nt | Some l -> - N.leftSet nt (removeMutateCheckAux l x removed); + N.leftSet nt (removeCheck0 l x removed); N.return (N.balMutate nt) else match N.toOpt (N.right nt) with | None -> N.return nt | Some r -> - N.rightSet nt (removeMutateCheckAux r x removed); + N.rightSet nt (removeCheck0 r x removed); N.return (N.balMutate nt) end @@ -180,39 +102,98 @@ let removeCheck (d : t) v = | None -> false | Some oldRoot2 -> let removed = ref false in - let newRoot = removeMutateCheckAux oldRoot2 v removed in + let newRoot = removeCheck0 oldRoot2 v removed in if newRoot != oldRoot then dataSet d newRoot ; !removed - - -let rec addMutateCheckAux t (x : elt) added = + +let rec addCheck0 t (x : elt) added = match N.toOpt t with | None -> added := true; N.singleton x | Some nt -> let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) if x = k then t else let l, r = N.(left nt, right nt) in (if x < k then - let ll = addMutateCheckAux l x added in + let ll = addCheck0 l x added in N.leftSet nt ll else - N.rightSet nt (addMutateCheckAux r x added ); + N.rightSet nt (addCheck0 r x added ); ); N.return (N.balMutate nt) let addCheck (m : t) e = - let oldRoot = data m in + let oldRoot = data m in let added = ref false in - let newRoot = addMutateCheckAux oldRoot e added in + let newRoot = addCheck0 oldRoot e added in if newRoot != oldRoot then dataSet m newRoot; - !added + !added + +let add d k = + let oldRoot = data d in + let v = I.addMutate oldRoot k in + if v != oldRoot then + dataSet d v + + +let addArrayMutate t xs = + let v = ref t in + for i = 0 to A.length xs - 1 do + v := I.addMutate !v (A.getUnsafe xs i) + done ; + !v + +let mergeMany d arr = + dataSet d (addArrayMutate (data d) arr) + + + +let empty () = t ~data:N.empty + +let isEmpty d = + N.isEmpty (data d) + +let minimum d = + N.minimum (data d) + +let minUndefined d = + N.minUndefined (data d) + +let maximum d = + N.maximum (data d) + +let maxUndefined d = + N.maxUndefined (data d) + +let forEach d f = + N.forEach (data d) f + +let reduce d acc cb = + N.reduce (data d) acc cb +let every d p = + N.every (data d) p +let some d p = + N.some (data d) p + +let size d = + N.size (data d) +let toList d = + N.toList (data d) +let toArray d = + N.toArray (data d) + + +let ofSortedArrayUnsafe xs = + t ~data:(N.ofSortedArrayUnsafe xs) +let checkInvariantInternal d = + N.checkInvariantInternal (data d) + + let ofArray xs = t ~data:(I.ofArray xs) @@ -227,9 +208,9 @@ let getUndefined d x = I.getUndefined (data d) x let getExn d x = I.getExn (data d) x + let split d key = - let s = data d in - let arr = N.toArray s in + let arr = N.toArray (data d) in let i = S.binarySearch arr key in let len = A.length arr in if i < 0 then @@ -248,6 +229,11 @@ let split d key = ~data:(N.ofSortedArrayAux arr (i+1) (len - i - 1)) ), true +let keepBy d p = + t ~data:(N.filterCopy (data d) p ) +let partition d p = + let a , b = N.partitionCopy (data d) p in + t ~data:a, t ~data:b let subset a b = I.subset (data a) (data b) let intersect dataa datab = let dataa, datab = data dataa, data datab in @@ -261,7 +247,6 @@ let intersect dataa datab = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp; - (* let p = Bs_Cmp.getCmpIntenral M.cmp in *) if ((A.getUnsafe tmp (sizea - 1) < A.getUnsafe tmp sizea)) || @@ -286,7 +271,6 @@ let diff dataa datab : t = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp; - (* let p = Bs_Cmp.getCmpIntenral M.cmp in *) if ( (A.getUnsafe tmp (sizea - 1)) < (A.getUnsafe tmp sizea)) || @@ -310,7 +294,6 @@ let union (dataa : t) (datab : t) : t = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp ; - (* let p = (Bs_Cmp.getCmpIntenral M.cmp) in *) if (A.getUnsafe tmp (sizea - 1) < A.getUnsafe tmp sizea) then diff --git a/jscomp/others/bs_SortedMapDict.ml b/jscomp/others/bs_SortedMapDict.ml index f37e7f0756..886d486241 100644 --- a/jscomp/others/bs_SortedMapDict.ml +++ b/jscomp/others/bs_SortedMapDict.ml @@ -69,7 +69,7 @@ let rec set (t : _ t) newK newD ~cmp = | None -> N.singleton newK newD | Some n -> let k= N.key n in - let c = (Bs_Cmp.getCmpIntenral cmp) newK k [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) newK k [@bs] in if c = 0 then N.return (N.updateValue n newD) else @@ -88,7 +88,7 @@ let rec update (t : _ t) newK f ~cmp : _ t = end | Some n -> let k= N.key n in - let c = (Bs_Cmp.getCmpIntenral cmp) newK k [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) newK k [@bs] in if c = 0 then match f (Some (N.value n)) [@bs] with | None -> @@ -133,7 +133,7 @@ let rec update (t : _ t) newK f ~cmp : _ t = let rec removeAux0 n x ~cmp = let l,v,r = N.(left n, key n, right n ) in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then match N.toOpt l, N.toOpt r with | None, _ -> r @@ -174,7 +174,7 @@ let mergeMany h arr ~cmp = let rec splitAuxPivot n x pres ~cmp = let l,v,d,r = N.(left n , key n, value n, right n) in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then begin pres := Some d; (l, r) diff --git a/jscomp/others/bs_SortedSetDict.ml b/jscomp/others/bs_SortedSetDict.ml index d4608a9b59..92b21ba6aa 100644 --- a/jscomp/others/bs_SortedSetDict.ml +++ b/jscomp/others/bs_SortedSetDict.ml @@ -39,7 +39,7 @@ let rec add (t : _ t) x ~cmp : _ t = | None -> N.singleton x | Some nt -> let k = N.key nt in - let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in if c = 0 then t else let l,r = N.(left nt, right nt) in @@ -57,7 +57,7 @@ let rec remove (t : _ t) x ~cmp : _ t = None -> t | Some n -> let l,v,r = N.(left n , key n, right n) in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then match N.toOpt l, N.toOpt r with | (None, _) -> r @@ -96,7 +96,7 @@ let removeMany h arr ~cmp = let rec splitAuxNoPivot ~cmp (n : _ N.node) x : _ * _ = let l,v,r = N.(left n , key n, right n) in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then l,r else if c < 0 then @@ -116,7 +116,7 @@ let rec splitAuxNoPivot ~cmp (n : _ N.node) x : _ * _ = let rec splitAuxPivot ~cmp (n : _ N.node) x pres : _ * _ = let l,v,r = N.(left n , key n, right n) in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then begin pres := true; diff --git a/jscomp/others/bs_internalAVLset.ml b/jscomp/others/bs_internalAVLset.ml index 735b51de3f..7c3b15c22d 100644 --- a/jscomp/others/bs_internalAVLset.ml +++ b/jscomp/others/bs_internalAVLset.ml @@ -462,14 +462,14 @@ let rec has (t: _ t) x ~cmp = | None -> false | Some n -> let v = key n in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in c = 0 || has ~cmp (if c < 0 then left n else right n) x let rec compareAux e1 e2 ~cmp = match e1,e2 with | h1::t1, h2::t2 -> - let c = (Bs_Cmp.getCmpIntenral cmp) (key h1) (key h2) [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) (key h1) (key h2) [@bs] in if c = 0 then compareAux ~cmp (stackAllLeft (right h1) t1) @@ -495,7 +495,7 @@ let rec subset (s1 : _ t) (s2 : _ t) ~cmp = | Some t1 , Some t2 -> let l1,v1,r1 = (left t1, key t1, right t1) in let l2,v2,r2 = (left t2, key t2, right t2) in - let c = (Bs_Cmp.getCmpIntenral cmp) v1 v2 [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) v1 v2 [@bs] in if c = 0 then subset ~cmp l1 l2 && subset ~cmp r1 r2 else if c < 0 then @@ -510,7 +510,7 @@ let rec get (n : _ t) x ~cmp = None -> None | Some t (* Node(l, v, r, _) *) -> let v = key t in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then Some v else get ~cmp (if c < 0 then left t else right t) x @@ -520,7 +520,7 @@ let rec getUndefined (n : _ t) x ~cmp = None -> Js.Undefined.empty | Some t (* Node(l, v, r, _) *) -> let v = key t in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then Js.Undefined.return v else getUndefined ~cmp (if c < 0 then left t else right t) x @@ -529,7 +529,7 @@ let rec getExn (n : _ t) x ~cmp = None -> [%assert "getExn0"] | Some t (* Node(l, v, r, _) *) -> let v = key t in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then v else getExn ~cmp (if c < 0 then left t else right t) x @@ -609,7 +609,7 @@ let rec addMutate ~cmp (t : _ t) x = | None -> singleton x | Some nt -> let k = key nt in - let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in if c = 0 then t else let l, r = (left nt, right nt) in @@ -627,7 +627,7 @@ let ofArray (xs : _ array) ~cmp = if len = 0 then empty else let next = ref (S.strictlySortedLength xs - (fun [@bs] x y -> (Bs_Cmp.getCmpIntenral cmp) x y [@bs] < 0)) in + (fun [@bs] x y -> (Bs_Cmp.getCmpInternal cmp) x y [@bs] < 0)) in let result = ref (if !next >= 0 then ofSortedArrayAux xs 0 !next diff --git a/jscomp/others/bs_internalAVLtree.ml b/jscomp/others/bs_internalAVLtree.ml index 90f475bf5d..f8023ca177 100644 --- a/jscomp/others/bs_internalAVLtree.ml +++ b/jscomp/others/bs_internalAVLtree.ml @@ -525,7 +525,7 @@ let ofSortedArrayUnsafe arr = let rec compareAux e1 e2 ~kcmp ~vcmp = match e1,e2 with | h1::t1, h2::t2 -> - let c = (Bs_Cmp.getCmpIntenral kcmp) (key h1) (key h2) [@bs] in + let c = (Bs_Cmp.getCmpInternal kcmp) (key h1) (key h2) [@bs] in if c = 0 then let cx = vcmp (value h1) (value h2) [@bs] in if cx = 0 then @@ -539,7 +539,7 @@ let rec compareAux e1 e2 ~kcmp ~vcmp = let rec eqAux e1 e2 ~kcmp ~veq = match e1,e2 with | h1::t1, h2::t2 -> - if (Bs_Cmp.getCmpIntenral kcmp) (key h1) (key h2) [@bs] = 0 && + if (Bs_Cmp.getCmpInternal kcmp) (key h1) (key h2) [@bs] = 0 && veq (value h1) (value h2) [@bs] then eqAux ~kcmp ~veq ( stackAllLeft (right h1) t1 ) (stackAllLeft (right h2) t2) @@ -563,7 +563,7 @@ let rec get n x ~cmp = None -> None | Some n (* Node(l, v, d, r, _) *) -> let v = key n in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then Some (value n) else get ~cmp (if c < 0 then left n else right n) x @@ -572,7 +572,7 @@ let rec getUndefined n x ~cmp = | None -> Js.undefined | Some n -> let v = key n in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then Js.Undefined.return (value n ) else getUndefined ~cmp (if c < 0 then left n else right n) x @@ -582,7 +582,7 @@ let rec getExn n x ~cmp = [%assert "getExn0"] | Some n (* Node(l, v, d, r, _)*) -> let v = key n in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then value n else getExn ~cmp (if c < 0 then left n else right n) x @@ -592,7 +592,7 @@ let rec getWithDefault n x def ~cmp = def | Some n (* Node(l, v, d, r, _)*) -> let v = key n in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in if c = 0 then value n else getWithDefault ~cmp (if c < 0 then left n else right n) x def @@ -602,7 +602,7 @@ let rec has n x ~cmp = false | Some n (* Node(l, v, d, r, _) *) -> let v = key n in - let c = (Bs_Cmp.getCmpIntenral cmp) x v [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x v [@bs] in c = 0 || has ~cmp (if c < 0 then left n else right n) x @@ -681,7 +681,7 @@ let rec updateMutate (t : _ t) x data ~cmp = | None -> singleton x data | Some nt -> let k = key nt in - let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in + let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in if c = 0 then begin valueSet nt data; return nt @@ -703,7 +703,7 @@ let ofArray (xs : _ array) ~cmp = let next = ref (S.strictlySortedLength xs (fun[@bs] (x0,_) (y0,_) -> - (Bs_Cmp.getCmpIntenral cmp) x0 y0 [@bs] < 0 + (Bs_Cmp.getCmpInternal cmp) x0 y0 [@bs] < 0 )) in let result = ref ( diff --git a/jscomp/others/bs_internalMapInt.ml b/jscomp/others/bs_internalMapInt.ml index f16039516f..b057a12625 100644 --- a/jscomp/others/bs_internalMapInt.ml +++ b/jscomp/others/bs_internalMapInt.ml @@ -174,7 +174,7 @@ let rec addMutate (t : _ t) x data : _ t = | None -> N.singleton x data | Some nt -> let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) + (* let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in *) if x = k then begin N.keySet nt x; N.valueSet nt data; diff --git a/jscomp/others/bs_internalMapString.ml b/jscomp/others/bs_internalMapString.ml index 17011a07aa..df6423a8c0 100644 --- a/jscomp/others/bs_internalMapString.ml +++ b/jscomp/others/bs_internalMapString.ml @@ -174,7 +174,7 @@ let rec addMutate (t : _ t) x data : _ t = | None -> N.singleton x data | Some nt -> let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) + (* let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in *) if x = k then begin N.keySet nt x; N.valueSet nt data; diff --git a/jscomp/others/internal_map.cppo.ml b/jscomp/others/internal_map.cppo.ml index dede9f44b0..655a754f8a 100644 --- a/jscomp/others/internal_map.cppo.ml +++ b/jscomp/others/internal_map.cppo.ml @@ -178,7 +178,7 @@ let rec addMutate (t : _ t) x data : _ t = | None -> N.singleton x data | Some nt -> let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) + (* let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in *) if x = k then begin N.keySet nt x; N.valueSet nt data; diff --git a/jscomp/others/mapm.cppo.ml b/jscomp/others/mapm.cppo.ml index e1c001eefa..eb776bbd49 100644 --- a/jscomp/others/mapm.cppo.ml +++ b/jscomp/others/mapm.cppo.ml @@ -97,7 +97,7 @@ let rec updateDone t (x : key) f = | None -> t) | Some nt -> let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) + (* let c = (Bs_Cmp.getCmpInternal cmp) x k [@bs] in *) if k = x then begin match f (Some (N.value nt)) [@bs] with | None -> diff --git a/jscomp/others/setm.cppo.ml b/jscomp/others/setm.cppo.ml index 9568d82b54..e6b5a6fac3 100644 --- a/jscomp/others/setm.cppo.ml +++ b/jscomp/others/setm.cppo.ml @@ -19,161 +19,83 @@ type t = { -let rec removeMutateAux nt (x : elt)= +let rec remove0 nt (x : elt)= let k = N.key nt in if x = k then let l,r = N.(left nt, right nt) in match N.(toOpt l, toOpt r) with + | None, _ -> r + | _, None -> l | Some _, Some nr -> N.rightSet nt (N.removeMinAuxWithRootMutate nt nr); N.return (N.balMutate nt) - | None, Some _ -> - r - | (Some _ | None ), None -> l else begin if x < k then match N.toOpt (N.left nt) with | None -> N.return nt | Some l -> - N.leftSet nt (removeMutateAux l x ); + N.leftSet nt (remove0 l x ); N.return (N.balMutate nt) else match N.toOpt (N.right nt) with | None -> N.return nt | Some r -> - N.rightSet nt (removeMutateAux r x); + N.rightSet nt (remove0 r x); N.return (N.balMutate nt) end -let addArrayMutate t xs = - let v = ref t in - for i = 0 to A.length xs - 1 do - v := I.addMutate !v (A.getUnsafe xs i) - done ; - !v - - -let removeMutate nt x = - match N.toOpt nt with - | None -> nt - | Some nt -> removeMutateAux nt x - - -let empty () = t ~data:N.empty - -let isEmpty d = - N.isEmpty (data d) - -let singleton x = - t ~data:(N.singleton x) - -let minimum d = - N.minimum (data d) - -let minUndefined d = - N.minUndefined (data d) - -let maximum d = - N.maximum (data d) - -let maxUndefined d = - N.maxUndefined (data d) - -let forEach d f = - N.forEach (data d) f - -let reduce d acc cb = - N.reduce (data d) acc cb -let every d p = - N.every (data d) p -let some d p = - N.some (data d) p - -let keepBy d p = - t ~data:(N.filterCopy (data d) p ) -let partition d p = - let a , b = N.partitionCopy (data d) p in - t ~data:a, t ~data:b -let size d = - N.size (data d) -let toList d = - N.toList (data d) -let toArray d = - N.toArray (data d) -let ofSortedArrayUnsafe xs = - t ~data:(N.ofSortedArrayUnsafe xs) -let checkInvariantInternal d = - N.checkInvariantInternal (data d) - -let add d k = - let old_data = data d in - let v = I.addMutate old_data k in - if v != old_data then - dataSet d v - - - -let mergeMany d arr = - let old_data = data d in - let v = addArrayMutate old_data arr in - if v != old_data then - dataSet d v - - let remove d v = - let old_data = data d in - let v = removeMutate old_data v in - if v != old_data then - dataSet d v - + let oldRoot = data d in + match N.toOpt oldRoot with + | None -> () + | Some oldRoot2 -> + let newRoot = remove0 oldRoot2 v in + if newRoot != oldRoot then + dataSet d newRoot -let rec removeArrayMutateAux t xs i len = +let rec removeMany0 t xs i len = if i < len then let ele = A.getUnsafe xs i in - let u = removeMutateAux t ele in + let u = remove0 t ele in match N.toOpt u with | None -> N.empty - | Some t -> removeArrayMutateAux t xs (i+1) len + | Some t -> removeMany0 t xs (i+1) len else N.return t + let removeMany (d : t) xs = let oldRoot = data d in match N.toOpt oldRoot with | None -> () | Some nt -> let len = A.length xs in - let newRoot = removeArrayMutateAux nt xs 0 len in - if newRoot != oldRoot then - dataSet d newRoot - - -let rec removeMutateCheckAux nt (x : elt) removed = + dataSet d (removeMany0 nt xs 0 len) + +let rec removeCheck0 nt (x : elt) removed = let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) if x = k then let () = removed := true in let l,r = N.(left nt, right nt) in match N.(toOpt l, toOpt r) with + | None, _ -> r + | _ , None -> l | Some _, Some nr -> N.rightSet nt (N.removeMinAuxWithRootMutate nt nr); N.return (N.balMutate nt) - | None, Some _ -> - r - | (Some _ | None ), None -> l else begin if x < k then match N.toOpt (N.left nt) with | None -> N.return nt | Some l -> - N.leftSet nt (removeMutateCheckAux l x removed); + N.leftSet nt (removeCheck0 l x removed); N.return (N.balMutate nt) else match N.toOpt (N.right nt) with | None -> N.return nt | Some r -> - N.rightSet nt (removeMutateCheckAux r x removed); + N.rightSet nt (removeCheck0 r x removed); N.return (N.balMutate nt) end @@ -185,39 +107,98 @@ let removeCheck (d : t) v = | None -> false | Some oldRoot2 -> let removed = ref false in - let newRoot = removeMutateCheckAux oldRoot2 v removed in + let newRoot = removeCheck0 oldRoot2 v removed in if newRoot != oldRoot then dataSet d newRoot ; !removed - - -let rec addMutateCheckAux t (x : elt) added = + +let rec addCheck0 t (x : elt) added = match N.toOpt t with | None -> added := true; N.singleton x | Some nt -> let k = N.key nt in - (* let c = (Bs_Cmp.getCmpIntenral cmp) x k [@bs] in *) if x = k then t else let l, r = N.(left nt, right nt) in (if x < k then - let ll = addMutateCheckAux l x added in + let ll = addCheck0 l x added in N.leftSet nt ll else - N.rightSet nt (addMutateCheckAux r x added ); + N.rightSet nt (addCheck0 r x added ); ); N.return (N.balMutate nt) let addCheck (m : t) e = - let oldRoot = data m in + let oldRoot = data m in let added = ref false in - let newRoot = addMutateCheckAux oldRoot e added in + let newRoot = addCheck0 oldRoot e added in if newRoot != oldRoot then dataSet m newRoot; - !added + !added + +let add d k = + let oldRoot = data d in + let v = I.addMutate oldRoot k in + if v != oldRoot then + dataSet d v + + +let addArrayMutate t xs = + let v = ref t in + for i = 0 to A.length xs - 1 do + v := I.addMutate !v (A.getUnsafe xs i) + done ; + !v + +let mergeMany d arr = + dataSet d (addArrayMutate (data d) arr) + + + +let empty () = t ~data:N.empty + +let isEmpty d = + N.isEmpty (data d) + +let minimum d = + N.minimum (data d) + +let minUndefined d = + N.minUndefined (data d) + +let maximum d = + N.maximum (data d) + +let maxUndefined d = + N.maxUndefined (data d) + +let forEach d f = + N.forEach (data d) f + +let reduce d acc cb = + N.reduce (data d) acc cb +let every d p = + N.every (data d) p +let some d p = + N.some (data d) p + +let size d = + N.size (data d) +let toList d = + N.toList (data d) +let toArray d = + N.toArray (data d) + + +let ofSortedArrayUnsafe xs = + t ~data:(N.ofSortedArrayUnsafe xs) +let checkInvariantInternal d = + N.checkInvariantInternal (data d) + + let ofArray xs = t ~data:(I.ofArray xs) @@ -232,9 +213,9 @@ let getUndefined d x = I.getUndefined (data d) x let getExn d x = I.getExn (data d) x + let split d key = - let s = data d in - let arr = N.toArray s in + let arr = N.toArray (data d) in let i = S.binarySearch arr key in let len = A.length arr in if i < 0 then @@ -253,6 +234,11 @@ let split d key = ~data:(N.ofSortedArrayAux arr (i+1) (len - i - 1)) ), true +let keepBy d p = + t ~data:(N.filterCopy (data d) p ) +let partition d p = + let a , b = N.partitionCopy (data d) p in + t ~data:a, t ~data:b let subset a b = I.subset (data a) (data b) let intersect dataa datab = let dataa, datab = data dataa, data datab in @@ -266,7 +252,6 @@ let intersect dataa datab = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp; - (* let p = Bs_Cmp.getCmpIntenral M.cmp in *) if ((A.getUnsafe tmp (sizea - 1) < A.getUnsafe tmp sizea)) || @@ -291,7 +276,6 @@ let diff dataa datab : t = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp; - (* let p = Bs_Cmp.getCmpIntenral M.cmp in *) if ( (A.getUnsafe tmp (sizea - 1)) < (A.getUnsafe tmp sizea)) || @@ -315,7 +299,6 @@ let union (dataa : t) (datab : t) : t = let tmp = A.makeUninitializedUnsafe totalSize in ignore @@ N.fillArray dataa0 0 tmp ; ignore @@ N.fillArray datab0 sizea tmp ; - (* let p = (Bs_Cmp.getCmpIntenral M.cmp) in *) if (A.getUnsafe tmp (sizea - 1) < A.getUnsafe tmp sizea) then diff --git a/jscomp/test/bs_poly_mutable_set_test.js b/jscomp/test/bs_poly_mutable_set_test.js index a7141f19fa..4a5f238fe4 100644 --- a/jscomp/test/bs_poly_mutable_set_test.js +++ b/jscomp/test/bs_poly_mutable_set_test.js @@ -3,6 +3,7 @@ var Mt = require("./mt.js"); var Bs_List = require("../../lib/js/bs_List.js"); var Bs_SetM = require("../../lib/js/bs_SetM.js"); +var Bs_Array = require("../../lib/js/bs_Array.js"); var Caml_primitive = require("../../lib/js/caml_primitive.js"); var Array_data_util = require("./array_data_util.js"); var Bs_internalAVLset = require("../../lib/js/bs_internalAVLset.js"); @@ -93,35 +94,162 @@ eq("File \"bs_poly_mutable_set_test.ml\", line 50, characters 5-12", Bs_internal b("File \"bs_poly_mutable_set_test.ml\", line 51, characters 4-11", Bs_SetM.has(u, 20000)); +Bs_SetM.removeMany(u, Array_data_util.randomRange(10000, 30000)); + +b("File \"bs_poly_mutable_set_test.ml\", line 53, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); + +var v = Bs_SetM.ofArray(Array_data_util.randomRange(1000, 2000), IntCmp); + +var bs = Bs_Array.map(Array_data_util.randomRange(500, 1499), (function (x) { + return Bs_SetM.removeCheck(v, x); + })); + +var indeedRemoved = Bs_Array.reduce(bs, 0, (function (acc, x) { + if (x) { + return acc + 1 | 0; + } else { + return acc; + } + })); + +eq("File \"bs_poly_mutable_set_test.ml\", line 60, characters 5-12", indeedRemoved, 500); + +eq("File \"bs_poly_mutable_set_test.ml\", line 61, characters 5-12", Bs_internalAVLset.size(v.data), 501); + +var cs = Bs_Array.map(Array_data_util.randomRange(500, 2000), (function (x) { + return Bs_SetM.addCheck(v, x); + })); + +var indeedAded = Bs_Array.reduce(cs, 0, (function (acc, x) { + if (x) { + return acc + 1 | 0; + } else { + return acc; + } + })); + +eq("File \"bs_poly_mutable_set_test.ml\", line 64, characters 5-12", indeedAded, 1000); + +eq("File \"bs_poly_mutable_set_test.ml\", line 65, characters 5-12", Bs_internalAVLset.size(v.data), 1501); + +var d = { + cmp: IntCmp[/* cmp */0], + data: Bs_internalAVLset.empty +}; + +b("File \"bs_poly_mutable_set_test.ml\", line 66, characters 4-11", Bs_internalAVLset.isEmpty(d.data)); + +eq("File \"bs_poly_mutable_set_test.ml\", line 67, characters 5-12", Bs_internalAVLset.minimum(v.data), /* Some */[500]); + +eq("File \"bs_poly_mutable_set_test.ml\", line 68, characters 5-12", Bs_internalAVLset.maximum(v.data), /* Some */[2000]); + +eq("File \"bs_poly_mutable_set_test.ml\", line 69, characters 5-12", Bs_internalAVLset.minUndefined(v.data), 500); + +eq("File \"bs_poly_mutable_set_test.ml\", line 70, characters 5-12", Bs_internalAVLset.maxUndefined(v.data), 2000); + +eq("File \"bs_poly_mutable_set_test.ml\", line 71, characters 5-12", Bs_SetM.reduce(v, 0, (function (x, y) { + return x + y | 0; + })), 1876250); + +b("File \"bs_poly_mutable_set_test.ml\", line 72, characters 4-11", Bs_List.eq(Bs_internalAVLset.toList(v.data), Bs_List.makeBy(1501, (function (i) { + return i + 500 | 0; + })), (function (x, y) { + return +(x === y); + }))); + +eq("File \"bs_poly_mutable_set_test.ml\", line 73, characters 5-12", Bs_internalAVLset.toArray(v.data), Array_data_util.range(500, 2000)); + +b("File \"bs_poly_mutable_set_test.ml\", line 74, characters 4-11", Bs_internalAVLset.checkInvariantInternal(v.data)); + +eq("File \"bs_poly_mutable_set_test.ml\", line 75, characters 5-12", Bs_SetM.get(v, 3), /* None */0); + +eq("File \"bs_poly_mutable_set_test.ml\", line 76, characters 5-12", Bs_SetM.get(v, 1200), /* Some */[1200]); + +var match = Bs_SetM.split(v, 1000); + +var match$1 = match[0]; + +var bb = match$1[1]; + +var aa = match$1[0]; + +b("File \"bs_poly_mutable_set_test.ml\", line 78, characters 4-11", match[1]); + +b("File \"bs_poly_mutable_set_test.ml\", line 79, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(aa.data), Array_data_util.range(500, 999), (function (x, y) { + return +(x === y); + }))); + +b("File \"bs_poly_mutable_set_test.ml\", line 80, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(bb.data), Array_data_util.range(1001, 2000), (function (x, y) { + return +(x === y); + }))); + +b("File \"bs_poly_mutable_set_test.ml\", line 81, characters 5-12", Bs_SetM.subset(aa, v)); + +b("File \"bs_poly_mutable_set_test.ml\", line 82, characters 4-11", Bs_SetM.subset(bb, v)); + +var d$1 = Bs_SetM.intersect(aa, bb); + +b("File \"bs_poly_mutable_set_test.ml\", line 83, characters 4-11", Bs_internalAVLset.isEmpty(d$1.data)); + +var c = Bs_SetM.removeCheck(v, 1000); + +b("File \"bs_poly_mutable_set_test.ml\", line 85, characters 4-11", c); + +var match$2 = Bs_SetM.split(v, 1000); + +var match$3 = match$2[0]; + +var bb$1 = match$3[1]; + +var aa$1 = match$3[0]; + +b("File \"bs_poly_mutable_set_test.ml\", line 87, characters 4-11", 1 - match$2[1]); + +b("File \"bs_poly_mutable_set_test.ml\", line 88, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(aa$1.data), Array_data_util.range(500, 999), (function (x, y) { + return +(x === y); + }))); + +b("File \"bs_poly_mutable_set_test.ml\", line 89, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(bb$1.data), Array_data_util.range(1001, 2000), (function (x, y) { + return +(x === y); + }))); + +b("File \"bs_poly_mutable_set_test.ml\", line 90, characters 5-12", Bs_SetM.subset(aa$1, v)); + +b("File \"bs_poly_mutable_set_test.ml\", line 91, characters 4-11", Bs_SetM.subset(bb$1, v)); + +var d$2 = Bs_SetM.intersect(aa$1, bb$1); + +b("File \"bs_poly_mutable_set_test.ml\", line 92, characters 4-11", Bs_internalAVLset.isEmpty(d$2.data)); + function f(param) { return Bs_SetM.ofArray(param, IntCmp); } -var aa = f(Array_data_util.randomRange(0, 100)); +var aa$2 = f(Array_data_util.randomRange(0, 100)); -var bb = f(Array_data_util.randomRange(40, 120)); +var bb$2 = f(Array_data_util.randomRange(40, 120)); -var cc = Bs_SetM.union(aa, bb); +var cc = Bs_SetM.union(aa$2, bb$2); -b("File \"bs_poly_mutable_set_test.ml\", line 60, characters 4-11", Bs_SetM.eq(cc, f(Array_data_util.randomRange(0, 120)))); +b("File \"bs_poly_mutable_set_test.ml\", line 101, characters 4-11", Bs_SetM.eq(cc, f(Array_data_util.randomRange(0, 120)))); -b("File \"bs_poly_mutable_set_test.ml\", line 62, characters 4-11", Bs_SetM.eq(Bs_SetM.union(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(21, 40))), f(Array_data_util.randomRange(0, 40)))); +b("File \"bs_poly_mutable_set_test.ml\", line 103, characters 4-11", Bs_SetM.eq(Bs_SetM.union(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(21, 40))), f(Array_data_util.randomRange(0, 40)))); -var dd = Bs_SetM.intersect(aa, bb); +var dd = Bs_SetM.intersect(aa$2, bb$2); -b("File \"bs_poly_mutable_set_test.ml\", line 67, characters 4-11", Bs_SetM.eq(dd, f(Array_data_util.randomRange(40, 100)))); +b("File \"bs_poly_mutable_set_test.ml\", line 108, characters 4-11", Bs_SetM.eq(dd, f(Array_data_util.randomRange(40, 100)))); -b("File \"bs_poly_mutable_set_test.ml\", line 68, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(21, 40))), { +b("File \"bs_poly_mutable_set_test.ml\", line 109, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(21, 40))), { cmp: IntCmp[/* cmp */0], data: Bs_internalAVLset.empty })); -b("File \"bs_poly_mutable_set_test.ml\", line 74, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(f(Array_data_util.randomRange(21, 40)), f(Array_data_util.randomRange(0, 20))), { +b("File \"bs_poly_mutable_set_test.ml\", line 115, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(f(Array_data_util.randomRange(21, 40)), f(Array_data_util.randomRange(0, 20))), { cmp: IntCmp[/* cmp */0], data: Bs_internalAVLset.empty })); -b("File \"bs_poly_mutable_set_test.ml\", line 80, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(f(/* array */[ +b("File \"bs_poly_mutable_set_test.ml\", line 121, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(f(/* array */[ 1, 3, 4, @@ -140,15 +268,15 @@ b("File \"bs_poly_mutable_set_test.ml\", line 80, characters 4-11", Bs_SetM.eq(B 5 ]))); -b("File \"bs_poly_mutable_set_test.ml\", line 86, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(aa, bb), f(Array_data_util.randomRange(0, 39)))); +b("File \"bs_poly_mutable_set_test.ml\", line 127, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(aa$2, bb$2), f(Array_data_util.randomRange(0, 39)))); -b("File \"bs_poly_mutable_set_test.ml\", line 88, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(bb, aa), f(Array_data_util.randomRange(101, 120)))); +b("File \"bs_poly_mutable_set_test.ml\", line 129, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(bb$2, aa$2), f(Array_data_util.randomRange(101, 120)))); -b("File \"bs_poly_mutable_set_test.ml\", line 90, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(f(Array_data_util.randomRange(21, 40)), f(Array_data_util.randomRange(0, 20))), f(Array_data_util.randomRange(21, 40)))); +b("File \"bs_poly_mutable_set_test.ml\", line 131, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(f(Array_data_util.randomRange(21, 40)), f(Array_data_util.randomRange(0, 20))), f(Array_data_util.randomRange(21, 40)))); -b("File \"bs_poly_mutable_set_test.ml\", line 96, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(21, 40))), f(Array_data_util.randomRange(0, 20)))); +b("File \"bs_poly_mutable_set_test.ml\", line 137, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(21, 40))), f(Array_data_util.randomRange(0, 20)))); -b("File \"bs_poly_mutable_set_test.ml\", line 103, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(0, 40))), f(Array_data_util.randomRange(0, -1)))); +b("File \"bs_poly_mutable_set_test.ml\", line 144, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(0, 40))), f(Array_data_util.randomRange(0, -1)))); var a0 = Bs_SetM.ofArray(Array_data_util.randomRange(0, 1000), IntCmp); @@ -160,19 +288,19 @@ var a2 = Bs_SetM.keepBy(a0, (function (x) { return +(x % 2 !== 0); })); -var match = Bs_SetM.partition(a0, (function (x) { +var match$4 = Bs_SetM.partition(a0, (function (x) { return +(x % 2 === 0); })); -var a4 = match[1]; +var a4 = match$4[1]; -var a3 = match[0]; +var a3 = match$4[0]; -b("File \"bs_poly_mutable_set_test.ml\", line 118, characters 4-11", Bs_SetM.eq(a1, a3)); +b("File \"bs_poly_mutable_set_test.ml\", line 159, characters 4-11", Bs_SetM.eq(a1, a3)); -b("File \"bs_poly_mutable_set_test.ml\", line 119, characters 4-11", Bs_SetM.eq(a2, a4)); +b("File \"bs_poly_mutable_set_test.ml\", line 160, characters 4-11", Bs_SetM.eq(a2, a4)); -b("File \"bs_poly_mutable_set_test.ml\", line 120, characters 4-11", Bs_List.every(/* :: */[ +b("File \"bs_poly_mutable_set_test.ml\", line 161, characters 4-11", Bs_List.every(/* :: */[ a0, /* :: */[ a1, diff --git a/jscomp/test/bs_poly_mutable_set_test.ml b/jscomp/test/bs_poly_mutable_set_test.ml index 793b2aee67..fd869c4563 100644 --- a/jscomp/test/bs_poly_mutable_set_test.ml +++ b/jscomp/test/bs_poly_mutable_set_test.ml @@ -48,8 +48,49 @@ let () = eq __LOC__ (N.size u) 10000; N.removeMany u (I.randomRange 10000 (20000 -1)); eq __LOC__ (N.size u) 1 ; - b __LOC__ (N.has u 20000) -(* for i = *) + b __LOC__ (N.has u 20000); + N.removeMany u (I.randomRange 10_000 30_000); + b __LOC__ (N.isEmpty u) + + +let () = + let v = N.ofArray ~dict:(module IntCmp) (I.randomRange 1_000 2_000) in + let bs = A.map (I.randomRange 500 1499) (fun [@bs] x -> N.removeCheck v x ) in + let indeedRemoved = A.reduce bs 0 (fun [@bs] acc x -> if x then acc + 1 else acc) in + eq __LOC__ indeedRemoved 500; + eq __LOC__ (N.size v) 501; + let cs = A.map (I.randomRange 500 2_000) (fun [@bs] x -> N.addCheck v x) in + let indeedAded = A.reduce cs 0 (fun[@bs] acc x -> if x then acc + 1 else acc) in + eq __LOC__ indeedAded 1000 ; + eq __LOC__ (N.size v) 1_501; + b __LOC__ (N.isEmpty (N.empty ~dict:(module IntCmp))); + eq __LOC__ (N.minimum v) (Some 500); + eq __LOC__ (N.maximum v) (Some 2000); + eq __LOC__ (N.minUndefined v) (Js.Undefined.return 500); + eq __LOC__ (N.maxUndefined v) (Js.Undefined.return 2000); + eq __LOC__ (N.reduce v 0 (fun [@bs] x y -> x + y)) ((( 500 + 2000)/2) * 1501 ); + b __LOC__ (L.eq (N.toList v) (L.makeBy 1_501 (fun[@bs] i -> i + 500) ) (fun[@bs] x y -> x = y) ) ; + eq __LOC__ (N.toArray v ) (I.range 500 2000); + b __LOC__ (N.checkInvariantInternal v); + eq __LOC__ (N.get v 3) None; + eq __LOC__ (N.get v 1_200) (Some 1_200); + let (aa, bb), pres = N.split v 1000 in + b __LOC__ pres ; + b __LOC__ (A.eq (N.toArray aa) (I.range 500 999) (fun[@bs] x y -> x = y)); + b __LOC__ (A.eq (N.toArray bb) (I.range 1_001 2_000) (fun[@bs] x y -> x = y)); + b __LOC__ (N.subset aa v); + b __LOC__ (N.subset bb v) ; + b __LOC__ (N.isEmpty (N.intersect aa bb)); + let c = N.removeCheck v 1_000 in + b __LOC__ c ; + let (aa,bb), pres = N.split v 1_000 in + b __LOC__ (not pres); + b __LOC__ (A.eq (N.toArray aa) (I.range 500 999) (fun[@bs] x y -> x = y)); + b __LOC__ (A.eq (N.toArray bb) (I.range 1_001 2_000) (fun[@bs] x y -> x = y)); + b __LOC__ (N.subset aa v); + b __LOC__ (N.subset bb v); + b __LOC__ (N.isEmpty (N.intersect aa bb)) + let (++) = N.union let f = N.ofArray ~dict:(module IntCmp) let (=~) = N.eq diff --git a/jscomp/test/bs_poly_set_test.js b/jscomp/test/bs_poly_set_test.js index be9735dc5b..1b4812df3a 100644 --- a/jscomp/test/bs_poly_set_test.js +++ b/jscomp/test/bs_poly_set_test.js @@ -350,6 +350,19 @@ var m$4 = Bs_Set.keepBy(a, (function (x) { b("File \"bs_poly_set_test.ml\", line 135, characters 4-11", Bs_SortedSetDict.isEmpty(m$4.data)); +var match$5 = Bs_Set.split({ + cmp: IntCmp[/* cmp */0], + data: Bs_SortedSetDict.empty + }, 0); + +var match$6 = match$5[0]; + +b("File \"bs_poly_set_test.ml\", line 139, characters 4-11", Bs_SortedSetDict.isEmpty(match$6[0].data)); + +b("File \"bs_poly_set_test.ml\", line 140, characters 4-11", Bs_SortedSetDict.isEmpty(match$6[1].data)); + +b("File \"bs_poly_set_test.ml\", line 141, characters 4-11", 1 - match$5[1]); + Mt.from_pair_suites("bs_poly_set_test.ml", suites[0]); var N = 0; diff --git a/jscomp/test/bs_poly_set_test.ml b/jscomp/test/bs_poly_set_test.ml index 27fbe9815f..11c44d2ae8 100644 --- a/jscomp/test/bs_poly_set_test.ml +++ b/jscomp/test/bs_poly_set_test.ml @@ -134,5 +134,9 @@ let () = let a = N.ofArray ~dict:(module IntCmp) [||] in b __LOC__ (N.isEmpty (N.keepBy a (fun[@bs] x -> x mod 2 = 0))) - +let () = + let (aa,bb), pres = N.split (N.empty ~dict:(module IntCmp)) 0 in + b __LOC__ (N.isEmpty aa); + b __LOC__ (N.isEmpty bb); + b __LOC__ (not pres) ;; Mt.from_pair_suites __FILE__ !suites diff --git a/lib/js/bs_SetIntM.js b/lib/js/bs_SetIntM.js index 2e44e44976..6bc26f9c31 100644 --- a/lib/js/bs_SetIntM.js +++ b/lib/js/bs_SetIntM.js @@ -4,7 +4,7 @@ var Bs_SortArrayInt = require("./bs_SortArrayInt.js"); var Bs_internalAVLset = require("./bs_internalAVLset.js"); var Bs_internalSetInt = require("./bs_internalSetInt.js"); -function removeMutateAux(nt, x) { +function remove0(nt, x) { var k = nt.key; if (x === k) { var l = nt.left; @@ -16,15 +16,13 @@ function removeMutateAux(nt, x) { } else { return l; } - } else if (r !== null) { - return r; } else { - return l; + return r; } } else if (x < k) { var match = nt.left; if (match !== null) { - nt.left = removeMutateAux(match, x); + nt.left = remove0(match, x); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -32,7 +30,7 @@ function removeMutateAux(nt, x) { } else { var match$1 = nt.right; if (match$1 !== null) { - nt.right = removeMutateAux(match$1, x); + nt.right = remove0(match$1, x); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -40,144 +38,28 @@ function removeMutateAux(nt, x) { } } -function addArrayMutate(t, xs) { - var v = t; - for(var i = 0 ,i_finish = xs.length - 1 | 0; i <= i_finish; ++i){ - v = Bs_internalSetInt.addMutate(v, xs[i]); - } - return v; -} - -function removeMutate(nt, x) { - if (nt !== null) { - return removeMutateAux(nt, x); - } else { - return nt; - } -} - -function empty() { - return { - data: Bs_internalAVLset.empty - }; -} - -function isEmpty(d) { - return Bs_internalAVLset.isEmpty(d.data); -} - -function minimum(d) { - return Bs_internalAVLset.minimum(d.data); -} - -function minUndefined(d) { - return Bs_internalAVLset.minUndefined(d.data); -} - -function maximum(d) { - return Bs_internalAVLset.maximum(d.data); -} - -function maxUndefined(d) { - return Bs_internalAVLset.maxUndefined(d.data); -} - -function forEach(d, f) { - return Bs_internalAVLset.forEach(d.data, f); -} - -function reduce(d, acc, cb) { - return Bs_internalAVLset.reduce(d.data, acc, cb); -} - -function every(d, p) { - return Bs_internalAVLset.every(d.data, p); -} - -function some(d, p) { - return Bs_internalAVLset.some(d.data, p); -} - -function keepBy(d, p) { - return { - data: Bs_internalAVLset.filterCopy(d.data, p) - }; -} - -function partition(d, p) { - var match = Bs_internalAVLset.partitionCopy(d.data, p); - return /* tuple */[ - { - data: match[0] - }, - { - data: match[1] - } - ]; -} - -function size(d) { - return Bs_internalAVLset.size(d.data); -} - -function toList(d) { - return Bs_internalAVLset.toList(d.data); -} - -function toArray(d) { - return Bs_internalAVLset.toArray(d.data); -} - -function ofSortedArrayUnsafe(xs) { - return { - data: Bs_internalAVLset.ofSortedArrayUnsafe(xs) - }; -} - -function checkInvariantInternal(d) { - return Bs_internalAVLset.checkInvariantInternal(d.data); -} - -function add(d, k) { - var old_data = d.data; - var v = Bs_internalSetInt.addMutate(old_data, k); - if (v !== old_data) { - d.data = v; - return /* () */0; - } else { - return 0; - } -} - -function mergeMany(d, arr) { - var old_data = d.data; - var v = addArrayMutate(old_data, arr); - if (v !== old_data) { - d.data = v; - return /* () */0; - } else { - return 0; - } -} - function remove(d, v) { - var old_data = d.data; - var v$1 = removeMutate(old_data, v); - if (v$1 !== old_data) { - d.data = v$1; - return /* () */0; + var oldRoot = d.data; + if (oldRoot !== null) { + var newRoot = remove0(oldRoot, v); + if (newRoot !== oldRoot) { + d.data = newRoot; + return /* () */0; + } else { + return 0; + } } else { - return 0; + return /* () */0; } } -function removeArrayMutateAux(_t, xs, _i, len) { +function removeMany0(_t, xs, _i, len) { while(true) { var i = _i; var t = _t; if (i < len) { var ele = xs[i]; - var u = removeMutateAux(t, ele); + var u = remove0(t, ele); if (u !== null) { _i = i + 1 | 0; _t = u; @@ -196,19 +78,14 @@ function removeMany(d, xs) { var oldRoot = d.data; if (oldRoot !== null) { var len = xs.length; - var newRoot = removeArrayMutateAux(oldRoot, xs, 0, len); - if (newRoot !== oldRoot) { - d.data = newRoot; - return /* () */0; - } else { - return 0; - } + d.data = removeMany0(oldRoot, xs, 0, len); + return /* () */0; } else { return /* () */0; } } -function removeMutateCheckAux(nt, x, removed) { +function removeCheck0(nt, x, removed) { var k = nt.key; if (x === k) { removed[0] = /* true */1; @@ -221,15 +98,13 @@ function removeMutateCheckAux(nt, x, removed) { } else { return l; } - } else if (r !== null) { - return r; } else { - return l; + return r; } } else if (x < k) { var match = nt.left; if (match !== null) { - nt.left = removeMutateCheckAux(match, x, removed); + nt.left = removeCheck0(match, x, removed); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -237,7 +112,7 @@ function removeMutateCheckAux(nt, x, removed) { } else { var match$1 = nt.right; if (match$1 !== null) { - nt.right = removeMutateCheckAux(match$1, x, removed); + nt.right = removeCheck0(match$1, x, removed); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -249,7 +124,7 @@ function removeCheck(d, v) { var oldRoot = d.data; if (oldRoot !== null) { var removed = [/* false */0]; - var newRoot = removeMutateCheckAux(oldRoot, v, removed); + var newRoot = removeCheck0(oldRoot, v, removed); if (newRoot !== oldRoot) { d.data = newRoot; } @@ -259,7 +134,7 @@ function removeCheck(d, v) { } } -function addMutateCheckAux(t, x, added) { +function addCheck0(t, x, added) { if (t !== null) { var k = t.key; if (x === k) { @@ -268,10 +143,10 @@ function addMutateCheckAux(t, x, added) { var l = t.left; var r = t.right; if (x < k) { - var ll = addMutateCheckAux(l, x, added); + var ll = addCheck0(l, x, added); t.left = ll; } else { - t.right = addMutateCheckAux(r, x, added); + t.right = addCheck0(r, x, added); } return Bs_internalAVLset.balMutate(t); } @@ -284,13 +159,101 @@ function addMutateCheckAux(t, x, added) { function addCheck(m, e) { var oldRoot = m.data; var added = [/* false */0]; - var newRoot = addMutateCheckAux(oldRoot, e, added); + var newRoot = addCheck0(oldRoot, e, added); if (newRoot !== oldRoot) { m.data = newRoot; } return added[0]; } +function add(d, k) { + var oldRoot = d.data; + var v = Bs_internalSetInt.addMutate(oldRoot, k); + if (v !== oldRoot) { + d.data = v; + return /* () */0; + } else { + return 0; + } +} + +function addArrayMutate(t, xs) { + var v = t; + for(var i = 0 ,i_finish = xs.length - 1 | 0; i <= i_finish; ++i){ + v = Bs_internalSetInt.addMutate(v, xs[i]); + } + return v; +} + +function mergeMany(d, arr) { + d.data = addArrayMutate(d.data, arr); + return /* () */0; +} + +function empty() { + return { + data: Bs_internalAVLset.empty + }; +} + +function isEmpty(d) { + return Bs_internalAVLset.isEmpty(d.data); +} + +function minimum(d) { + return Bs_internalAVLset.minimum(d.data); +} + +function minUndefined(d) { + return Bs_internalAVLset.minUndefined(d.data); +} + +function maximum(d) { + return Bs_internalAVLset.maximum(d.data); +} + +function maxUndefined(d) { + return Bs_internalAVLset.maxUndefined(d.data); +} + +function forEach(d, f) { + return Bs_internalAVLset.forEach(d.data, f); +} + +function reduce(d, acc, cb) { + return Bs_internalAVLset.reduce(d.data, acc, cb); +} + +function every(d, p) { + return Bs_internalAVLset.every(d.data, p); +} + +function some(d, p) { + return Bs_internalAVLset.some(d.data, p); +} + +function size(d) { + return Bs_internalAVLset.size(d.data); +} + +function toList(d) { + return Bs_internalAVLset.toList(d.data); +} + +function toArray(d) { + return Bs_internalAVLset.toArray(d.data); +} + +function ofSortedArrayUnsafe(xs) { + return { + data: Bs_internalAVLset.ofSortedArrayUnsafe(xs) + }; +} + +function checkInvariantInternal(d) { + return Bs_internalAVLset.checkInvariantInternal(d.data); +} + function ofArray(xs) { return { data: Bs_internalSetInt.ofArray(xs) @@ -318,8 +281,7 @@ function getExn(d, x) { } function split(d, key) { - var s = d.data; - var arr = Bs_internalAVLset.toArray(s); + var arr = Bs_internalAVLset.toArray(d.data); var i = Bs_SortArrayInt.binarySearch(arr, key); var len = arr.length; if (i < 0) { @@ -350,6 +312,24 @@ function split(d, key) { } } +function keepBy(d, p) { + return { + data: Bs_internalAVLset.filterCopy(d.data, p) + }; +} + +function partition(d, p) { + var match = Bs_internalAVLset.partitionCopy(d.data, p); + return /* tuple */[ + { + data: match[0] + }, + { + data: match[1] + } + ]; +} + function subset(a, b) { return Bs_internalSetInt.subset(a.data, b.data); } diff --git a/lib/js/bs_SetM.js b/lib/js/bs_SetM.js index 5e2ab20765..6878dd71bb 100644 --- a/lib/js/bs_SetM.js +++ b/lib/js/bs_SetM.js @@ -3,14 +3,14 @@ var Bs_SortArray = require("./bs_SortArray.js"); var Bs_internalAVLset = require("./bs_internalAVLset.js"); -function removeMutateAux(nt, x, cmp) { +function remove0(nt, x, cmp) { var k = nt.key; var c = cmp(x, k); if (c) { if (c < 0) { var match = nt.left; if (match !== null) { - nt.left = removeMutateAux(match, x, cmp); + nt.left = remove0(match, x, cmp); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -18,7 +18,7 @@ function removeMutateAux(nt, x, cmp) { } else { var match$1 = nt.right; if (match$1 !== null) { - nt.right = removeMutateAux(match$1, x, cmp); + nt.right = remove0(match$1, x, cmp); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -34,10 +34,8 @@ function removeMutateAux(nt, x, cmp) { } else { return l; } - } else if (r !== null) { - return r; } else { - return l; + return r; } } } @@ -45,7 +43,7 @@ function removeMutateAux(nt, x, cmp) { function remove(d, v) { var oldRoot = d.data; if (oldRoot !== null) { - var newRoot = removeMutateAux(oldRoot, v, d.cmp); + var newRoot = remove0(oldRoot, v, d.cmp); if (newRoot !== oldRoot) { d.data = newRoot; return /* () */0; @@ -57,13 +55,13 @@ function remove(d, v) { } } -function removeArrayMutateAux(_t, xs, _i, len, cmp) { +function removeMany0(_t, xs, _i, len, cmp) { while(true) { var i = _i; var t = _t; if (i < len) { var ele = xs[i]; - var u = removeMutateAux(t, ele, cmp); + var u = remove0(t, ele, cmp); if (u !== null) { _i = i + 1 | 0; _t = u; @@ -82,26 +80,21 @@ function removeMany(d, xs) { var oldRoot = d.data; if (oldRoot !== null) { var len = xs.length; - var newRoot = removeArrayMutateAux(oldRoot, xs, 0, len, d.cmp); - if (newRoot !== oldRoot) { - d.data = newRoot; - return /* () */0; - } else { - return 0; - } + d.data = removeMany0(oldRoot, xs, 0, len, d.cmp); + return /* () */0; } else { return /* () */0; } } -function removeMutateCheckAux(nt, x, removed, cmp) { +function removeCheck0(nt, x, removed, cmp) { var k = nt.key; var c = cmp(x, k); if (c) { if (c < 0) { var match = nt.left; if (match !== null) { - nt.left = removeMutateCheckAux(match, x, removed, cmp); + nt.left = removeCheck0(match, x, removed, cmp); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -109,7 +102,7 @@ function removeMutateCheckAux(nt, x, removed, cmp) { } else { var match$1 = nt.right; if (match$1 !== null) { - nt.right = removeMutateCheckAux(match$1, x, removed, cmp); + nt.right = removeCheck0(match$1, x, removed, cmp); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -126,10 +119,8 @@ function removeMutateCheckAux(nt, x, removed, cmp) { } else { return l; } - } else if (r !== null) { - return r; } else { - return l; + return r; } } } @@ -138,7 +129,7 @@ function removeCheck(d, v) { var oldRoot = d.data; if (oldRoot !== null) { var removed = [/* false */0]; - var newRoot = removeMutateCheckAux(oldRoot, v, removed, d.cmp); + var newRoot = removeCheck0(oldRoot, v, removed, d.cmp); if (newRoot !== oldRoot) { d.data = newRoot; } @@ -148,7 +139,7 @@ function removeCheck(d, v) { } } -function addMutateCheckAux(t, x, added, cmp) { +function addCheck0(t, x, added, cmp) { if (t !== null) { var k = t.key; var c = cmp(x, k); @@ -156,10 +147,10 @@ function addMutateCheckAux(t, x, added, cmp) { var l = t.left; var r = t.right; if (c < 0) { - var ll = addMutateCheckAux(l, x, added, cmp); + var ll = addCheck0(l, x, added, cmp); t.left = ll; } else { - t.right = addMutateCheckAux(r, x, added, cmp); + t.right = addCheck0(r, x, added, cmp); } return Bs_internalAVLset.balMutate(t); } else { @@ -174,70 +165,35 @@ function addMutateCheckAux(t, x, added, cmp) { function addCheck(m, e) { var oldRoot = m.data; var added = [/* false */0]; - var newRoot = addMutateCheckAux(oldRoot, e, added, m.cmp); + var newRoot = addCheck0(oldRoot, e, added, m.cmp); if (newRoot !== oldRoot) { m.data = newRoot; } return added[0]; } -function split(d, key) { - var arr = Bs_internalAVLset.toArray(d.data); - var cmp = d.cmp; - var i = Bs_SortArray.binarySearchBy(arr, key, cmp); - var len = arr.length; - if (i < 0) { - var next = (-i | 0) - 1 | 0; - return /* tuple */[ - /* tuple */[ - { - cmp: cmp, - data: Bs_internalAVLset.ofSortedArrayAux(arr, 0, next) - }, - { - cmp: cmp, - data: Bs_internalAVLset.ofSortedArrayAux(arr, next, len - next | 0) - } - ], - /* false */0 - ]; +function add(m, e) { + var oldRoot = m.data; + var newRoot = Bs_internalAVLset.addMutate(m.cmp, oldRoot, e); + if (newRoot !== oldRoot) { + m.data = newRoot; + return /* () */0; } else { - return /* tuple */[ - /* tuple */[ - { - cmp: cmp, - data: Bs_internalAVLset.ofSortedArrayAux(arr, 0, i) - }, - { - cmp: cmp, - data: Bs_internalAVLset.ofSortedArrayAux(arr, i + 1 | 0, (len - i | 0) - 1 | 0) - } - ], - /* true */1 - ]; + return 0; } } -function keepBy(d, p) { - return { - cmp: d.cmp, - data: Bs_internalAVLset.filterCopy(d.data, p) - }; +function addArrayMutate(t, xs, cmp) { + var v = t; + for(var i = 0 ,i_finish = xs.length - 1 | 0; i <= i_finish; ++i){ + v = Bs_internalAVLset.addMutate(cmp, v, xs[i]); + } + return v; } -function partition(d, p) { - var cmp = d.cmp; - var match = Bs_internalAVLset.partitionCopy(d.data, p); - return /* tuple */[ - { - cmp: cmp, - data: match[0] - }, - { - cmp: cmp, - data: match[1] - } - ]; +function mergeMany(d, xs) { + d.data = addArrayMutate(d.data, xs, d.cmp); + return /* () */0; } function empty(dict) { @@ -306,6 +262,14 @@ function checkInvariantInternal(d) { return Bs_internalAVLset.checkInvariantInternal(d.data); } +function ofArray(data, dict) { + var cmp = dict[/* cmp */0]; + return { + cmp: cmp, + data: Bs_internalAVLset.ofArray(data, cmp) + }; +} + function cmp(d0, d1) { return Bs_internalAVLset.cmp(d0.data, d1.data, d0.cmp); } @@ -326,40 +290,63 @@ function getExn(d, x) { return Bs_internalAVLset.getExn(d.data, x, d.cmp); } -function has(d, x) { - return Bs_internalAVLset.has(d.data, x, d.cmp); -} - -function ofArray(data, dict) { - var cmp = dict[/* cmp */0]; - return { - cmp: cmp, - data: Bs_internalAVLset.ofArray(data, cmp) - }; -} - -function add(m, e) { - var oldRoot = m.data; - var newRoot = Bs_internalAVLset.addMutate(m.cmp, oldRoot, e); - if (newRoot !== oldRoot) { - m.data = newRoot; - return /* () */0; +function split(d, key) { + var arr = Bs_internalAVLset.toArray(d.data); + var cmp = d.cmp; + var i = Bs_SortArray.binarySearchBy(arr, key, cmp); + var len = arr.length; + if (i < 0) { + var next = (-i | 0) - 1 | 0; + return /* tuple */[ + /* tuple */[ + { + cmp: cmp, + data: Bs_internalAVLset.ofSortedArrayAux(arr, 0, next) + }, + { + cmp: cmp, + data: Bs_internalAVLset.ofSortedArrayAux(arr, next, len - next | 0) + } + ], + /* false */0 + ]; } else { - return 0; + return /* tuple */[ + /* tuple */[ + { + cmp: cmp, + data: Bs_internalAVLset.ofSortedArrayAux(arr, 0, i) + }, + { + cmp: cmp, + data: Bs_internalAVLset.ofSortedArrayAux(arr, i + 1 | 0, (len - i | 0) - 1 | 0) + } + ], + /* true */1 + ]; } } -function addArrayMutate(t, xs, cmp) { - var v = t; - for(var i = 0 ,i_finish = xs.length - 1 | 0; i <= i_finish; ++i){ - v = Bs_internalAVLset.addMutate(cmp, v, xs[i]); - } - return v; +function keepBy(d, p) { + return { + cmp: d.cmp, + data: Bs_internalAVLset.filterCopy(d.data, p) + }; } -function mergeMany(d, xs) { - d.data = addArrayMutate(d.data, xs, d.cmp); - return /* () */0; +function partition(d, p) { + var cmp = d.cmp; + var match = Bs_internalAVLset.partitionCopy(d.data, p); + return /* tuple */[ + { + cmp: cmp, + data: match[0] + }, + { + cmp: cmp, + data: match[1] + } + ]; } function subset(a, b) { @@ -483,6 +470,10 @@ function union(a, b) { } } +function has(d, x) { + return Bs_internalAVLset.has(d.data, x, d.cmp); +} + function copy(d) { return { cmp: d.cmp, diff --git a/lib/js/bs_SetStringM.js b/lib/js/bs_SetStringM.js index 37331fc8ce..3d44bfcfd3 100644 --- a/lib/js/bs_SetStringM.js +++ b/lib/js/bs_SetStringM.js @@ -4,7 +4,7 @@ var Bs_internalAVLset = require("./bs_internalAVLset.js"); var Bs_SortArrayString = require("./bs_SortArrayString.js"); var Bs_internalSetString = require("./bs_internalSetString.js"); -function removeMutateAux(nt, x) { +function remove0(nt, x) { var k = nt.key; if (x === k) { var l = nt.left; @@ -16,15 +16,13 @@ function removeMutateAux(nt, x) { } else { return l; } - } else if (r !== null) { - return r; } else { - return l; + return r; } } else if (x < k) { var match = nt.left; if (match !== null) { - nt.left = removeMutateAux(match, x); + nt.left = remove0(match, x); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -32,7 +30,7 @@ function removeMutateAux(nt, x) { } else { var match$1 = nt.right; if (match$1 !== null) { - nt.right = removeMutateAux(match$1, x); + nt.right = remove0(match$1, x); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -40,144 +38,28 @@ function removeMutateAux(nt, x) { } } -function addArrayMutate(t, xs) { - var v = t; - for(var i = 0 ,i_finish = xs.length - 1 | 0; i <= i_finish; ++i){ - v = Bs_internalSetString.addMutate(v, xs[i]); - } - return v; -} - -function removeMutate(nt, x) { - if (nt !== null) { - return removeMutateAux(nt, x); - } else { - return nt; - } -} - -function empty() { - return { - data: Bs_internalAVLset.empty - }; -} - -function isEmpty(d) { - return Bs_internalAVLset.isEmpty(d.data); -} - -function minimum(d) { - return Bs_internalAVLset.minimum(d.data); -} - -function minUndefined(d) { - return Bs_internalAVLset.minUndefined(d.data); -} - -function maximum(d) { - return Bs_internalAVLset.maximum(d.data); -} - -function maxUndefined(d) { - return Bs_internalAVLset.maxUndefined(d.data); -} - -function forEach(d, f) { - return Bs_internalAVLset.forEach(d.data, f); -} - -function reduce(d, acc, cb) { - return Bs_internalAVLset.reduce(d.data, acc, cb); -} - -function every(d, p) { - return Bs_internalAVLset.every(d.data, p); -} - -function some(d, p) { - return Bs_internalAVLset.some(d.data, p); -} - -function keepBy(d, p) { - return { - data: Bs_internalAVLset.filterCopy(d.data, p) - }; -} - -function partition(d, p) { - var match = Bs_internalAVLset.partitionCopy(d.data, p); - return /* tuple */[ - { - data: match[0] - }, - { - data: match[1] - } - ]; -} - -function size(d) { - return Bs_internalAVLset.size(d.data); -} - -function toList(d) { - return Bs_internalAVLset.toList(d.data); -} - -function toArray(d) { - return Bs_internalAVLset.toArray(d.data); -} - -function ofSortedArrayUnsafe(xs) { - return { - data: Bs_internalAVLset.ofSortedArrayUnsafe(xs) - }; -} - -function checkInvariantInternal(d) { - return Bs_internalAVLset.checkInvariantInternal(d.data); -} - -function add(d, k) { - var old_data = d.data; - var v = Bs_internalSetString.addMutate(old_data, k); - if (v !== old_data) { - d.data = v; - return /* () */0; - } else { - return 0; - } -} - -function mergeMany(d, arr) { - var old_data = d.data; - var v = addArrayMutate(old_data, arr); - if (v !== old_data) { - d.data = v; - return /* () */0; - } else { - return 0; - } -} - function remove(d, v) { - var old_data = d.data; - var v$1 = removeMutate(old_data, v); - if (v$1 !== old_data) { - d.data = v$1; - return /* () */0; + var oldRoot = d.data; + if (oldRoot !== null) { + var newRoot = remove0(oldRoot, v); + if (newRoot !== oldRoot) { + d.data = newRoot; + return /* () */0; + } else { + return 0; + } } else { - return 0; + return /* () */0; } } -function removeArrayMutateAux(_t, xs, _i, len) { +function removeMany0(_t, xs, _i, len) { while(true) { var i = _i; var t = _t; if (i < len) { var ele = xs[i]; - var u = removeMutateAux(t, ele); + var u = remove0(t, ele); if (u !== null) { _i = i + 1 | 0; _t = u; @@ -196,19 +78,14 @@ function removeMany(d, xs) { var oldRoot = d.data; if (oldRoot !== null) { var len = xs.length; - var newRoot = removeArrayMutateAux(oldRoot, xs, 0, len); - if (newRoot !== oldRoot) { - d.data = newRoot; - return /* () */0; - } else { - return 0; - } + d.data = removeMany0(oldRoot, xs, 0, len); + return /* () */0; } else { return /* () */0; } } -function removeMutateCheckAux(nt, x, removed) { +function removeCheck0(nt, x, removed) { var k = nt.key; if (x === k) { removed[0] = /* true */1; @@ -221,15 +98,13 @@ function removeMutateCheckAux(nt, x, removed) { } else { return l; } - } else if (r !== null) { - return r; } else { - return l; + return r; } } else if (x < k) { var match = nt.left; if (match !== null) { - nt.left = removeMutateCheckAux(match, x, removed); + nt.left = removeCheck0(match, x, removed); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -237,7 +112,7 @@ function removeMutateCheckAux(nt, x, removed) { } else { var match$1 = nt.right; if (match$1 !== null) { - nt.right = removeMutateCheckAux(match$1, x, removed); + nt.right = removeCheck0(match$1, x, removed); return Bs_internalAVLset.balMutate(nt); } else { return nt; @@ -249,7 +124,7 @@ function removeCheck(d, v) { var oldRoot = d.data; if (oldRoot !== null) { var removed = [/* false */0]; - var newRoot = removeMutateCheckAux(oldRoot, v, removed); + var newRoot = removeCheck0(oldRoot, v, removed); if (newRoot !== oldRoot) { d.data = newRoot; } @@ -259,7 +134,7 @@ function removeCheck(d, v) { } } -function addMutateCheckAux(t, x, added) { +function addCheck0(t, x, added) { if (t !== null) { var k = t.key; if (x === k) { @@ -268,10 +143,10 @@ function addMutateCheckAux(t, x, added) { var l = t.left; var r = t.right; if (x < k) { - var ll = addMutateCheckAux(l, x, added); + var ll = addCheck0(l, x, added); t.left = ll; } else { - t.right = addMutateCheckAux(r, x, added); + t.right = addCheck0(r, x, added); } return Bs_internalAVLset.balMutate(t); } @@ -284,13 +159,101 @@ function addMutateCheckAux(t, x, added) { function addCheck(m, e) { var oldRoot = m.data; var added = [/* false */0]; - var newRoot = addMutateCheckAux(oldRoot, e, added); + var newRoot = addCheck0(oldRoot, e, added); if (newRoot !== oldRoot) { m.data = newRoot; } return added[0]; } +function add(d, k) { + var oldRoot = d.data; + var v = Bs_internalSetString.addMutate(oldRoot, k); + if (v !== oldRoot) { + d.data = v; + return /* () */0; + } else { + return 0; + } +} + +function addArrayMutate(t, xs) { + var v = t; + for(var i = 0 ,i_finish = xs.length - 1 | 0; i <= i_finish; ++i){ + v = Bs_internalSetString.addMutate(v, xs[i]); + } + return v; +} + +function mergeMany(d, arr) { + d.data = addArrayMutate(d.data, arr); + return /* () */0; +} + +function empty() { + return { + data: Bs_internalAVLset.empty + }; +} + +function isEmpty(d) { + return Bs_internalAVLset.isEmpty(d.data); +} + +function minimum(d) { + return Bs_internalAVLset.minimum(d.data); +} + +function minUndefined(d) { + return Bs_internalAVLset.minUndefined(d.data); +} + +function maximum(d) { + return Bs_internalAVLset.maximum(d.data); +} + +function maxUndefined(d) { + return Bs_internalAVLset.maxUndefined(d.data); +} + +function forEach(d, f) { + return Bs_internalAVLset.forEach(d.data, f); +} + +function reduce(d, acc, cb) { + return Bs_internalAVLset.reduce(d.data, acc, cb); +} + +function every(d, p) { + return Bs_internalAVLset.every(d.data, p); +} + +function some(d, p) { + return Bs_internalAVLset.some(d.data, p); +} + +function size(d) { + return Bs_internalAVLset.size(d.data); +} + +function toList(d) { + return Bs_internalAVLset.toList(d.data); +} + +function toArray(d) { + return Bs_internalAVLset.toArray(d.data); +} + +function ofSortedArrayUnsafe(xs) { + return { + data: Bs_internalAVLset.ofSortedArrayUnsafe(xs) + }; +} + +function checkInvariantInternal(d) { + return Bs_internalAVLset.checkInvariantInternal(d.data); +} + function ofArray(xs) { return { data: Bs_internalSetString.ofArray(xs) @@ -318,8 +281,7 @@ function getExn(d, x) { } function split(d, key) { - var s = d.data; - var arr = Bs_internalAVLset.toArray(s); + var arr = Bs_internalAVLset.toArray(d.data); var i = Bs_SortArrayString.binarySearch(arr, key); var len = arr.length; if (i < 0) { @@ -350,6 +312,24 @@ function split(d, key) { } } +function keepBy(d, p) { + return { + data: Bs_internalAVLset.filterCopy(d.data, p) + }; +} + +function partition(d, p) { + var match = Bs_internalAVLset.partitionCopy(d.data, p); + return /* tuple */[ + { + data: match[0] + }, + { + data: match[1] + } + ]; +} + function subset(a, b) { return Bs_internalSetString.subset(a.data, b.data); } From 1802017d32b1e2863e2181b272044c6f8358cf90 Mon Sep 17 00:00:00 2001 From: Hongbo Zhang Date: Tue, 30 Jan 2018 20:40:32 +0800 Subject: [PATCH 2/2] more tests and fix some inconsistency --- jscomp/others/.depend | 5 +- jscomp/others/bs_Map.ml | 3 +- jscomp/others/bs_MapInt.ml | 8 +- jscomp/others/bs_MapInt.mli | 2 +- jscomp/others/bs_MapString.ml | 8 +- jscomp/others/bs_MapString.mli | 2 +- jscomp/others/bs_Set.ml | 3 +- jscomp/others/bs_Set.mli | 2 + jscomp/others/bs_SortedMapDict.ml | 6 +- jscomp/others/map.cppo.ml | 8 +- jscomp/others/map.cppo.mli | 2 +- jscomp/test/.depend | 4 +- jscomp/test/Makefile | 8 +- jscomp/test/bs_map_int_test.js | 76 --- jscomp/test/bs_map_int_test.ml | 28 - jscomp/test/bs_map_set_dict_test.js | 195 +++++++ jscomp/test/bs_map_set_dict_test.ml | 99 ++++ jscomp/test/bs_map_test.js | 206 ++----- jscomp/test/bs_map_test.ml | 120 +---- jscomp/test/bs_mutable_set_test.js | 688 +++++++++++++++++++----- jscomp/test/bs_mutable_set_test.ml | 158 ++++++ jscomp/test/bs_poly_map_test.js | 165 +++++- jscomp/test/bs_poly_map_test.ml | 77 ++- jscomp/test/bs_poly_mutable_set_test.js | 155 +++--- jscomp/test/bs_poly_mutable_set_test.ml | 17 +- jscomp/test/bs_set_int_test.js | 53 ++ jscomp/test/bs_set_int_test.ml | 22 + lib/js/bs_Map.js | 12 +- lib/js/bs_MapInt.js | 4 +- lib/js/bs_MapString.js | 4 +- lib/js/bs_Set.js | 6 + 31 files changed, 1484 insertions(+), 662 deletions(-) delete mode 100644 jscomp/test/bs_map_int_test.js delete mode 100644 jscomp/test/bs_map_int_test.ml create mode 100644 jscomp/test/bs_map_set_dict_test.js create mode 100644 jscomp/test/bs_map_set_dict_test.ml diff --git a/jscomp/others/.depend b/jscomp/others/.depend index 8872287ad0..4941a5c239 100644 --- a/jscomp/others/.depend +++ b/jscomp/others/.depend @@ -68,7 +68,8 @@ bs_MapStringM.cmj : bs_internalMapString.cmj bs_internalAVLtree.cmj \ bs_Array.cmj bs_MapStringM.cmi bs_MapIntM.cmj : bs_internalMapInt.cmj bs_internalAVLtree.cmj bs_Array.cmj \ bs_MapIntM.cmi -bs_Set.cmj : bs_SortedSetDict.cmj bs_Cmp.cmj bs_Array.cmj bs_Set.cmi +bs_Set.cmj : bs_SortedSetDict.cmj bs_SetString.cmj bs_SetInt.cmj bs_Cmp.cmj \ + bs_Array.cmj bs_Set.cmi bs_SetM.cmj : bs_internalAVLset.cmj bs_SortArray.cmj bs_SetStringM.cmj \ bs_SetIntM.cmj bs_Cmp.cmj bs_Array.cmj bs_SetM.cmi bs_MapM.cmj : bs_internalAVLtree.cmj bs_MapStringM.cmj bs_MapIntM.cmj \ @@ -135,7 +136,7 @@ bs_MapString.cmi : bs_MapInt.cmi : bs_MapStringM.cmi : bs_MapIntM.cmi : -bs_Set.cmi : bs_SortedSetDict.cmi bs_Cmp.cmi +bs_Set.cmi : bs_SortedSetDict.cmi bs_SetString.cmi bs_SetInt.cmi bs_Cmp.cmi bs_SetM.cmi : bs_SetStringM.cmi bs_SetIntM.cmi bs_Cmp.cmi bs_MapM.cmi : bs_MapStringM.cmi bs_MapIntM.cmi bs_Cmp.cmi bs_SetInt.cmi : diff --git a/jscomp/others/bs_Map.ml b/jscomp/others/bs_Map.ml index ce662c2e46..d72227ed10 100644 --- a/jscomp/others/bs_Map.ml +++ b/jscomp/others/bs_Map.ml @@ -43,8 +43,7 @@ let remove m x = let removeMany m x = let cmp, odata = S.cmp m, S.data m in let newData = N.removeMany odata x ~cmp in - if newData == odata then m - else S.t ~cmp ~data:newData + S.t ~cmp ~data:newData let set m key d = let cmp = S.cmp m in diff --git a/jscomp/others/bs_MapInt.ml b/jscomp/others/bs_MapInt.ml index 279d654ed1..a8461994fe 100644 --- a/jscomp/others/bs_MapInt.ml +++ b/jscomp/others/bs_MapInt.ml @@ -114,21 +114,21 @@ let remove n x = | None -> N.empty | Some n -> removeAux n x -let rec removeArrayAux t xs i len = +let rec removeMany0 t xs i len = if i < len then let ele = A.getUnsafe xs i in let u = removeAux t ele in match N.toOpt u with | None -> u - | Some t -> removeArrayAux t xs (i + 1) len + | Some t -> removeMany0 t xs (i + 1) len else N.return t -let removeArray t keys = +let removeMany t keys = let len = A.length keys in match N.toOpt t with | None -> N.empty - | Some t -> removeArrayAux t keys 0 len + | Some t -> removeMany0 t keys 0 len let mergeArray h arr = let len = A.length arr in diff --git a/jscomp/others/bs_MapInt.mli b/jscomp/others/bs_MapInt.mli index 5bf52ac70c..ce0ed360fe 100644 --- a/jscomp/others/bs_MapInt.mli +++ b/jscomp/others/bs_MapInt.mli @@ -60,7 +60,7 @@ val checkInvariantInternal: _ t -> bool val remove: 'a t -> key -> 'a t (** [remove m x] returns a map containing the same bindings as [m], except for [x] which is unbound in the returned map. *) -val removeArray: 'a t -> key array -> 'a t +val removeMany: 'a t -> key array -> 'a t val set: 'a t -> key -> 'a -> 'a t (** [add m x y] returns a map containing the same bindings as diff --git a/jscomp/others/bs_MapString.ml b/jscomp/others/bs_MapString.ml index ad1f60c2df..546cc2f334 100644 --- a/jscomp/others/bs_MapString.ml +++ b/jscomp/others/bs_MapString.ml @@ -114,21 +114,21 @@ let remove n x = | None -> N.empty | Some n -> removeAux n x -let rec removeArrayAux t xs i len = +let rec removeMany0 t xs i len = if i < len then let ele = A.getUnsafe xs i in let u = removeAux t ele in match N.toOpt u with | None -> u - | Some t -> removeArrayAux t xs (i + 1) len + | Some t -> removeMany0 t xs (i + 1) len else N.return t -let removeArray t keys = +let removeMany t keys = let len = A.length keys in match N.toOpt t with | None -> N.empty - | Some t -> removeArrayAux t keys 0 len + | Some t -> removeMany0 t keys 0 len let mergeArray h arr = let len = A.length arr in diff --git a/jscomp/others/bs_MapString.mli b/jscomp/others/bs_MapString.mli index ea689044e7..e2a30c95da 100644 --- a/jscomp/others/bs_MapString.mli +++ b/jscomp/others/bs_MapString.mli @@ -60,7 +60,7 @@ val checkInvariantInternal: _ t -> bool val remove: 'a t -> key -> 'a t (** [remove m x] returns a map containing the same bindings as [m], except for [x] which is unbound in the returned map. *) -val removeArray: 'a t -> key array -> 'a t +val removeMany: 'a t -> key array -> 'a t val set: 'a t -> key -> 'a -> 'a t (** [add m x y] returns a map containing the same bindings as diff --git a/jscomp/others/bs_Set.ml b/jscomp/others/bs_Set.ml index 652b666ba2..60ba7712d4 100644 --- a/jscomp/others/bs_Set.ml +++ b/jscomp/others/bs_Set.ml @@ -160,4 +160,5 @@ let packDictData (type elt) (type id) ~(dict : (elt, id) dict) ~data = let checkInvariantInternal d = N.checkInvariantInternal (S.data d) - +module Int = Bs_SetInt +module String = Bs_SetString diff --git a/jscomp/others/bs_Set.mli b/jscomp/others/bs_Set.mli index e336f387ae..be1ac0a34c 100644 --- a/jscomp/others/bs_Set.mli +++ b/jscomp/others/bs_Set.mli @@ -112,3 +112,5 @@ val getData: ('k,'id) t -> ('k,'id) Bs_SortedSetDict.t val getDict: ('k,'id) t -> ('k,'id) dict val packDictData: dict:('k, 'id) dict -> data:('k, 'id) Bs_SortedSetDict.t -> ('k, 'id) t +module Int = Bs_SetInt +module String = Bs_SetString \ No newline at end of file diff --git a/jscomp/others/bs_SortedMapDict.ml b/jscomp/others/bs_SortedMapDict.ml index 886d486241..e80cb51a73 100644 --- a/jscomp/others/bs_SortedMapDict.ml +++ b/jscomp/others/bs_SortedMapDict.ml @@ -236,13 +236,13 @@ let rec merge s1 s2 f ~cmp = let newRight = (merge ~cmp r1 r2 f) in N.concatOrJoin newLeft v2 newD newRight -let rec removeArrayAux t xs i len ~cmp = +let rec removeMany0 t xs i len ~cmp = if i < len then let ele = A.getUnsafe xs i in let u = removeAux0 t ele ~cmp in match N.toOpt u with | None -> u - | Some t -> removeArrayAux t xs (i + 1) len ~cmp + | Some t -> removeMany0 t xs (i + 1) len ~cmp else N.return t @@ -250,7 +250,7 @@ let removeMany t keys ~cmp = let len = A.length keys in match N.toOpt t with | None -> N.empty - | Some t -> removeArrayAux t keys 0 len ~cmp + | Some t -> removeMany0 t keys 0 len ~cmp diff --git a/jscomp/others/map.cppo.ml b/jscomp/others/map.cppo.ml index 2724ff1abc..f9121dc950 100644 --- a/jscomp/others/map.cppo.ml +++ b/jscomp/others/map.cppo.ml @@ -119,21 +119,21 @@ let remove n x = | None -> N.empty | Some n -> removeAux n x -let rec removeArrayAux t xs i len = +let rec removeMany0 t xs i len = if i < len then let ele = A.getUnsafe xs i in let u = removeAux t ele in match N.toOpt u with | None -> u - | Some t -> removeArrayAux t xs (i + 1) len + | Some t -> removeMany0 t xs (i + 1) len else N.return t -let removeArray t keys = +let removeMany t keys = let len = A.length keys in match N.toOpt t with | None -> N.empty - | Some t -> removeArrayAux t keys 0 len + | Some t -> removeMany0 t keys 0 len let mergeArray h arr = let len = A.length arr in diff --git a/jscomp/others/map.cppo.mli b/jscomp/others/map.cppo.mli index e76c9b75de..e2e28085ae 100644 --- a/jscomp/others/map.cppo.mli +++ b/jscomp/others/map.cppo.mli @@ -64,7 +64,7 @@ val checkInvariantInternal: _ t -> bool val remove: 'a t -> key -> 'a t (** [remove m x] returns a map containing the same bindings as [m], except for [x] which is unbound in the returned map. *) -val removeArray: 'a t -> key array -> 'a t +val removeMany: 'a t -> key array -> 'a t val set: 'a t -> key -> 'a -> 'a t (** [add m x y] returns a map containing the same bindings as diff --git a/jscomp/test/.depend b/jscomp/test/.depend index 02283afbab..502fc746c5 100644 --- a/jscomp/test/.depend +++ b/jscomp/test/.depend @@ -99,9 +99,9 @@ bs_hashtbl_string_test.cmj : ../stdlib/hashtbl.cmj ../others/bs.cmj bs_ignore_effect.cmj : mt.cmj bs_ignore_test.cmj : ../runtime/js.cmj bs_list_test.cmj : mt.cmj ../runtime/js.cmj ../others/bs.cmj -bs_map_int_test.cmj : mt.cmj ../others/bs.cmj -bs_map_test.cmj : mt.cmj ../runtime/js.cmj ../others/bs_Array.cmj \ +bs_map_set_dict_test.cmj : mt.cmj ../runtime/js.cmj ../others/bs_Array.cmj \ ../others/bs.cmj array_data_util.cmj +bs_map_test.cmj : mt.cmj ../others/bs.cmj bs_min_max_test.cmj : ../stdlib/pervasives.cmj mt.cmj bs_mutable_set_test.cmj : mt.cmj ../runtime/js.cmj ../others/bs.cmj \ array_data_util.cmj ../stdlib/array.cmj diff --git a/jscomp/test/Makefile b/jscomp/test/Makefile index 2827f4360e..bd14e0872c 100644 --- a/jscomp/test/Makefile +++ b/jscomp/test/Makefile @@ -212,16 +212,18 @@ OTHERS := test_literals a test_ari test_export2 test_internalOO test_obj_simple_ gpr_2250_test\ gpr_1285_test\ defunctor_make_test\ - bs_map_test\ bs_hashtbl_string_test\ console_log_test\ bs_set_bench\ bs_set_int_test\ - bs_map_int_test\ rbset\ bs_rbset_int_bench\ bs_array_test\ + bs_poly_mutable_set_test\ bs_mutable_set_test\ + bs_poly_map_test\ + bs_map_test\ + bs_map_set_dict_test\ bs_abstract_test\ bs_queue_test\ bs_hashmap_test\ @@ -231,10 +233,8 @@ OTHERS := test_literals a test_ari test_export2 test_internalOO test_obj_simple_ bs_min_max_test\ bs_sort_test\ equal_box_test\ - bs_poly_mutable_set_test\ bs_poly_set_test\ bs_stack_test\ - bs_poly_map_test\ bs_poly_mutable_map_test\ imm_map_bench\ diff --git a/jscomp/test/bs_map_int_test.js b/jscomp/test/bs_map_int_test.js deleted file mode 100644 index 867a718cda..0000000000 --- a/jscomp/test/bs_map_int_test.js +++ /dev/null @@ -1,76 +0,0 @@ -'use strict'; - -var Mt = require("./mt.js"); -var Block = require("../../lib/js/block.js"); -var Bs_Array = require("../../lib/js/bs_Array.js"); -var Bs_MapInt = require("../../lib/js/bs_MapInt.js"); - -var suites = [/* [] */0]; - -var test_id = [0]; - -function eq(loc, x, y) { - test_id[0] = test_id[0] + 1 | 0; - suites[0] = /* :: */[ - /* tuple */[ - loc + (" id " + test_id[0]), - (function () { - return /* Eq */Block.__(0, [ - x, - y - ]); - }) - ], - suites[0] - ]; - return /* () */0; -} - -function b(loc, v) { - test_id[0] = test_id[0] + 1 | 0; - suites[0] = /* :: */[ - /* tuple */[ - loc + (" id " + test_id[0]), - (function () { - return /* Ok */Block.__(4, [v]); - }) - ], - suites[0] - ]; - return /* () */0; -} - -var v = Bs_Array.makeByAndShuffle(1000000, (function (i) { - return /* tuple */[ - i, - i - ]; - })); - -var u = Bs_MapInt.ofArray(v); - -b("File \"bs_map_int_test.ml\", line 20, characters 4-11", Bs_MapInt.checkInvariantInternal(u)); - -var firstHalf = Bs_Array.slice(v, 0, 2000); - -var xx = Bs_Array.reduce(firstHalf, u, (function (acc, param) { - return Bs_MapInt.remove(acc, param[0]); - })); - -b("File \"bs_map_int_test.ml\", line 24, characters 4-11", Bs_MapInt.checkInvariantInternal(u)); - -b("File \"bs_map_int_test.ml\", line 25, characters 4-11", Bs_MapInt.checkInvariantInternal(xx)); - -Mt.from_pair_suites("bs_map_int_test.ml", suites[0]); - -var N = 0; - -var A = 0; - -exports.suites = suites; -exports.test_id = test_id; -exports.eq = eq; -exports.b = b; -exports.N = N; -exports.A = A; -/* v Not a pure module */ diff --git a/jscomp/test/bs_map_int_test.ml b/jscomp/test/bs_map_int_test.ml deleted file mode 100644 index 25198e5e29..0000000000 --- a/jscomp/test/bs_map_int_test.ml +++ /dev/null @@ -1,28 +0,0 @@ -let suites : Mt.pair_suites ref = ref [] -let test_id = ref 0 -let eq loc x y = - incr test_id ; - suites := - (loc ^" id " ^ (string_of_int !test_id), (fun _ -> Mt.Eq(x,y))) :: !suites - -let b loc v = - incr test_id ; - suites := - (loc ^" id " ^ (string_of_int !test_id), - (fun _ -> Mt.Ok v)) :: !suites - -module N = Bs.MapInt -module A = Bs.Array -let () = - let v = - (A.makeByAndShuffle 1_000_000 (fun[@bs] i -> (i,i))) in - let u = N.ofArray v in - b __LOC__ (N.checkInvariantInternal u); - let firstHalf = A.slice v 0 2_000 in - let xx = A.reduce firstHalf u - (fun[@bs] acc (x,_) -> N.remove acc x) in - b __LOC__ (N.checkInvariantInternal u); - b __LOC__ (N.checkInvariantInternal xx); - - -;; Mt.from_pair_suites __FILE__ !suites diff --git a/jscomp/test/bs_map_set_dict_test.js b/jscomp/test/bs_map_set_dict_test.js new file mode 100644 index 0000000000..bed675505a --- /dev/null +++ b/jscomp/test/bs_map_set_dict_test.js @@ -0,0 +1,195 @@ +'use strict'; + +var Mt = require("./mt.js"); +var Bs_Map = require("../../lib/js/bs_Map.js"); +var Bs_List = require("../../lib/js/bs_List.js"); +var Bs_Array = require("../../lib/js/bs_Array.js"); +var Bs_MapInt = require("../../lib/js/bs_MapInt.js"); +var Caml_primitive = require("../../lib/js/caml_primitive.js"); +var Array_data_util = require("./array_data_util.js"); +var Bs_SortedMapDict = require("../../lib/js/bs_SortedMapDict.js"); +var Bs_SortedSetDict = require("../../lib/js/bs_SortedSetDict.js"); + +var suites = [/* [] */0]; + +var test_id = [0]; + +function eq(loc, x, y) { + return Mt.eq_suites(test_id, suites, loc, x, y); +} + +function b(loc, v) { + return Mt.bool_suites(test_id, suites, loc, v); +} + +var Icmp = /* module */[/* cmp */Caml_primitive.caml_int_compare]; + +var Icmp2 = /* module */[/* cmp */Caml_primitive.caml_int_compare]; + +var m0 = { + cmp: Icmp[/* cmp */0], + data: Bs_SortedMapDict.empty +}; + +var I2 = /* module */[/* cmp */(function (x, y) { + return Caml_primitive.caml_int_compare(y, x); + })]; + +var m = { + cmp: Icmp2[/* cmp */0], + data: Bs_SortedMapDict.empty +}; + +var m2 = { + cmp: I2[/* cmp */0], + data: Bs_SortedMapDict.empty +}; + +var data = m.data; + +Bs_Map.getDict(m2); + +var m_dict = Bs_Map.getDict(m); + +for(var i = 0; i <= 100000; ++i){ + data = Bs_SortedMapDict.set(data, i, i, m_dict[/* cmp */0]); +} + +var data$1 = data; + +var newm = { + cmp: m_dict[/* cmp */0], + data: data$1 +}; + +console.log(newm); + +var m11 = Bs_SortedMapDict.set(Bs_SortedMapDict.empty, 1, 1, Icmp[/* cmp */0]); + +console.log(m11); + +var v = { + cmp: Icmp2[/* cmp */0], + data: Bs_SortedSetDict.empty +}; + +var m_dict$1 = Bs_Map.getDict(m); + +var cmp = m_dict$1[/* cmp */0]; + +var data$2 = v.data; + +for(var i$1 = 0; i$1 <= 100000; ++i$1){ + data$2 = Bs_SortedSetDict.add(data$2, i$1, cmp); +} + +console.log(data$2); + +function f(param) { + return Bs_Map.ofArray(param, Icmp); +} + +function $eq$tilde(a, b) { + return (function (param) { + return Bs_Map.eq(a, b, param); + }); +} + +var u0 = f(Bs_Array.map(Array_data_util.randomRange(0, 39), (function (x) { + return /* tuple */[ + x, + x + ]; + }))); + +var u1 = Bs_Map.set(u0, 39, 120); + +b("File \"bs_map_set_dict_test.ml\", line 77, characters 4-11", Bs_Array.every2(Bs_SortedMapDict.toArray(u0.data), Bs_Array.map(Array_data_util.range(0, 39), (function (x) { + return /* tuple */[ + x, + x + ]; + })), (function (param, param$1) { + if (param[0] === param$1[0]) { + return +(param[1] === param$1[1]); + } else { + return /* false */0; + } + }))); + +b("File \"bs_map_set_dict_test.ml\", line 82, characters 4-11", Bs_List.every2(Bs_SortedMapDict.toList(u0.data), Bs_Array.toList(Bs_Array.map(Array_data_util.range(0, 39), (function (x) { + return /* tuple */[ + x, + x + ]; + }))), (function (param, param$1) { + if (param[0] === param$1[0]) { + return +(param[1] === param$1[1]); + } else { + return /* false */0; + } + }))); + +eq("File \"bs_map_set_dict_test.ml\", line 87, characters 5-12", Bs_Map.get(u0, 39), /* Some */[39]); + +eq("File \"bs_map_set_dict_test.ml\", line 88, characters 5-12", Bs_Map.get(u1, 39), /* Some */[120]); + +var u = f(Bs_Array.makeByAndShuffle(10000, (function (x) { + return /* tuple */[ + x, + x + ]; + }))); + +eq("File \"bs_map_set_dict_test.ml\", line 94, characters 4-11", Bs_Array.makeBy(10000, (function (x) { + return /* tuple */[ + x, + x + ]; + })), Bs_SortedMapDict.toArray(u.data)); + +Mt.from_pair_suites("bs_map_set_dict_test.ml", suites[0]); + +var M = 0; + +var MI = 0; + +var I = 0; + +var A = 0; + +var L = 0; + +var vv = Bs_MapInt.empty; + +var vv2 = Bs_MapInt.empty; + +var Md0 = 0; + +var ISet = 0; + +var S0 = 0; + +exports.suites = suites; +exports.test_id = test_id; +exports.eq = eq; +exports.b = b; +exports.Icmp = Icmp; +exports.Icmp2 = Icmp2; +exports.M = M; +exports.MI = MI; +exports.I = I; +exports.A = A; +exports.L = L; +exports.m0 = m0; +exports.I2 = I2; +exports.m = m; +exports.m2 = m2; +exports.vv = vv; +exports.vv2 = vv2; +exports.Md0 = Md0; +exports.ISet = ISet; +exports.S0 = S0; +exports.f = f; +exports.$eq$tilde = $eq$tilde; +/* data Not a pure module */ diff --git a/jscomp/test/bs_map_set_dict_test.ml b/jscomp/test/bs_map_set_dict_test.ml new file mode 100644 index 0000000000..8d818f79be --- /dev/null +++ b/jscomp/test/bs_map_set_dict_test.ml @@ -0,0 +1,99 @@ +let suites : Mt.pair_suites ref = ref [] +let test_id = ref 0 +let eq loc x y = Mt.eq_suites ~suites ~test_id loc x y +let b loc v = Mt.bool_suites ~suites ~test_id loc v + +module Icmp = + (val Bs.Cmp.make + (fun[@bs] (x : int) y -> + compare x y + ) + ) +module Icmp2 = +(val Bs.Cmp.make ~cmp:(fun [@bs] (x : int) y -> + compare x y )) + +module M = Bs.Map +module MI = Bs.MapInt +(* module B = Bs.Bag *) +module I = Array_data_util +module A = Bs_Array +module L = Bs.List +let m0 : (_,string,_) M.t = M.empty (module Icmp) + + +module I2 = +(val Bs.Cmp.make ~cmp:(fun [@bs] (x : int) y -> compare y x )) + + +let m = M.empty (module Icmp2) +let m2 : (int, string, _) M.t = M.empty (module I2) +let vv = MI.empty +let vv2 = MI.empty +module Md0 = Bs.MapDict +let () = + let count = 1_000_00 in + let data = ref (M.getData m) in + let m2_dict, m_dict = M.(getDict m2, getDict m) in + let module N = (val m2_dict) in + let module Mm = ( val m_dict) in + for i = 0 to count do + data := + Md0.set !data + ~cmp: Mm.cmp + i i + done ; + let newm = M.packDictData ~data:!data ~dict:m_dict in + Js.log newm +module ISet = Bs.Set +let () = + let m = Md0.empty in + let m11 = + Md0.set ~cmp:Icmp.cmp m + 1 1 + in + let _m20 = M.empty (module Icmp) in + Js.log m11 + +module S0 = Bs.SetDict +let () = + let count = 100_000 in + let v = ISet.empty (module Icmp2) in + let m_dict = M.getDict m in + let module M = (val m_dict) in + let cmp = M.cmp in + let data = ref (ISet.getData v) in + for i = 0 to count do + data := S0.add ~cmp !data i + done ; + Js.log !data + +let f = M.ofArray ~dict:(module Icmp) +let (=~) a b = M.eq a b + +let () = + let u0 = f (A.map (I.randomRange 0 39) (fun[@bs] x -> (x,x))) in + let u1 = M.set u0 39 120 in + b __LOC__ + (A.every2 (M.toArray u0) + (A.map (I.range 0 39) (fun [@bs] x -> (x,x))) + (fun[@bs] (x0,x1) (y0,y1) -> x0 = y0 && x1 = y1)); + + b __LOC__ + (L.every2 + (M.toList u0) + (A.toList (A.map (I.range 0 39) (fun [@bs] x -> (x,x)))) + (fun[@bs] (x0,x1) (y0,y1) -> x0 = y0 && x1 = y1)); + eq __LOC__ (M.get u0 39) (Some 39); + eq __LOC__ (M.get u1 39) (Some 120) + + +let () = + let u = f + ((A.makeByAndShuffle 10_000 (fun[@bs] x -> (x,x)))) in + eq __LOC__ + (A.makeBy 10_000 (fun[@bs] x -> (x,x))) + (M.toArray u) + + +;; Mt.from_pair_suites __FILE__ !suites diff --git a/jscomp/test/bs_map_test.js b/jscomp/test/bs_map_test.js index 4a13cbe71d..8980f0bb3d 100644 --- a/jscomp/test/bs_map_test.js +++ b/jscomp/test/bs_map_test.js @@ -1,195 +1,91 @@ 'use strict'; var Mt = require("./mt.js"); -var Bs_Map = require("../../lib/js/bs_Map.js"); -var Bs_List = require("../../lib/js/bs_List.js"); +var Block = require("../../lib/js/block.js"); var Bs_Array = require("../../lib/js/bs_Array.js"); var Bs_MapInt = require("../../lib/js/bs_MapInt.js"); -var Caml_primitive = require("../../lib/js/caml_primitive.js"); -var Array_data_util = require("./array_data_util.js"); -var Bs_SortedMapDict = require("../../lib/js/bs_SortedMapDict.js"); -var Bs_SortedSetDict = require("../../lib/js/bs_SortedSetDict.js"); +var Bs_SetInt = require("../../lib/js/bs_SetInt.js"); var suites = [/* [] */0]; var test_id = [0]; function eq(loc, x, y) { - return Mt.eq_suites(test_id, suites, loc, x, y); + test_id[0] = test_id[0] + 1 | 0; + suites[0] = /* :: */[ + /* tuple */[ + loc + (" id " + test_id[0]), + (function () { + return /* Eq */Block.__(0, [ + x, + y + ]); + }) + ], + suites[0] + ]; + return /* () */0; } function b(loc, v) { - return Mt.bool_suites(test_id, suites, loc, v); + test_id[0] = test_id[0] + 1 | 0; + suites[0] = /* :: */[ + /* tuple */[ + loc + (" id " + test_id[0]), + (function () { + return /* Ok */Block.__(4, [v]); + }) + ], + suites[0] + ]; + return /* () */0; } -var Icmp = /* module */[/* cmp */Caml_primitive.caml_int_compare]; - -var Icmp2 = /* module */[/* cmp */Caml_primitive.caml_int_compare]; - -var m0 = { - cmp: Icmp[/* cmp */0], - data: Bs_SortedMapDict.empty -}; - -var I2 = /* module */[/* cmp */(function (x, y) { - return Caml_primitive.caml_int_compare(y, x); - })]; - -var m = { - cmp: Icmp2[/* cmp */0], - data: Bs_SortedMapDict.empty -}; - -var m2 = { - cmp: I2[/* cmp */0], - data: Bs_SortedMapDict.empty -}; - -var data = m.data; - -Bs_Map.getDict(m2); +var mapOfArray = Bs_MapInt.ofArray; -var m_dict = Bs_Map.getDict(m); +var setOfArray = Bs_SetInt.ofArray; -for(var i = 0; i <= 100000; ++i){ - data = Bs_SortedMapDict.set(data, i, i, m_dict[/* cmp */0]); +function emptyMap() { + return Bs_MapInt.empty; } -var data$1 = data; +var v = Bs_Array.makeByAndShuffle(1000000, (function (i) { + return /* tuple */[ + i, + i + ]; + })); -var newm = { - cmp: m_dict[/* cmp */0], - data: data$1 -}; +var u = Bs_MapInt.ofArray(v); -console.log(newm); +b("File \"bs_map_test.ml\", line 27, characters 4-11", Bs_MapInt.checkInvariantInternal(u)); -var m11 = Bs_SortedMapDict.set(Bs_SortedMapDict.empty, 1, 1, Icmp[/* cmp */0]); +var firstHalf = Bs_Array.slice(v, 0, 2000); -console.log(m11); +var xx = Bs_Array.reduce(firstHalf, u, (function (acc, param) { + return Bs_MapInt.remove(acc, param[0]); + })); -var v = { - cmp: Icmp2[/* cmp */0], - data: Bs_SortedSetDict.empty -}; +b("File \"bs_map_test.ml\", line 31, characters 4-11", Bs_MapInt.checkInvariantInternal(u)); -var m_dict$1 = Bs_Map.getDict(m); - -var cmp = m_dict$1[/* cmp */0]; - -var data$2 = v.data; - -for(var i$1 = 0; i$1 <= 100000; ++i$1){ - data$2 = Bs_SortedSetDict.add(data$2, i$1, cmp); -} - -console.log(data$2); - -function f(param) { - return Bs_Map.ofArray(param, Icmp); -} - -function $eq$tilde(a, b) { - return (function (param) { - return Bs_Map.eq(a, b, param); - }); -} - -var u0 = f(Bs_Array.map(Array_data_util.randomRange(0, 39), (function (x) { - return /* tuple */[ - x, - x - ]; - }))); - -var u1 = Bs_Map.set(u0, 39, 120); - -b("File \"bs_map_test.ml\", line 77, characters 4-11", Bs_Array.every2(Bs_SortedMapDict.toArray(u0.data), Bs_Array.map(Array_data_util.range(0, 39), (function (x) { - return /* tuple */[ - x, - x - ]; - })), (function (param, param$1) { - if (param[0] === param$1[0]) { - return +(param[1] === param$1[1]); - } else { - return /* false */0; - } - }))); - -b("File \"bs_map_test.ml\", line 82, characters 4-11", Bs_List.every2(Bs_SortedMapDict.toList(u0.data), Bs_Array.toList(Bs_Array.map(Array_data_util.range(0, 39), (function (x) { - return /* tuple */[ - x, - x - ]; - }))), (function (param, param$1) { - if (param[0] === param$1[0]) { - return +(param[1] === param$1[1]); - } else { - return /* false */0; - } - }))); - -eq("File \"bs_map_test.ml\", line 87, characters 5-12", Bs_Map.get(u0, 39), /* Some */[39]); - -eq("File \"bs_map_test.ml\", line 88, characters 5-12", Bs_Map.get(u1, 39), /* Some */[120]); - -var u = f(Bs_Array.makeByAndShuffle(10000, (function (x) { - return /* tuple */[ - x, - x - ]; - }))); - -eq("File \"bs_map_test.ml\", line 94, characters 4-11", Bs_Array.makeBy(10000, (function (x) { - return /* tuple */[ - x, - x - ]; - })), Bs_SortedMapDict.toArray(u.data)); +b("File \"bs_map_test.ml\", line 32, characters 4-11", Bs_MapInt.checkInvariantInternal(xx)); Mt.from_pair_suites("bs_map_test.ml", suites[0]); var M = 0; -var MI = 0; - -var I = 0; +var N = 0; var A = 0; -var L = 0; - -var vv = Bs_MapInt.empty; - -var vv2 = Bs_MapInt.empty; - -var Md0 = 0; - -var ISet = 0; - -var S0 = 0; - exports.suites = suites; exports.test_id = test_id; exports.eq = eq; exports.b = b; -exports.Icmp = Icmp; -exports.Icmp2 = Icmp2; exports.M = M; -exports.MI = MI; -exports.I = I; +exports.N = N; exports.A = A; -exports.L = L; -exports.m0 = m0; -exports.I2 = I2; -exports.m = m; -exports.m2 = m2; -exports.vv = vv; -exports.vv2 = vv2; -exports.Md0 = Md0; -exports.ISet = ISet; -exports.S0 = S0; -exports.f = f; -exports.$eq$tilde = $eq$tilde; -/* data Not a pure module */ +exports.mapOfArray = mapOfArray; +exports.setOfArray = setOfArray; +exports.emptyMap = emptyMap; +/* v Not a pure module */ diff --git a/jscomp/test/bs_map_test.ml b/jscomp/test/bs_map_test.ml index 8d818f79be..ab0a28e5ed 100644 --- a/jscomp/test/bs_map_test.ml +++ b/jscomp/test/bs_map_test.ml @@ -1,99 +1,35 @@ let suites : Mt.pair_suites ref = ref [] let test_id = ref 0 -let eq loc x y = Mt.eq_suites ~suites ~test_id loc x y -let b loc v = Mt.bool_suites ~suites ~test_id loc v +let eq loc x y = + incr test_id ; + suites := + (loc ^" id " ^ (string_of_int !test_id), (fun _ -> Mt.Eq(x,y))) :: !suites -module Icmp = - (val Bs.Cmp.make - (fun[@bs] (x : int) y -> - compare x y - ) - ) -module Icmp2 = -(val Bs.Cmp.make ~cmp:(fun [@bs] (x : int) y -> - compare x y )) - -module M = Bs.Map -module MI = Bs.MapInt -(* module B = Bs.Bag *) -module I = Array_data_util -module A = Bs_Array -module L = Bs.List -let m0 : (_,string,_) M.t = M.empty (module Icmp) +let b loc v = + incr test_id ; + suites := + (loc ^" id " ^ (string_of_int !test_id), + (fun _ -> Mt.Ok v)) :: !suites - -module I2 = -(val Bs.Cmp.make ~cmp:(fun [@bs] (x : int) y -> compare y x )) +module M = Bs.Map.Int +module N = Bs.Set.Int +module A = Bs.Array - -let m = M.empty (module Icmp2) -let m2 : (int, string, _) M.t = M.empty (module I2) -let vv = MI.empty -let vv2 = MI.empty -module Md0 = Bs.MapDict -let () = - let count = 1_000_00 in - let data = ref (M.getData m) in - let m2_dict, m_dict = M.(getDict m2, getDict m) in - let module N = (val m2_dict) in - let module Mm = ( val m_dict) in - for i = 0 to count do - data := - Md0.set !data - ~cmp: Mm.cmp - i i - done ; - let newm = M.packDictData ~data:!data ~dict:m_dict in - Js.log newm -module ISet = Bs.Set -let () = - let m = Md0.empty in - let m11 = - Md0.set ~cmp:Icmp.cmp m - 1 1 - in - let _m20 = M.empty (module Icmp) in - Js.log m11 - -module S0 = Bs.SetDict -let () = - let count = 100_000 in - let v = ISet.empty (module Icmp2) in - let m_dict = M.getDict m in - let module M = (val m_dict) in - let cmp = M.cmp in - let data = ref (ISet.getData v) in - for i = 0 to count do - data := S0.add ~cmp !data i - done ; - Js.log !data - -let f = M.ofArray ~dict:(module Icmp) -let (=~) a b = M.eq a b - -let () = - let u0 = f (A.map (I.randomRange 0 39) (fun[@bs] x -> (x,x))) in - let u1 = M.set u0 39 120 in - b __LOC__ - (A.every2 (M.toArray u0) - (A.map (I.range 0 39) (fun [@bs] x -> (x,x))) - (fun[@bs] (x0,x1) (y0,y1) -> x0 = y0 && x1 = y1)); - - b __LOC__ - (L.every2 - (M.toList u0) - (A.toList (A.map (I.range 0 39) (fun [@bs] x -> (x,x)))) - (fun[@bs] (x0,x1) (y0,y1) -> x0 = y0 && x1 = y1)); - eq __LOC__ (M.get u0 39) (Some 39); - eq __LOC__ (M.get u1 39) (Some 120) +let mapOfArray x = M.ofArray x +let setOfArray x = N.ofArray x +let emptyMap () = M.empty -let () = - let u = f - ((A.makeByAndShuffle 10_000 (fun[@bs] x -> (x,x)))) in - eq __LOC__ - (A.makeBy 10_000 (fun[@bs] x -> (x,x))) - (M.toArray u) - - -;; Mt.from_pair_suites __FILE__ !suites +let () = + let v = + (A.makeByAndShuffle 1_000_000 (fun[@bs] i -> (i,i))) in + let u = M.ofArray v in + b __LOC__ (M.checkInvariantInternal u); + let firstHalf = A.slice v 0 2_000 in + let xx = A.reduce firstHalf u + (fun[@bs] acc (x,_) -> M.remove acc x) in + b __LOC__ (M.checkInvariantInternal u); + b __LOC__ (M.checkInvariantInternal xx); + + +;; Mt.from_pair_suites __FILE__ !suites diff --git a/jscomp/test/bs_mutable_set_test.js b/jscomp/test/bs_mutable_set_test.js index ccf7d8e2a9..ac3cac0622 100644 --- a/jscomp/test/bs_mutable_set_test.js +++ b/jscomp/test/bs_mutable_set_test.js @@ -1,6 +1,7 @@ 'use strict'; var Mt = require("./mt.js"); +var Bs_List = require("../../lib/js/bs_List.js"); var Bs_Array = require("../../lib/js/bs_Array.js"); var Bs_Range = require("../../lib/js/bs_Range.js"); var Bs_SetIntM = require("../../lib/js/bs_SetIntM.js"); @@ -21,87 +22,483 @@ function b(loc, x) { return Mt.bool_suites(test_id, suites, loc, x); } +var xs = Array_data_util.range(0, 30); + +var u = { + data: Bs_internalSetInt.ofArray(xs) +}; + +b("File \"bs_mutable_set_test.ml\", line 20, characters 4-11", Bs_SetIntM.removeCheck(u, 0)); + +b("File \"bs_mutable_set_test.ml\", line 21, characters 4-11", 1 - Bs_SetIntM.removeCheck(u, 0)); + +b("File \"bs_mutable_set_test.ml\", line 22, characters 4-11", Bs_SetIntM.removeCheck(u, 30)); + +b("File \"bs_mutable_set_test.ml\", line 23, characters 4-11", Bs_SetIntM.removeCheck(u, 20)); + +eq("File \"bs_mutable_set_test.ml\", line 24, characters 5-12", Bs_internalAVLset.size(u.data), 28); + +var r = Array_data_util.randomRange(0, 30); + +b("File \"bs_mutable_set_test.ml\", line 26, characters 4-11", +(29 === Bs_internalAVLset.maxUndefined(u.data))); + +b("File \"bs_mutable_set_test.ml\", line 27, characters 4-11", +(1 === Bs_internalAVLset.minUndefined(u.data))); + +Bs_SetIntM.add(u, 3); + +for(var i = 0 ,i_finish = r.length - 1 | 0; i <= i_finish; ++i){ + Bs_SetIntM.remove(u, r[i]); +} + +b("File \"bs_mutable_set_test.ml\", line 32, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); + +Bs_SetIntM.add(u, 0); + +Bs_SetIntM.add(u, 1); + +Bs_SetIntM.add(u, 2); + +Bs_SetIntM.add(u, 0); + +eq("File \"bs_mutable_set_test.ml\", line 37, characters 5-12", Bs_internalAVLset.size(u.data), 3); + +b("File \"bs_mutable_set_test.ml\", line 38, characters 4-11", 1 - Bs_internalAVLset.isEmpty(u.data)); + +for(var i$1 = 0; i$1 <= 3; ++i$1){ + Bs_SetIntM.remove(u, i$1); +} + +b("File \"bs_mutable_set_test.ml\", line 42, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); + +Bs_SetIntM.mergeMany(u, Array_data_util.randomRange(0, 20000)); + +Bs_SetIntM.mergeMany(u, Array_data_util.randomRange(0, 200)); + +eq("File \"bs_mutable_set_test.ml\", line 45, characters 5-12", Bs_internalAVLset.size(u.data), 20001); + +Bs_SetIntM.removeMany(u, Array_data_util.randomRange(0, 200)); + +eq("File \"bs_mutable_set_test.ml\", line 47, characters 5-12", Bs_internalAVLset.size(u.data), 19800); + +Bs_SetIntM.removeMany(u, Array_data_util.randomRange(0, 1000)); + +eq("File \"bs_mutable_set_test.ml\", line 49, characters 5-12", Bs_internalAVLset.size(u.data), 19000); + +Bs_SetIntM.removeMany(u, Array_data_util.randomRange(0, 1000)); + +eq("File \"bs_mutable_set_test.ml\", line 51, characters 5-12", Bs_internalAVLset.size(u.data), 19000); + +Bs_SetIntM.removeMany(u, Array_data_util.randomRange(1000, 10000)); + +eq("File \"bs_mutable_set_test.ml\", line 53, characters 5-12", Bs_internalAVLset.size(u.data), 10000); + +Bs_SetIntM.removeMany(u, Array_data_util.randomRange(10000, 19999)); + +eq("File \"bs_mutable_set_test.ml\", line 55, characters 5-12", Bs_internalAVLset.size(u.data), 1); + +b("File \"bs_mutable_set_test.ml\", line 56, characters 4-11", Bs_internalSetInt.has(u.data, 20000)); + +Bs_SetIntM.removeMany(u, Array_data_util.randomRange(10000, 30000)); + +b("File \"bs_mutable_set_test.ml\", line 58, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); + +var xs$1 = Array_data_util.randomRange(1000, 2000); + var v = { + data: Bs_internalSetInt.ofArray(xs$1) +}; + +var bs = Bs_Array.map(Array_data_util.randomRange(500, 1499), (function (x) { + return Bs_SetIntM.removeCheck(v, x); + })); + +var indeedRemoved = Bs_Array.reduce(bs, 0, (function (acc, x) { + if (x) { + return acc + 1 | 0; + } else { + return acc; + } + })); + +eq("File \"bs_mutable_set_test.ml\", line 65, characters 5-12", indeedRemoved, 500); + +eq("File \"bs_mutable_set_test.ml\", line 66, characters 5-12", Bs_internalAVLset.size(v.data), 501); + +var cs = Bs_Array.map(Array_data_util.randomRange(500, 2000), (function (x) { + return Bs_SetIntM.addCheck(v, x); + })); + +var indeedAded = Bs_Array.reduce(cs, 0, (function (acc, x) { + if (x) { + return acc + 1 | 0; + } else { + return acc; + } + })); + +eq("File \"bs_mutable_set_test.ml\", line 69, characters 5-12", indeedAded, 1000); + +eq("File \"bs_mutable_set_test.ml\", line 70, characters 5-12", Bs_internalAVLset.size(v.data), 1501); + +var d = { data: Bs_internalAVLset.empty }; -for(var i = 0; i <= 100000; ++i){ - Bs_SetIntM.add(v, i); -} +b("File \"bs_mutable_set_test.ml\", line 71, characters 4-11", Bs_internalAVLset.isEmpty(d.data)); + +eq("File \"bs_mutable_set_test.ml\", line 72, characters 5-12", Bs_internalAVLset.minimum(v.data), /* Some */[500]); + +eq("File \"bs_mutable_set_test.ml\", line 73, characters 5-12", Bs_internalAVLset.maximum(v.data), /* Some */[2000]); + +eq("File \"bs_mutable_set_test.ml\", line 74, characters 5-12", Bs_internalAVLset.minUndefined(v.data), 500); -b("File \"bs_mutable_set_test.ml\", line 19, characters 4-11", Bs_internalAVLset.checkInvariantInternal(v.data)); +eq("File \"bs_mutable_set_test.ml\", line 75, characters 5-12", Bs_internalAVLset.maxUndefined(v.data), 2000); -b("File \"bs_mutable_set_test.ml\", line 20, characters 4-11", Bs_Range.every(0, 100000, (function (i) { - return Bs_internalSetInt.has(v.data, i); +eq("File \"bs_mutable_set_test.ml\", line 76, characters 5-12", Bs_SetIntM.reduce(v, 0, (function (x, y) { + return x + y | 0; + })), 1876250); + +b("File \"bs_mutable_set_test.ml\", line 77, characters 4-11", Bs_List.eq(Bs_internalAVLset.toList(v.data), Bs_List.makeBy(1501, (function (i) { + return i + 500 | 0; + })), (function (x, y) { + return +(x === y); + }))); + +eq("File \"bs_mutable_set_test.ml\", line 78, characters 5-12", Bs_internalAVLset.toArray(v.data), Array_data_util.range(500, 2000)); + +b("File \"bs_mutable_set_test.ml\", line 79, characters 4-11", Bs_internalAVLset.checkInvariantInternal(v.data)); + +eq("File \"bs_mutable_set_test.ml\", line 80, characters 5-12", Bs_internalSetInt.get(v.data, 3), /* None */0); + +eq("File \"bs_mutable_set_test.ml\", line 81, characters 5-12", Bs_internalSetInt.get(v.data, 1200), /* Some */[1200]); + +var match = Bs_SetIntM.split(v, 1000); + +var match$1 = match[0]; + +var bb = match$1[1]; + +var aa = match$1[0]; + +b("File \"bs_mutable_set_test.ml\", line 83, characters 4-11", match[1]); + +b("File \"bs_mutable_set_test.ml\", line 84, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(aa.data), Array_data_util.range(500, 999), (function (x, y) { + return +(x === y); }))); -eq("File \"bs_mutable_set_test.ml\", line 23, characters 5-12", Bs_internalAVLset.size(v.data), 100001); +b("File \"bs_mutable_set_test.ml\", line 85, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(bb.data), Array_data_util.range(1001, 2000), (function (x, y) { + return +(x === y); + }))); + +b("File \"bs_mutable_set_test.ml\", line 86, characters 5-12", Bs_SetIntM.subset(aa, v)); + +b("File \"bs_mutable_set_test.ml\", line 87, characters 4-11", Bs_SetIntM.subset(bb, v)); + +var d$1 = Bs_SetIntM.intersect(aa, bb); + +b("File \"bs_mutable_set_test.ml\", line 88, characters 4-11", Bs_internalAVLset.isEmpty(d$1.data)); + +var c = Bs_SetIntM.removeCheck(v, 1000); + +b("File \"bs_mutable_set_test.ml\", line 90, characters 4-11", c); + +var match$2 = Bs_SetIntM.split(v, 1000); + +var match$3 = match$2[0]; + +var bb$1 = match$3[1]; + +var aa$1 = match$3[0]; + +b("File \"bs_mutable_set_test.ml\", line 92, characters 4-11", 1 - match$2[1]); + +b("File \"bs_mutable_set_test.ml\", line 93, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(aa$1.data), Array_data_util.range(500, 999), (function (x, y) { + return +(x === y); + }))); + +b("File \"bs_mutable_set_test.ml\", line 94, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(bb$1.data), Array_data_util.range(1001, 2000), (function (x, y) { + return +(x === y); + }))); + +b("File \"bs_mutable_set_test.ml\", line 95, characters 5-12", Bs_SetIntM.subset(aa$1, v)); + +b("File \"bs_mutable_set_test.ml\", line 96, characters 4-11", Bs_SetIntM.subset(bb$1, v)); + +var d$2 = Bs_SetIntM.intersect(aa$1, bb$1); + +b("File \"bs_mutable_set_test.ml\", line 97, characters 4-11", Bs_internalAVLset.isEmpty(d$2.data)); + +var xs$2 = Array_data_util.randomRange(0, 100); + +var aa$2 = { + data: Bs_internalSetInt.ofArray(xs$2) +}; + +var xs$3 = Array_data_util.randomRange(40, 120); + +var bb$2 = { + data: Bs_internalSetInt.ofArray(xs$3) +}; + +var cc = Bs_SetIntM.union(aa$2, bb$2); + +var xs$4 = Array_data_util.randomRange(0, 120); + +b("File \"bs_mutable_set_test.ml\", line 106, characters 4-11", Bs_SetIntM.eq(cc, { + data: Bs_internalSetInt.ofArray(xs$4) + })); + +var xs$5 = Array_data_util.randomRange(0, 20); + +var xs$6 = Array_data_util.randomRange(21, 40); + +var xs$7 = Array_data_util.randomRange(0, 40); + +b("File \"bs_mutable_set_test.ml\", line 108, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.union({ + data: Bs_internalSetInt.ofArray(xs$5) + }, { + data: Bs_internalSetInt.ofArray(xs$6) + }), { + data: Bs_internalSetInt.ofArray(xs$7) + })); + +var dd = Bs_SetIntM.intersect(aa$2, bb$2); + +var xs$8 = Array_data_util.randomRange(40, 100); + +b("File \"bs_mutable_set_test.ml\", line 113, characters 4-11", Bs_SetIntM.eq(dd, { + data: Bs_internalSetInt.ofArray(xs$8) + })); + +var xs$9 = Array_data_util.randomRange(0, 20); + +var xs$10 = Array_data_util.randomRange(21, 40); + +b("File \"bs_mutable_set_test.ml\", line 114, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.intersect({ + data: Bs_internalSetInt.ofArray(xs$9) + }, { + data: Bs_internalSetInt.ofArray(xs$10) + }), { + data: Bs_internalAVLset.empty + })); + +var xs$11 = Array_data_util.randomRange(21, 40); + +var xs$12 = Array_data_util.randomRange(0, 20); + +b("File \"bs_mutable_set_test.ml\", line 120, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.intersect({ + data: Bs_internalSetInt.ofArray(xs$11) + }, { + data: Bs_internalSetInt.ofArray(xs$12) + }), { + data: Bs_internalAVLset.empty + })); + +b("File \"bs_mutable_set_test.ml\", line 126, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.intersect({ + data: Bs_internalSetInt.ofArray(/* array */[ + 1, + 3, + 4, + 5, + 7, + 9 + ]) + }, { + data: Bs_internalSetInt.ofArray(/* array */[ + 2, + 4, + 5, + 6, + 8, + 10 + ]) + }), { + data: Bs_internalSetInt.ofArray(/* int array */[ + 4, + 5 + ]) + })); + +var xs$13 = Array_data_util.randomRange(0, 39); + +b("File \"bs_mutable_set_test.ml\", line 132, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff(aa$2, bb$2), { + data: Bs_internalSetInt.ofArray(xs$13) + })); + +var xs$14 = Array_data_util.randomRange(101, 120); + +b("File \"bs_mutable_set_test.ml\", line 134, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff(bb$2, aa$2), { + data: Bs_internalSetInt.ofArray(xs$14) + })); + +var xs$15 = Array_data_util.randomRange(21, 40); + +var xs$16 = Array_data_util.randomRange(0, 20); + +var xs$17 = Array_data_util.randomRange(21, 40); -var u = Bs_Array.concat(Array_data_util.randomRange(30, 100), Array_data_util.randomRange(40, 120)); +b("File \"bs_mutable_set_test.ml\", line 136, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff({ + data: Bs_internalSetInt.ofArray(xs$15) + }, { + data: Bs_internalSetInt.ofArray(xs$16) + }), { + data: Bs_internalSetInt.ofArray(xs$17) + })); + +var xs$18 = Array_data_util.randomRange(0, 20); + +var xs$19 = Array_data_util.randomRange(21, 40); + +var xs$20 = Array_data_util.randomRange(0, 20); + +b("File \"bs_mutable_set_test.ml\", line 142, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff({ + data: Bs_internalSetInt.ofArray(xs$18) + }, { + data: Bs_internalSetInt.ofArray(xs$19) + }), { + data: Bs_internalSetInt.ofArray(xs$20) + })); + +var xs$21 = Array_data_util.randomRange(0, 20); + +var xs$22 = Array_data_util.randomRange(0, 40); + +var xs$23 = Array_data_util.randomRange(0, -1); + +b("File \"bs_mutable_set_test.ml\", line 149, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff({ + data: Bs_internalSetInt.ofArray(xs$21) + }, { + data: Bs_internalSetInt.ofArray(xs$22) + }), { + data: Bs_internalSetInt.ofArray(xs$23) + })); + +var xs$24 = Array_data_util.randomRange(0, 1000); + +var a0 = { + data: Bs_internalSetInt.ofArray(xs$24) +}; + +var a1 = Bs_SetIntM.keepBy(a0, (function (x) { + return +(x % 2 === 0); + })); + +var a2 = Bs_SetIntM.keepBy(a0, (function (x) { + return +(x % 2 !== 0); + })); + +var match$4 = Bs_SetIntM.partition(a0, (function (x) { + return +(x % 2 === 0); + })); + +var a4 = match$4[1]; + +var a3 = match$4[0]; + +b("File \"bs_mutable_set_test.ml\", line 164, characters 4-11", Bs_SetIntM.eq(a1, a3)); + +b("File \"bs_mutable_set_test.ml\", line 165, characters 4-11", Bs_SetIntM.eq(a2, a4)); + +b("File \"bs_mutable_set_test.ml\", line 166, characters 4-11", Bs_List.every(/* :: */[ + a0, + /* :: */[ + a1, + /* :: */[ + a2, + /* :: */[ + a3, + /* :: */[ + a4, + /* [] */0 + ] + ] + ] + ] + ], (function (x) { + return Bs_internalAVLset.checkInvariantInternal(x.data); + }))); var v$1 = { data: Bs_internalAVLset.empty }; -Bs_SetIntM.mergeMany(v$1, u); +for(var i$2 = 0; i$2 <= 100000; ++i$2){ + Bs_SetIntM.add(v$1, i$2); +} + +b("File \"bs_mutable_set_test.ml\", line 177, characters 4-11", Bs_internalAVLset.checkInvariantInternal(v$1.data)); -eq("File \"bs_mutable_set_test.ml\", line 29, characters 5-12", Bs_internalAVLset.size(v$1.data), 91); +b("File \"bs_mutable_set_test.ml\", line 178, characters 4-11", Bs_Range.every(0, 100000, (function (i) { + return Bs_internalSetInt.has(v$1.data, i); + }))); -eq("File \"bs_mutable_set_test.ml\", line 30, characters 5-12", Bs_internalAVLset.toArray(v$1.data), Array_data_util.range(30, 120)); +eq("File \"bs_mutable_set_test.ml\", line 181, characters 5-12", Bs_internalAVLset.size(v$1.data), 100001); -var u$1 = Bs_Array.concat(Array_data_util.randomRange(0, 100000), Array_data_util.randomRange(0, 100)); +var u$1 = Bs_Array.concat(Array_data_util.randomRange(30, 100), Array_data_util.randomRange(40, 120)); var v$2 = { - data: Bs_internalSetInt.ofArray(u$1) + data: Bs_internalAVLset.empty }; -eq("File \"bs_mutable_set_test.ml\", line 35, characters 5-12", Bs_internalAVLset.size(v$2.data), 100001); +Bs_SetIntM.mergeMany(v$2, u$1); + +eq("File \"bs_mutable_set_test.ml\", line 187, characters 5-12", Bs_internalAVLset.size(v$2.data), 91); + +eq("File \"bs_mutable_set_test.ml\", line 188, characters 5-12", Bs_internalAVLset.toArray(v$2.data), Array_data_util.range(30, 120)); + +var u$2 = Bs_Array.concat(Array_data_util.randomRange(0, 100000), Array_data_util.randomRange(0, 100)); + +var v$3 = { + data: Bs_internalSetInt.ofArray(u$2) +}; -var u$2 = Array_data_util.randomRange(50000, 80000); +eq("File \"bs_mutable_set_test.ml\", line 193, characters 5-12", Bs_internalAVLset.size(v$3.data), 100001); -for(var i$1 = 0 ,i_finish = u$2.length - 1 | 0; i$1 <= i_finish; ++i$1){ - Bs_SetIntM.remove(v$2, i$1); +var u$3 = Array_data_util.randomRange(50000, 80000); + +for(var i$3 = 0 ,i_finish$1 = u$3.length - 1 | 0; i$3 <= i_finish$1; ++i$3){ + Bs_SetIntM.remove(v$3, i$3); } -eq("File \"bs_mutable_set_test.ml\", line 42, characters 5-12", Bs_internalAVLset.size(v$2.data), 70000); +eq("File \"bs_mutable_set_test.ml\", line 200, characters 5-12", Bs_internalAVLset.size(v$3.data), 70000); var vv = Array_data_util.randomRange(0, 100000); -for(var i$2 = 0 ,i_finish$1 = vv.length - 1 | 0; i$2 <= i_finish$1; ++i$2){ - Bs_SetIntM.remove(v$2, Caml_array.caml_array_get(vv, i$2)); +for(var i$4 = 0 ,i_finish$2 = vv.length - 1 | 0; i$4 <= i_finish$2; ++i$4){ + Bs_SetIntM.remove(v$3, Caml_array.caml_array_get(vv, i$4)); } -eq("File \"bs_mutable_set_test.ml\", line 48, characters 5-12", Bs_internalAVLset.size(v$2.data), 0); +eq("File \"bs_mutable_set_test.ml\", line 206, characters 5-12", Bs_internalAVLset.size(v$3.data), 0); -b("File \"bs_mutable_set_test.ml\", line 49, characters 4-11", Bs_internalAVLset.isEmpty(v$2.data)); +b("File \"bs_mutable_set_test.ml\", line 207, characters 4-11", Bs_internalAVLset.isEmpty(v$3.data)); -var xs = Bs_Array.makeBy(30, (function (i) { +var xs$25 = Bs_Array.makeBy(30, (function (i) { return i; })); -var v$3 = { - data: Bs_internalSetInt.ofArray(xs) +var v$4 = { + data: Bs_internalSetInt.ofArray(xs$25) }; -Bs_SetIntM.remove(v$3, 30); +Bs_SetIntM.remove(v$4, 30); -Bs_SetIntM.remove(v$3, 29); +Bs_SetIntM.remove(v$4, 29); -b("File \"bs_mutable_set_test.ml\", line 55, characters 4-11", +(28 === Bs_internalAVLset.maxUndefined(v$3.data))); +b("File \"bs_mutable_set_test.ml\", line 213, characters 4-11", +(28 === Bs_internalAVLset.maxUndefined(v$4.data))); -Bs_SetIntM.remove(v$3, 0); +Bs_SetIntM.remove(v$4, 0); -b("File \"bs_mutable_set_test.ml\", line 57, characters 4-11", +(1 === Bs_internalAVLset.minUndefined(v$3.data))); +b("File \"bs_mutable_set_test.ml\", line 215, characters 4-11", +(1 === Bs_internalAVLset.minUndefined(v$4.data))); -eq("File \"bs_mutable_set_test.ml\", line 58, characters 5-12", Bs_internalAVLset.size(v$3.data), 28); +eq("File \"bs_mutable_set_test.ml\", line 216, characters 5-12", Bs_internalAVLset.size(v$4.data), 28); var vv$1 = Array_data_util.randomRange(1, 28); -for(var i$3 = 0 ,i_finish$2 = vv$1.length - 1 | 0; i$3 <= i_finish$2; ++i$3){ - Bs_SetIntM.remove(v$3, Caml_array.caml_array_get(vv$1, i$3)); +for(var i$5 = 0 ,i_finish$3 = vv$1.length - 1 | 0; i$5 <= i_finish$3; ++i$5){ + Bs_SetIntM.remove(v$4, Caml_array.caml_array_get(vv$1, i$5)); } -eq("File \"bs_mutable_set_test.ml\", line 63, characters 5-12", Bs_internalAVLset.size(v$3.data), 0); +eq("File \"bs_mutable_set_test.ml\", line 221, characters 5-12", Bs_internalAVLset.size(v$4.data), 0); function id(loc, x) { var u = { @@ -113,29 +510,29 @@ function id(loc, x) { }))); } -id("File \"bs_mutable_set_test.ml\", line 71, characters 5-12", /* int array */[]); +id("File \"bs_mutable_set_test.ml\", line 229, characters 5-12", /* int array */[]); -id("File \"bs_mutable_set_test.ml\", line 72, characters 5-12", /* int array */[0]); +id("File \"bs_mutable_set_test.ml\", line 230, characters 5-12", /* int array */[0]); -id("File \"bs_mutable_set_test.ml\", line 73, characters 5-12", /* int array */[ +id("File \"bs_mutable_set_test.ml\", line 231, characters 5-12", /* int array */[ 0, 1 ]); -id("File \"bs_mutable_set_test.ml\", line 74, characters 5-12", /* int array */[ +id("File \"bs_mutable_set_test.ml\", line 232, characters 5-12", /* int array */[ 0, 1, 2 ]); -id("File \"bs_mutable_set_test.ml\", line 75, characters 5-12", /* int array */[ +id("File \"bs_mutable_set_test.ml\", line 233, characters 5-12", /* int array */[ 0, 1, 2, 3 ]); -id("File \"bs_mutable_set_test.ml\", line 76, characters 5-12", /* array */[ +id("File \"bs_mutable_set_test.ml\", line 234, characters 5-12", /* array */[ 0, 1, 2, @@ -143,7 +540,7 @@ id("File \"bs_mutable_set_test.ml\", line 76, characters 5-12", /* array */[ 4 ]); -id("File \"bs_mutable_set_test.ml\", line 77, characters 5-12", /* array */[ +id("File \"bs_mutable_set_test.ml\", line 235, characters 5-12", /* array */[ 0, 1, 2, @@ -152,7 +549,7 @@ id("File \"bs_mutable_set_test.ml\", line 77, characters 5-12", /* array */[ 5 ]); -id("File \"bs_mutable_set_test.ml\", line 78, characters 5-12", /* array */[ +id("File \"bs_mutable_set_test.ml\", line 236, characters 5-12", /* array */[ 0, 1, 2, @@ -161,7 +558,7 @@ id("File \"bs_mutable_set_test.ml\", line 78, characters 5-12", /* array */[ 6 ]); -id("File \"bs_mutable_set_test.ml\", line 79, characters 5-12", /* array */[ +id("File \"bs_mutable_set_test.ml\", line 237, characters 5-12", /* array */[ 0, 1, 2, @@ -171,7 +568,7 @@ id("File \"bs_mutable_set_test.ml\", line 79, characters 5-12", /* array */[ 7 ]); -id("File \"bs_mutable_set_test.ml\", line 80, characters 5-12", /* array */[ +id("File \"bs_mutable_set_test.ml\", line 238, characters 5-12", /* array */[ 0, 1, 2, @@ -182,7 +579,7 @@ id("File \"bs_mutable_set_test.ml\", line 80, characters 5-12", /* array */[ 8 ]); -id("File \"bs_mutable_set_test.ml\", line 81, characters 5-12", /* array */[ +id("File \"bs_mutable_set_test.ml\", line 239, characters 5-12", /* array */[ 0, 1, 2, @@ -194,159 +591,159 @@ id("File \"bs_mutable_set_test.ml\", line 81, characters 5-12", /* array */[ 9 ]); -id("File \"bs_mutable_set_test.ml\", line 82, characters 5-12", Array_data_util.range(0, 1000)); +id("File \"bs_mutable_set_test.ml\", line 240, characters 5-12", Array_data_util.range(0, 1000)); -var xs$1 = Array_data_util.randomRange(0, 1000); +var xs$26 = Array_data_util.randomRange(0, 1000); -var v$4 = { - data: Bs_internalSetInt.ofArray(xs$1) +var v$5 = { + data: Bs_internalSetInt.ofArray(xs$26) }; -var copyV = Bs_SetIntM.keepBy(v$4, (function (x) { +var copyV = Bs_SetIntM.keepBy(v$5, (function (x) { return +(x % 8 === 0); })); -var match = Bs_SetIntM.partition(v$4, (function (x) { +var match$5 = Bs_SetIntM.partition(v$5, (function (x) { return +(x % 8 === 0); })); -var cc = Bs_SetIntM.keepBy(v$4, (function (x) { +var cc$1 = Bs_SetIntM.keepBy(v$5, (function (x) { return +(x % 8 !== 0); })); -for(var i$4 = 0; i$4 <= 200; ++i$4){ - Bs_SetIntM.remove(v$4, i$4); +for(var i$6 = 0; i$6 <= 200; ++i$6){ + Bs_SetIntM.remove(v$5, i$6); } -eq("File \"bs_mutable_set_test.ml\", line 92, characters 5-12", Bs_internalAVLset.size(copyV.data), 126); +eq("File \"bs_mutable_set_test.ml\", line 250, characters 5-12", Bs_internalAVLset.size(copyV.data), 126); -eq("File \"bs_mutable_set_test.ml\", line 93, characters 5-12", Bs_internalAVLset.toArray(copyV.data), Bs_Array.makeBy(126, (function (i) { +eq("File \"bs_mutable_set_test.ml\", line 251, characters 5-12", Bs_internalAVLset.toArray(copyV.data), Bs_Array.makeBy(126, (function (i) { return (i << 3); }))); -eq("File \"bs_mutable_set_test.ml\", line 94, characters 5-12", Bs_internalAVLset.size(v$4.data), 800); +eq("File \"bs_mutable_set_test.ml\", line 252, characters 5-12", Bs_internalAVLset.size(v$5.data), 800); -b("File \"bs_mutable_set_test.ml\", line 95, characters 4-11", Bs_SetIntM.eq(copyV, match[0])); +b("File \"bs_mutable_set_test.ml\", line 253, characters 4-11", Bs_SetIntM.eq(copyV, match$5[0])); -b("File \"bs_mutable_set_test.ml\", line 96, characters 4-11", Bs_SetIntM.eq(cc, match[1])); +b("File \"bs_mutable_set_test.ml\", line 254, characters 4-11", Bs_SetIntM.eq(cc$1, match$5[1])); -var xs$2 = Array_data_util.randomRange(0, 1000); +var xs$27 = Array_data_util.randomRange(0, 1000); -var v$5 = { - data: Bs_internalSetInt.ofArray(xs$2) +var v$6 = { + data: Bs_internalSetInt.ofArray(xs$27) }; -var match$1 = Bs_SetIntM.split(v$5, 400); +var match$6 = Bs_SetIntM.split(v$6, 400); -var match$2 = match$1[0]; +var match$7 = match$6[0]; -var xs$3 = Array_data_util.randomRange(0, 399); +var xs$28 = Array_data_util.randomRange(0, 399); -b("File \"bs_mutable_set_test.ml\", line 101, characters 4-11", Bs_SetIntM.eq(match$2[0], { - data: Bs_internalSetInt.ofArray(xs$3) +b("File \"bs_mutable_set_test.ml\", line 259, characters 4-11", Bs_SetIntM.eq(match$7[0], { + data: Bs_internalSetInt.ofArray(xs$28) })); -var xs$4 = Array_data_util.randomRange(401, 1000); +var xs$29 = Array_data_util.randomRange(401, 1000); -b("File \"bs_mutable_set_test.ml\", line 102, characters 4-11", Bs_SetIntM.eq(match$2[1], { - data: Bs_internalSetInt.ofArray(xs$4) +b("File \"bs_mutable_set_test.ml\", line 260, characters 4-11", Bs_SetIntM.eq(match$7[1], { + data: Bs_internalSetInt.ofArray(xs$29) })); -var xs$5 = Bs_Array.map(Array_data_util.randomRange(0, 1000), (function (x) { +var xs$30 = Bs_Array.map(Array_data_util.randomRange(0, 1000), (function (x) { return (x << 1); })); -var d = { - data: Bs_internalSetInt.ofArray(xs$5) +var d$3 = { + data: Bs_internalSetInt.ofArray(xs$30) }; -var match$3 = Bs_SetIntM.split(d, 1001); +var match$8 = Bs_SetIntM.split(d$3, 1001); -var match$4 = match$3[0]; +var match$9 = match$8[0]; -var xs$6 = Bs_Array.makeBy(501, (function (x) { +var xs$31 = Bs_Array.makeBy(501, (function (x) { return (x << 1); })); -b("File \"bs_mutable_set_test.ml\", line 105, characters 4-11", Bs_SetIntM.eq(match$4[0], { - data: Bs_internalSetInt.ofArray(xs$6) +b("File \"bs_mutable_set_test.ml\", line 263, characters 4-11", Bs_SetIntM.eq(match$9[0], { + data: Bs_internalSetInt.ofArray(xs$31) })); -var xs$7 = Bs_Array.makeBy(500, (function (x) { +var xs$32 = Bs_Array.makeBy(500, (function (x) { return 1002 + (x << 1) | 0; })); -b("File \"bs_mutable_set_test.ml\", line 106, characters 4-11", Bs_SetIntM.eq(match$4[1], { - data: Bs_internalSetInt.ofArray(xs$7) +b("File \"bs_mutable_set_test.ml\", line 264, characters 4-11", Bs_SetIntM.eq(match$9[1], { + data: Bs_internalSetInt.ofArray(xs$32) })); -var xs$8 = Array_data_util.randomRange(0, 100); +var xs$33 = Array_data_util.randomRange(0, 100); -var aa = { - data: Bs_internalSetInt.ofArray(xs$8) +var aa$3 = { + data: Bs_internalSetInt.ofArray(xs$33) }; -var xs$9 = Array_data_util.randomRange(40, 120); +var xs$34 = Array_data_util.randomRange(40, 120); -var bb = { - data: Bs_internalSetInt.ofArray(xs$9) +var bb$3 = { + data: Bs_internalSetInt.ofArray(xs$34) }; -var cc$1 = Bs_SetIntM.union(aa, bb); +var cc$2 = Bs_SetIntM.union(aa$3, bb$3); -var xs$10 = Array_data_util.randomRange(0, 120); +var xs$35 = Array_data_util.randomRange(0, 120); -b("File \"bs_mutable_set_test.ml\", line 116, characters 4-11", Bs_SetIntM.eq(cc$1, { - data: Bs_internalSetInt.ofArray(xs$10) +b("File \"bs_mutable_set_test.ml\", line 274, characters 4-11", Bs_SetIntM.eq(cc$2, { + data: Bs_internalSetInt.ofArray(xs$35) })); -var xs$11 = Array_data_util.randomRange(0, 20); +var xs$36 = Array_data_util.randomRange(0, 20); -var xs$12 = Array_data_util.randomRange(21, 40); +var xs$37 = Array_data_util.randomRange(21, 40); -var xs$13 = Array_data_util.randomRange(0, 40); +var xs$38 = Array_data_util.randomRange(0, 40); -b("File \"bs_mutable_set_test.ml\", line 118, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.union({ - data: Bs_internalSetInt.ofArray(xs$11) +b("File \"bs_mutable_set_test.ml\", line 276, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.union({ + data: Bs_internalSetInt.ofArray(xs$36) }, { - data: Bs_internalSetInt.ofArray(xs$12) + data: Bs_internalSetInt.ofArray(xs$37) }), { - data: Bs_internalSetInt.ofArray(xs$13) + data: Bs_internalSetInt.ofArray(xs$38) })); -var dd = Bs_SetIntM.intersect(aa, bb); +var dd$1 = Bs_SetIntM.intersect(aa$3, bb$3); -var xs$14 = Array_data_util.randomRange(40, 100); +var xs$39 = Array_data_util.randomRange(40, 100); -b("File \"bs_mutable_set_test.ml\", line 123, characters 4-11", Bs_SetIntM.eq(dd, { - data: Bs_internalSetInt.ofArray(xs$14) +b("File \"bs_mutable_set_test.ml\", line 281, characters 4-11", Bs_SetIntM.eq(dd$1, { + data: Bs_internalSetInt.ofArray(xs$39) })); -var xs$15 = Array_data_util.randomRange(0, 20); +var xs$40 = Array_data_util.randomRange(0, 20); -var xs$16 = Array_data_util.randomRange(21, 40); +var xs$41 = Array_data_util.randomRange(21, 40); -b("File \"bs_mutable_set_test.ml\", line 124, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.intersect({ - data: Bs_internalSetInt.ofArray(xs$15) +b("File \"bs_mutable_set_test.ml\", line 282, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.intersect({ + data: Bs_internalSetInt.ofArray(xs$40) }, { - data: Bs_internalSetInt.ofArray(xs$16) + data: Bs_internalSetInt.ofArray(xs$41) }), { data: Bs_internalAVLset.empty })); -var xs$17 = Array_data_util.randomRange(21, 40); +var xs$42 = Array_data_util.randomRange(21, 40); -var xs$18 = Array_data_util.randomRange(0, 20); +var xs$43 = Array_data_util.randomRange(0, 20); -b("File \"bs_mutable_set_test.ml\", line 130, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.intersect({ - data: Bs_internalSetInt.ofArray(xs$17) +b("File \"bs_mutable_set_test.ml\", line 288, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.intersect({ + data: Bs_internalSetInt.ofArray(xs$42) }, { - data: Bs_internalSetInt.ofArray(xs$18) + data: Bs_internalSetInt.ofArray(xs$43) }), { data: Bs_internalAVLset.empty })); -b("File \"bs_mutable_set_test.ml\", line 136, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.intersect({ +b("File \"bs_mutable_set_test.ml\", line 294, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.intersect({ data: Bs_internalSetInt.ofArray(/* array */[ 1, 3, @@ -371,58 +768,58 @@ b("File \"bs_mutable_set_test.ml\", line 136, characters 4-11", Bs_SetIntM.eq(Bs ]) })); -var xs$19 = Array_data_util.randomRange(0, 39); +var xs$44 = Array_data_util.randomRange(0, 39); -b("File \"bs_mutable_set_test.ml\", line 142, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff(aa, bb), { - data: Bs_internalSetInt.ofArray(xs$19) +b("File \"bs_mutable_set_test.ml\", line 300, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff(aa$3, bb$3), { + data: Bs_internalSetInt.ofArray(xs$44) })); -var xs$20 = Array_data_util.randomRange(101, 120); +var xs$45 = Array_data_util.randomRange(101, 120); -b("File \"bs_mutable_set_test.ml\", line 144, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff(bb, aa), { - data: Bs_internalSetInt.ofArray(xs$20) +b("File \"bs_mutable_set_test.ml\", line 302, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff(bb$3, aa$3), { + data: Bs_internalSetInt.ofArray(xs$45) })); -var xs$21 = Array_data_util.randomRange(21, 40); +var xs$46 = Array_data_util.randomRange(21, 40); -var xs$22 = Array_data_util.randomRange(0, 20); +var xs$47 = Array_data_util.randomRange(0, 20); -var xs$23 = Array_data_util.randomRange(21, 40); +var xs$48 = Array_data_util.randomRange(21, 40); -b("File \"bs_mutable_set_test.ml\", line 146, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff({ - data: Bs_internalSetInt.ofArray(xs$21) +b("File \"bs_mutable_set_test.ml\", line 304, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff({ + data: Bs_internalSetInt.ofArray(xs$46) }, { - data: Bs_internalSetInt.ofArray(xs$22) + data: Bs_internalSetInt.ofArray(xs$47) }), { - data: Bs_internalSetInt.ofArray(xs$23) + data: Bs_internalSetInt.ofArray(xs$48) })); -var xs$24 = Array_data_util.randomRange(0, 20); +var xs$49 = Array_data_util.randomRange(0, 20); -var xs$25 = Array_data_util.randomRange(21, 40); +var xs$50 = Array_data_util.randomRange(21, 40); -var xs$26 = Array_data_util.randomRange(0, 20); +var xs$51 = Array_data_util.randomRange(0, 20); -b("File \"bs_mutable_set_test.ml\", line 152, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff({ - data: Bs_internalSetInt.ofArray(xs$24) +b("File \"bs_mutable_set_test.ml\", line 310, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff({ + data: Bs_internalSetInt.ofArray(xs$49) }, { - data: Bs_internalSetInt.ofArray(xs$25) + data: Bs_internalSetInt.ofArray(xs$50) }), { - data: Bs_internalSetInt.ofArray(xs$26) + data: Bs_internalSetInt.ofArray(xs$51) })); -var xs$27 = Array_data_util.randomRange(0, 20); +var xs$52 = Array_data_util.randomRange(0, 20); -var xs$28 = Array_data_util.randomRange(0, 40); +var xs$53 = Array_data_util.randomRange(0, 40); -var xs$29 = Array_data_util.randomRange(0, -1); +var xs$54 = Array_data_util.randomRange(0, -1); -b("File \"bs_mutable_set_test.ml\", line 159, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff({ - data: Bs_internalSetInt.ofArray(xs$27) +b("File \"bs_mutable_set_test.ml\", line 317, characters 4-11", Bs_SetIntM.eq(Bs_SetIntM.diff({ + data: Bs_internalSetInt.ofArray(xs$52) }, { - data: Bs_internalSetInt.ofArray(xs$28) + data: Bs_internalSetInt.ofArray(xs$53) }), { - data: Bs_internalSetInt.ofArray(xs$29) + data: Bs_internalSetInt.ofArray(xs$54) })); Mt.from_pair_suites("bs_mutable_set_test.ml", suites[0]); @@ -435,6 +832,12 @@ var R = 0; var A = 0; +var L = 0; + +var empty = Bs_SetIntM.empty; + +var ofArray = Bs_SetIntM.ofArray; + var $plus$plus = Bs_SetIntM.union; var f = Bs_SetIntM.ofArray; @@ -449,7 +852,10 @@ exports.N = N; exports.I = I; exports.R = R; exports.A = A; +exports.L = L; +exports.empty = empty; +exports.ofArray = ofArray; exports.$plus$plus = $plus$plus; exports.f = f; exports.$eq$tilde = $eq$tilde; -/* Not a pure module */ +/* u Not a pure module */ diff --git a/jscomp/test/bs_mutable_set_test.ml b/jscomp/test/bs_mutable_set_test.ml index ac894bee04..5999810133 100644 --- a/jscomp/test/bs_mutable_set_test.ml +++ b/jscomp/test/bs_mutable_set_test.ml @@ -8,8 +8,166 @@ module N = Bs.MutableSet.Int module I = Array_data_util module R = Bs.Range module A = Bs.Array +module L = Bs.List let (++) = A.concat +let empty = N.empty +let ofArray = N.ofArray +(************************************************) +include (struct +let () = + let u = ofArray (I.range 0 30) in + b __LOC__ (N.removeCheck u 0); + b __LOC__ (not (N.removeCheck u 0)); + b __LOC__ (N.removeCheck u 30); + b __LOC__ (N.removeCheck u 20); + eq __LOC__ (N.size u) 28 ; + let r = I.randomRange 0 30 in + b __LOC__ (Js.eqUndefined 29 (N.maxUndefined u)); + b __LOC__ (Js.eqUndefined 1 (N.minUndefined u)); + N.add u 3; + for i = 0 to A.length r - 1 do + N.remove u (A.getUnsafe r i) + done ; + b __LOC__ (N.isEmpty u); + N.add u 0; + N.add u 1; + N.add u 2; + N.add u 0; + eq __LOC__ (N.size u) 3; + b __LOC__ (not (N.isEmpty u)); + for i = 0 to 3 do + N.remove u i + done ; + b __LOC__ (N.isEmpty u); + N.mergeMany u (I.randomRange 0 20000); + N.mergeMany u (I.randomRange 0 200); + eq __LOC__ (N.size u) 20001; + N.removeMany u (I.randomRange 0 200); + eq __LOC__ (N.size u) 19800; + N.removeMany u (I.randomRange 0 1000); + eq __LOC__ (N.size u) 19000; + N.removeMany u (I.randomRange 0 1000); + eq __LOC__ (N.size u) 19000; + N.removeMany u (I.randomRange 1000 10000); + eq __LOC__ (N.size u) 10000; + N.removeMany u (I.randomRange 10000 (20000 -1)); + eq __LOC__ (N.size u) 1 ; + b __LOC__ (N.has u 20000); + N.removeMany u (I.randomRange 10_000 30_000); + b __LOC__ (N.isEmpty u) + + +let () = + let v = ofArray (I.randomRange 1_000 2_000) in + let bs = A.map (I.randomRange 500 1499) (fun [@bs] x -> N.removeCheck v x ) in + let indeedRemoved = A.reduce bs 0 (fun [@bs] acc x -> if x then acc + 1 else acc) in + eq __LOC__ indeedRemoved 500; + eq __LOC__ (N.size v) 501; + let cs = A.map (I.randomRange 500 2_000) (fun [@bs] x -> N.addCheck v x) in + let indeedAded = A.reduce cs 0 (fun[@bs] acc x -> if x then acc + 1 else acc) in + eq __LOC__ indeedAded 1000 ; + eq __LOC__ (N.size v) 1_501; + b __LOC__ (N.isEmpty (empty ())); + eq __LOC__ (N.minimum v) (Some 500); + eq __LOC__ (N.maximum v) (Some 2000); + eq __LOC__ (N.minUndefined v) (Js.Undefined.return 500); + eq __LOC__ (N.maxUndefined v) (Js.Undefined.return 2000); + eq __LOC__ (N.reduce v 0 (fun [@bs] x y -> x + y)) ((( 500 + 2000)/2) * 1501 ); + b __LOC__ (L.eq (N.toList v) (L.makeBy 1_501 (fun[@bs] i -> i + 500) ) (fun[@bs] x y -> x = y) ) ; + eq __LOC__ (N.toArray v ) (I.range 500 2000); + b __LOC__ (N.checkInvariantInternal v); + eq __LOC__ (N.get v 3) None; + eq __LOC__ (N.get v 1_200) (Some 1_200); + let (aa, bb), pres = N.split v 1000 in + b __LOC__ pres ; + b __LOC__ (A.eq (N.toArray aa) (I.range 500 999) (fun[@bs] x y -> x = y)); + b __LOC__ (A.eq (N.toArray bb) (I.range 1_001 2_000) (fun[@bs] x y -> x = y)); + b __LOC__ (N.subset aa v); + b __LOC__ (N.subset bb v) ; + b __LOC__ (N.isEmpty (N.intersect aa bb)); + let c = N.removeCheck v 1_000 in + b __LOC__ c ; + let (aa,bb), pres = N.split v 1_000 in + b __LOC__ (not pres); + b __LOC__ (A.eq (N.toArray aa) (I.range 500 999) (fun[@bs] x y -> x = y)); + b __LOC__ (A.eq (N.toArray bb) (I.range 1_001 2_000) (fun[@bs] x y -> x = y)); + b __LOC__ (N.subset aa v); + b __LOC__ (N.subset bb v); + b __LOC__ (N.isEmpty (N.intersect aa bb)) + +let (++) = N.union +let f = ofArray +let (=~) = N.eq +let () = + let aa = f (I.randomRange 0 100) in + let bb = f (I.randomRange 40 120) in + let cc = aa ++ bb in + b __LOC__ (cc =~ f (I.randomRange 0 120)); + + b __LOC__ (N.eq + ( N.union (f (I.randomRange 0 20)) + (f (I.randomRange 21 40) )) + (f( I.randomRange 0 40))); + let dd = N.intersect aa bb in + b __LOC__ (dd =~ f (I.randomRange 40 100)); + b __LOC__ + (N.intersect + (f @@ I.randomRange 0 20) + (f @@ I.randomRange 21 40) + =~ (empty ()) + ); + b __LOC__ + (N.intersect + (f @@ I.randomRange 21 40) + (f @@ I.randomRange 0 20) + =~ (empty ()) + ); + b __LOC__ + (N.intersect + (f [|1;3;4;5;7;9|]) + (f [|2;4;5;6;8;10|]) + =~ (f [|4;5|]) + ); + b __LOC__ + (N.diff aa bb =~ f (I.randomRange 0 39)); + b __LOC__ + (N.diff bb aa =~ f (I.randomRange 101 120)); + b __LOC__ + (N.diff + (f @@ I.randomRange 21 40) + (f @@ I.randomRange 0 20) + =~ (f (I.randomRange 21 40)) + ); + b __LOC__ + (N.diff + (f @@ I.randomRange 0 20) + (f @@ I.randomRange 21 40) + =~ (f (I.randomRange 0 20)) + ); + + b __LOC__ + (N.diff + (f @@ I.randomRange 0 20) + (f @@ I.randomRange 0 40) + =~ (f (I.randomRange 0 (-1))) + ) + +let () = + let a0 = ofArray (I.randomRange 0 1000) in + let a1,a2 = + ( + N.keepBy a0 (fun [@bs] x -> x mod 2 = 0), + N.keepBy a0 (fun [@bs] x -> x mod 2 <> 0) + ) in + let a3, a4 = N.partition a0 (fun [@bs] x -> x mod 2 = 0) in + b __LOC__ (N.eq a1 a3); + b __LOC__ (N.eq a2 a4); + b __LOC__ (L.every [a0;a1;a2;a3;a4] (fun [@bs] x -> N.checkInvariantInternal x)) + + end : sig end) + +(************************************************) let () = let v = N.empty () in for i = 0 to 1_00_000 do diff --git a/jscomp/test/bs_poly_map_test.js b/jscomp/test/bs_poly_map_test.js index 11291a09e5..2c74e3d37c 100644 --- a/jscomp/test/bs_poly_map_test.js +++ b/jscomp/test/bs_poly_map_test.js @@ -22,14 +22,21 @@ function b(loc, v) { var Icmp = /* module */[/* cmp */Caml_primitive.caml_int_compare]; -function f(x) { +function mapOfArray(x) { return Bs_Map.ofArray(x, Icmp); } -function ff(x) { +function setOfArray(x) { return Bs_Set.ofArray(x, Icmp); } +function emptyMap() { + return { + cmp: Icmp[/* cmp */0], + data: Bs_SortedMapDict.empty + }; +} + function mergeInter(s1, s2) { var m = Bs_Map.merge(s1, s2, (function (_, v1, v2) { if (v1 && v2) { @@ -87,19 +94,19 @@ var u1 = Bs_Map.ofArray(x$1, Icmp); var x$2 = Array_data_util.range(30, 100); -b("File \"bs_poly_map_test.ml\", line 47, characters 4-11", Bs_Set.eq(mergeInter(u0, u1), Bs_Set.ofArray(x$2, Icmp))); +b("File \"bs_poly_map_test.ml\", line 50, characters 4-11", Bs_Set.eq(mergeInter(u0, u1), Bs_Set.ofArray(x$2, Icmp))); var x$3 = Array_data_util.range(0, 120); -b("File \"bs_poly_map_test.ml\", line 48, characters 4-11", Bs_Set.eq(mergeUnion(u0, u1), Bs_Set.ofArray(x$3, Icmp))); +b("File \"bs_poly_map_test.ml\", line 51, characters 4-11", Bs_Set.eq(mergeUnion(u0, u1), Bs_Set.ofArray(x$3, Icmp))); var x$4 = Array_data_util.range(0, 29); -b("File \"bs_poly_map_test.ml\", line 49, characters 4-11", Bs_Set.eq(mergeDiff(u0, u1), Bs_Set.ofArray(x$4, Icmp))); +b("File \"bs_poly_map_test.ml\", line 52, characters 4-11", Bs_Set.eq(mergeDiff(u0, u1), Bs_Set.ofArray(x$4, Icmp))); var x$5 = Array_data_util.range(101, 120); -b("File \"bs_poly_map_test.ml\", line 50, characters 4-11", Bs_Set.eq(mergeDiff(u1, u0), Bs_Set.ofArray(x$5, Icmp))); +b("File \"bs_poly_map_test.ml\", line 53, characters 4-11", Bs_Set.eq(mergeDiff(u1, u0), Bs_Set.ofArray(x$5, Icmp))); var x$6 = randomRange(0, 10); @@ -129,21 +136,21 @@ var a5 = Bs_Map.remove(a0, 3); var a6 = Bs_Map.remove(a5, 3); -b("File \"bs_poly_map_test.ml\", line 69, characters 4-11", +(a5 === a6)); +b("File \"bs_poly_map_test.ml\", line 72, characters 4-11", +(a5 === a6)); -b("File \"bs_poly_map_test.ml\", line 70, characters 4-11", Bs_Map.has(a0, 3)); +b("File \"bs_poly_map_test.ml\", line 73, characters 4-11", Bs_Map.has(a0, 3)); -b("File \"bs_poly_map_test.ml\", line 71, characters 4-11", 1 - Bs_Map.has(a5, 3)); +b("File \"bs_poly_map_test.ml\", line 74, characters 4-11", 1 - Bs_Map.has(a5, 3)); -b("File \"bs_poly_map_test.ml\", line 72, characters 4-11", +(3 === Bs_Map.getUndefined(a0, 3))); +b("File \"bs_poly_map_test.ml\", line 75, characters 4-11", +(3 === Bs_Map.getUndefined(a0, 3))); -b("File \"bs_poly_map_test.ml\", line 73, characters 4-11", +(33 === Bs_Map.getUndefined(a1, 3))); +b("File \"bs_poly_map_test.ml\", line 76, characters 4-11", +(33 === Bs_Map.getUndefined(a1, 3))); -b("File \"bs_poly_map_test.ml\", line 74, characters 4-11", +(Bs_Map.getUndefined(a2, 3) === undefined)); +b("File \"bs_poly_map_test.ml\", line 77, characters 4-11", +(Bs_Map.getUndefined(a2, 3) === undefined)); -b("File \"bs_poly_map_test.ml\", line 76, characters 4-11", +(11 === Bs_Map.getUndefined(a3, 3))); +b("File \"bs_poly_map_test.ml\", line 79, characters 4-11", +(11 === Bs_Map.getUndefined(a3, 3))); -b("File \"bs_poly_map_test.ml\", line 77, characters 4-11", +(Bs_Map.getUndefined(a4, 3) === undefined)); +b("File \"bs_poly_map_test.ml\", line 80, characters 4-11", +(Bs_Map.getUndefined(a4, 3) === undefined)); var a7 = Bs_Map.removeMany(a0, /* array */[ 7, @@ -159,14 +166,14 @@ var a7 = Bs_Map.removeMany(a0, /* array */[ 6 ]); -eq("File \"bs_poly_map_test.ml\", line 80, characters 5-12", Bs_SortedMapDict.keysToArray(a7.data), /* int array */[ +eq("File \"bs_poly_map_test.ml\", line 83, characters 5-12", Bs_SortedMapDict.keysToArray(a7.data), /* int array */[ 9, 10 ]); var a8 = Bs_Map.removeMany(a7, Array_data_util.randomRange(0, 100)); -b("File \"bs_poly_map_test.ml\", line 82, characters 4-11", Bs_SortedMapDict.isEmpty(a8.data)); +b("File \"bs_poly_map_test.ml\", line 85, characters 4-11", Bs_SortedMapDict.isEmpty(a8.data)); var x$7 = randomRange(0, 100); @@ -174,9 +181,9 @@ var u0$1 = Bs_Map.ofArray(x$7, Icmp); var u1$1 = Bs_Map.set(u0$1, 3, 32); -eq("File \"bs_poly_map_test.ml\", line 97, characters 5-12", Bs_Map.get(u1$1, 3), /* Some */[32]); +eq("File \"bs_poly_map_test.ml\", line 92, characters 5-12", Bs_Map.get(u1$1, 3), /* Some */[32]); -eq("File \"bs_poly_map_test.ml\", line 98, characters 5-12", Bs_Map.get(u0$1, 3), /* Some */[3]); +eq("File \"bs_poly_map_test.ml\", line 93, characters 5-12", Bs_Map.get(u0$1, 3), /* Some */[3]); function acc(m, is) { return Bs_Array.reduce(is, m, (function (a, i) { @@ -199,12 +206,117 @@ var m = { var m1 = acc(m, Bs_Array.concat(Array_data_util.randomRange(0, 20), Array_data_util.randomRange(10, 30))); -b("File \"bs_poly_map_test.ml\", line 110, characters 4-11", Bs_Map.eq(m1, Bs_Map.ofArray(Bs_Array.makeBy(31, (function (i) { - return /* tuple */[ - i, - i >= 10 && i <= 20 ? 2 : 1 - ]; - })), Icmp), (function (x, y) { +var x$8 = Bs_Array.makeBy(31, (function (i) { + return /* tuple */[ + i, + i >= 10 && i <= 20 ? 2 : 1 + ]; + })); + +b("File \"bs_poly_map_test.ml\", line 105, characters 4-11", Bs_Map.eq(m1, Bs_Map.ofArray(x$8, Icmp), (function (x, y) { + return +(x === y); + }))); + +var v0 = { + cmp: Icmp[/* cmp */0], + data: Bs_SortedMapDict.empty +}; + +var v1 = Bs_Map.mergeMany(v0, Bs_Array.map(Array_data_util.randomRange(0, 10000), (function (x) { + return /* tuple */[ + x, + x + ]; + }))); + +var x$9 = Bs_Array.map(Array_data_util.randomRange(0, 10000), (function (x) { + return /* tuple */[ + x, + x + ]; + })); + +var v2 = Bs_Map.ofArray(x$9, Icmp); + +b("File \"bs_poly_map_test.ml\", line 119, characters 4-11", Bs_Map.eq(v1, v2, (function (x, y) { + return +(x === y); + }))); + +function inc(x) { + if (x) { + return /* Some */[x[0] + 1 | 0]; + } else { + return /* Some */[0]; + } +} + +var v3 = Bs_Map.update(v1, 10, inc); + +var v4 = Bs_Map.update(v3, -10, inc); + +var match = Bs_Map.split(v3, 5000); + +var pres = match[1]; + +var match$1 = match[0]; + +var match$2 = Bs_Map.get(v3, 10); + +b("File \"bs_poly_map_test.ml\", line 128, characters 4-11", match$2 && match$2[0] === 11 ? /* true */1 : /* false */0); + +var match$3 = Bs_Map.get(v3, -10); + +b("File \"bs_poly_map_test.ml\", line 129, characters 4-11", match$3 ? /* false */0 : /* true */1); + +var match$4 = Bs_Map.get(v4, -10); + +b("File \"bs_poly_map_test.ml\", line 130, characters 4-11", match$4 && match$4[0] === 0 ? /* true */1 : /* false */0); + +var map = Bs_Map.remove({ + cmp: Icmp[/* cmp */0], + data: Bs_SortedMapDict.empty + }, 0); + +b("File \"bs_poly_map_test.ml\", line 131, characters 4-11", Bs_SortedMapDict.isEmpty(map.data)); + +var map$1 = Bs_Map.removeMany({ + cmp: Icmp[/* cmp */0], + data: Bs_SortedMapDict.empty + }, /* int array */[0]); + +b("File \"bs_poly_map_test.ml\", line 132, characters 4-11", Bs_SortedMapDict.isEmpty(map$1.data)); + +b("File \"bs_poly_map_test.ml\", line 133, characters 4-11", pres && pres[0] === 5000 ? /* true */1 : /* false */0); + +b("File \"bs_poly_map_test.ml\", line 134, characters 4-11", Bs_Array.eq(Bs_SortedMapDict.keysToArray(match$1[0].data), Bs_Array.makeBy(5000, (function (i) { + return i; + })), (function (x, y) { + return +(x === y); + }))); + +b("File \"bs_poly_map_test.ml\", line 135, characters 4-11", Bs_Array.eq(Bs_SortedMapDict.keysToArray(match$1[1].data), Bs_Array.makeBy(5000, (function (i) { + return 5001 + i | 0; + })), (function (x, y) { + return +(x === y); + }))); + +var v7 = Bs_Map.remove(v3, 5000); + +var match$5 = Bs_Map.split(v7, 5000); + +var match$6 = match$5[0]; + +b("File \"bs_poly_map_test.ml\", line 139, characters 4-11", match$5[1] ? /* false */0 : /* true */1); + +b("File \"bs_poly_map_test.ml\", line 140, characters 4-11", Bs_Array.eq(Bs_SortedMapDict.keysToArray(match$6[0].data), Bs_Array.makeBy(5000, (function (i) { + return i; + })), (function (x, y) { + return +(x === y); + }))); + +b("File \"bs_poly_map_test.ml\", line 141, characters 4-11", Bs_Array.eq(Bs_SortedMapDict.keysToArray(match$6[1].data), Bs_Array.makeBy(5000, (function (i) { + return 5001 + i | 0; + })), (function (x, y) { return +(x === y); }))); @@ -227,8 +339,9 @@ exports.M = M; exports.N = N; exports.A = A; exports.I = I; -exports.f = f; -exports.ff = ff; +exports.mapOfArray = mapOfArray; +exports.setOfArray = setOfArray; +exports.emptyMap = emptyMap; exports.mergeInter = mergeInter; exports.mergeUnion = mergeUnion; exports.mergeDiff = mergeDiff; diff --git a/jscomp/test/bs_poly_map_test.ml b/jscomp/test/bs_poly_map_test.ml index 6d2972034d..a7e78762cc 100644 --- a/jscomp/test/bs_poly_map_test.ml +++ b/jscomp/test/bs_poly_map_test.ml @@ -14,24 +14,27 @@ module N = Bs.Set module A = Bs_Array module I = Array_data_util -let f x = M.ofArray ~dict:(module Icmp) x -let ff x = N.ofArray ~dict:(module Icmp) x + + +let mapOfArray x = M.ofArray ~dict:(module Icmp) x +let setOfArray x = N.ofArray ~dict:(module Icmp) x +let emptyMap () = M.empty (module Icmp) let mergeInter s1 s2 = - ff @@ M.keysToArray (M.merge s1 s2 (fun[@bs] k v1 v2 -> + setOfArray @@ M.keysToArray (M.merge s1 s2 (fun[@bs] k v1 v2 -> match v1,v2 with | Some _, Some _ -> Some () | _, _ -> None )) let mergeUnion s1 s2 = - ff @@ M.keysToArray @@ M.merge s1 s2 (fun[@bs] k v1 v2 -> + setOfArray @@ M.keysToArray @@ M.merge s1 s2 (fun[@bs] k v1 v2 -> match v1,v2 with | None, None -> None | _, _ -> Some () ) let mergeDiff s1 s2 = - ff @@ M.keysToArray @@ M.merge s1 s2 (fun[@bs] k v1 v2 -> + setOfArray @@ M.keysToArray @@ M.merge s1 s2 (fun[@bs] k v1 v2 -> match v1,v2 with | Some _, None -> Some () | Some _, Some _ @@ -42,16 +45,16 @@ let randomRange i j = A.map (I.randomRange i j) (fun[@bs] x -> (x,x)) let () = - let u0 = f (randomRange 0 100) in - let u1 = f (randomRange 30 120) in - b __LOC__ (N.eq (mergeInter u0 u1) (ff (I.range 30 100))); - b __LOC__ (N.eq (mergeUnion u0 u1) (ff (I.range 0 120))); - b __LOC__ (N.eq (mergeDiff u0 u1) (ff (I.range 0 29))); - b __LOC__ (N.eq (mergeDiff u1 u0) (ff (I.range 101 120))) + let u0 = mapOfArray (randomRange 0 100) in + let u1 = mapOfArray (randomRange 30 120) in + b __LOC__ (N.eq (mergeInter u0 u1) (setOfArray (I.range 30 100))); + b __LOC__ (N.eq (mergeUnion u0 u1) (setOfArray (I.range 0 120))); + b __LOC__ (N.eq (mergeDiff u0 u1) (setOfArray (I.range 0 29))); + b __LOC__ (N.eq (mergeDiff u1 u0) (setOfArray (I.range 101 120))) let () = - let a0 = f (randomRange 0 10) in + let a0 = mapOfArray (randomRange 0 10) in let a1 = M.set a0 3 33 in (* (3,3) *) let a2 = M.remove a1 3 in (* no 3 *) let a3 = M.update a2 3 (fun[@bs] k -> @@ -81,18 +84,10 @@ let () = let a8 = M.removeMany a7 (I.randomRange 0 100) in b __LOC__ (M.isEmpty a8) -(* TODO: expose [Bs_Bag.bag] makes the error message - pretty hard to read - {[ - Error: This expression has type - ((Icmp.t, Icmp.id) Bs_Cmp.t, (Icmp.t, Icmp.t, Icmp.id) Bs_Map.t0) - Bs_Bag.bag - but an expression was expected of type unit - ]} - *) + let () = let module Array = M in - let u0 = f (randomRange 0 100) in + let u0 = mapOfArray (randomRange 0 100) in let u1 = u0.(3) <- 32 in eq __LOC__ u1.(3) (Some 32); eq __LOC__ u0.(3) (Some 3) @@ -105,12 +100,46 @@ let acc m is : _ M.t = A.reduce is m (fun[@bs] a i -> acc a i) let () = - let m = M.empty (module Icmp) in + let m = emptyMap () in let m1 = acc m (A.concat (I.randomRange 0 20) (I.randomRange 10 30)) in b __LOC__ (M.eq m1 - (M.ofArray ~dict:(module Icmp) (A.makeBy 31 (fun[@bs] i -> i, if i >= 10 && i <= 20 then 2 else 1 ))) + (mapOfArray (A.makeBy 31 (fun[@bs] i -> i, if i >= 10 && i <= 20 then 2 else 1 ))) (fun[@bs] x y -> x = y) ) +let () = + let v0 = emptyMap () in + let v1 = M.mergeMany v0 + (A.map (I.randomRange 0 10_000) (fun[@bs] x -> x , x)) in + + let v2 = mapOfArray + (A.map (I.randomRange 0 10_000) (fun[@bs] x -> x, x)) in + + b __LOC__ (M.eq v1 v2 (fun [@bs] x y -> x = y )); + + let inc = (fun [@bs] x -> + match x with None -> Some 0 + | Some v -> Some (v + 1) + ) in + let v3 = M.update v1 10 inc in + let v4 = M.update v3 (-10) inc in + let (v5, v6), pres = M.split v3 5_000 in + b __LOC__ (match M.get v3 10 with Some 11 -> true | _ -> false); + b __LOC__ (match M.get v3 (-10) with None -> true | _ -> false); + b __LOC__ (match M.get v4 (-10) with Some 0 -> true | _ -> false); + b __LOC__ (M.isEmpty (M.remove (emptyMap ()) 0) ); + b __LOC__ (M.isEmpty (M.removeMany (emptyMap ()) [|0|]) ); + b __LOC__ (match pres with Some 5_000 -> true | _ -> false); + b __LOC__ (A.eq (M.keysToArray v5) (A.makeBy 5_000 (fun [@bs] i -> i)) (fun[@bs] x y -> x = y) ); + b __LOC__ (A.eq (M.keysToArray v6) (A.makeBy 5_000 (fun [@bs] i -> 5_001 +i)) (fun[@bs] x y -> x = y) ); + + let v7 = M.remove v3 5_000 in + let (v8,v9), pres2 = M.split v7 5_000 in + b __LOC__ (match pres2 with None -> true | _ -> false); + b __LOC__ (A.eq (M.keysToArray v8) (A.makeBy 5_000 (fun [@bs] i -> i)) (fun[@bs] x y -> x = y) ); + b __LOC__ (A.eq (M.keysToArray v9) (A.makeBy 5_000 (fun [@bs] i -> 5_001 +i)) (fun[@bs] x y -> x = y) ) + + + ;; Mt.from_pair_suites __FILE__ !suites diff --git a/jscomp/test/bs_poly_mutable_set_test.js b/jscomp/test/bs_poly_mutable_set_test.js index 4a5f238fe4..a982591646 100644 --- a/jscomp/test/bs_poly_mutable_set_test.js +++ b/jscomp/test/bs_poly_mutable_set_test.js @@ -22,23 +22,34 @@ function b(loc, x) { var IntCmp = /* module */[/* cmp */Caml_primitive.caml_int_compare]; -var u = Bs_SetM.ofArray(Array_data_util.range(0, 30), IntCmp); +function ofArray(param) { + return Bs_SetM.ofArray(param, IntCmp); +} + +function empty() { + return { + cmp: IntCmp[/* cmp */0], + data: Bs_internalAVLset.empty + }; +} -b("File \"bs_poly_mutable_set_test.ml\", line 15, characters 4-11", Bs_SetM.removeCheck(u, 0)); +var u = ofArray(Array_data_util.range(0, 30)); -b("File \"bs_poly_mutable_set_test.ml\", line 16, characters 4-11", 1 - Bs_SetM.removeCheck(u, 0)); +b("File \"bs_poly_mutable_set_test.ml\", line 18, characters 4-11", Bs_SetM.removeCheck(u, 0)); -b("File \"bs_poly_mutable_set_test.ml\", line 17, characters 4-11", Bs_SetM.removeCheck(u, 30)); +b("File \"bs_poly_mutable_set_test.ml\", line 19, characters 4-11", 1 - Bs_SetM.removeCheck(u, 0)); -b("File \"bs_poly_mutable_set_test.ml\", line 18, characters 4-11", Bs_SetM.removeCheck(u, 20)); +b("File \"bs_poly_mutable_set_test.ml\", line 20, characters 4-11", Bs_SetM.removeCheck(u, 30)); -eq("File \"bs_poly_mutable_set_test.ml\", line 19, characters 5-12", Bs_internalAVLset.size(u.data), 28); +b("File \"bs_poly_mutable_set_test.ml\", line 21, characters 4-11", Bs_SetM.removeCheck(u, 20)); + +eq("File \"bs_poly_mutable_set_test.ml\", line 22, characters 5-12", Bs_internalAVLset.size(u.data), 28); var r = Array_data_util.randomRange(0, 30); -b("File \"bs_poly_mutable_set_test.ml\", line 21, characters 4-11", +(29 === Bs_internalAVLset.maxUndefined(u.data))); +b("File \"bs_poly_mutable_set_test.ml\", line 24, characters 4-11", +(29 === Bs_internalAVLset.maxUndefined(u.data))); -b("File \"bs_poly_mutable_set_test.ml\", line 22, characters 4-11", +(1 === Bs_internalAVLset.minUndefined(u.data))); +b("File \"bs_poly_mutable_set_test.ml\", line 25, characters 4-11", +(1 === Bs_internalAVLset.minUndefined(u.data))); Bs_SetM.add(u, 3); @@ -46,7 +57,7 @@ for(var i = 0 ,i_finish = r.length - 1 | 0; i <= i_finish; ++i){ Bs_SetM.remove(u, r[i]); } -b("File \"bs_poly_mutable_set_test.ml\", line 27, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); +b("File \"bs_poly_mutable_set_test.ml\", line 30, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); Bs_SetM.add(u, 0); @@ -56,49 +67,49 @@ Bs_SetM.add(u, 2); Bs_SetM.add(u, 0); -eq("File \"bs_poly_mutable_set_test.ml\", line 32, characters 5-12", Bs_internalAVLset.size(u.data), 3); +eq("File \"bs_poly_mutable_set_test.ml\", line 35, characters 5-12", Bs_internalAVLset.size(u.data), 3); -b("File \"bs_poly_mutable_set_test.ml\", line 33, characters 4-11", 1 - Bs_internalAVLset.isEmpty(u.data)); +b("File \"bs_poly_mutable_set_test.ml\", line 36, characters 4-11", 1 - Bs_internalAVLset.isEmpty(u.data)); for(var i$1 = 0; i$1 <= 3; ++i$1){ Bs_SetM.remove(u, i$1); } -b("File \"bs_poly_mutable_set_test.ml\", line 37, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); +b("File \"bs_poly_mutable_set_test.ml\", line 40, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); Bs_SetM.mergeMany(u, Array_data_util.randomRange(0, 20000)); Bs_SetM.mergeMany(u, Array_data_util.randomRange(0, 200)); -eq("File \"bs_poly_mutable_set_test.ml\", line 40, characters 5-12", Bs_internalAVLset.size(u.data), 20001); +eq("File \"bs_poly_mutable_set_test.ml\", line 43, characters 5-12", Bs_internalAVLset.size(u.data), 20001); Bs_SetM.removeMany(u, Array_data_util.randomRange(0, 200)); -eq("File \"bs_poly_mutable_set_test.ml\", line 42, characters 5-12", Bs_internalAVLset.size(u.data), 19800); +eq("File \"bs_poly_mutable_set_test.ml\", line 45, characters 5-12", Bs_internalAVLset.size(u.data), 19800); Bs_SetM.removeMany(u, Array_data_util.randomRange(0, 1000)); -eq("File \"bs_poly_mutable_set_test.ml\", line 44, characters 5-12", Bs_internalAVLset.size(u.data), 19000); +eq("File \"bs_poly_mutable_set_test.ml\", line 47, characters 5-12", Bs_internalAVLset.size(u.data), 19000); Bs_SetM.removeMany(u, Array_data_util.randomRange(0, 1000)); -eq("File \"bs_poly_mutable_set_test.ml\", line 46, characters 5-12", Bs_internalAVLset.size(u.data), 19000); +eq("File \"bs_poly_mutable_set_test.ml\", line 49, characters 5-12", Bs_internalAVLset.size(u.data), 19000); Bs_SetM.removeMany(u, Array_data_util.randomRange(1000, 10000)); -eq("File \"bs_poly_mutable_set_test.ml\", line 48, characters 5-12", Bs_internalAVLset.size(u.data), 10000); +eq("File \"bs_poly_mutable_set_test.ml\", line 51, characters 5-12", Bs_internalAVLset.size(u.data), 10000); Bs_SetM.removeMany(u, Array_data_util.randomRange(10000, 19999)); -eq("File \"bs_poly_mutable_set_test.ml\", line 50, characters 5-12", Bs_internalAVLset.size(u.data), 1); +eq("File \"bs_poly_mutable_set_test.ml\", line 53, characters 5-12", Bs_internalAVLset.size(u.data), 1); -b("File \"bs_poly_mutable_set_test.ml\", line 51, characters 4-11", Bs_SetM.has(u, 20000)); +b("File \"bs_poly_mutable_set_test.ml\", line 54, characters 4-11", Bs_SetM.has(u, 20000)); Bs_SetM.removeMany(u, Array_data_util.randomRange(10000, 30000)); -b("File \"bs_poly_mutable_set_test.ml\", line 53, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); +b("File \"bs_poly_mutable_set_test.ml\", line 56, characters 4-11", Bs_internalAVLset.isEmpty(u.data)); -var v = Bs_SetM.ofArray(Array_data_util.randomRange(1000, 2000), IntCmp); +var v = ofArray(Array_data_util.randomRange(1000, 2000)); var bs = Bs_Array.map(Array_data_util.randomRange(500, 1499), (function (x) { return Bs_SetM.removeCheck(v, x); @@ -112,9 +123,9 @@ var indeedRemoved = Bs_Array.reduce(bs, 0, (function (acc, x) { } })); -eq("File \"bs_poly_mutable_set_test.ml\", line 60, characters 5-12", indeedRemoved, 500); +eq("File \"bs_poly_mutable_set_test.ml\", line 63, characters 5-12", indeedRemoved, 500); -eq("File \"bs_poly_mutable_set_test.ml\", line 61, characters 5-12", Bs_internalAVLset.size(v.data), 501); +eq("File \"bs_poly_mutable_set_test.ml\", line 64, characters 5-12", Bs_internalAVLset.size(v.data), 501); var cs = Bs_Array.map(Array_data_util.randomRange(500, 2000), (function (x) { return Bs_SetM.addCheck(v, x); @@ -128,42 +139,42 @@ var indeedAded = Bs_Array.reduce(cs, 0, (function (acc, x) { } })); -eq("File \"bs_poly_mutable_set_test.ml\", line 64, characters 5-12", indeedAded, 1000); +eq("File \"bs_poly_mutable_set_test.ml\", line 67, characters 5-12", indeedAded, 1000); -eq("File \"bs_poly_mutable_set_test.ml\", line 65, characters 5-12", Bs_internalAVLset.size(v.data), 1501); +eq("File \"bs_poly_mutable_set_test.ml\", line 68, characters 5-12", Bs_internalAVLset.size(v.data), 1501); var d = { cmp: IntCmp[/* cmp */0], data: Bs_internalAVLset.empty }; -b("File \"bs_poly_mutable_set_test.ml\", line 66, characters 4-11", Bs_internalAVLset.isEmpty(d.data)); +b("File \"bs_poly_mutable_set_test.ml\", line 69, characters 4-11", Bs_internalAVLset.isEmpty(d.data)); -eq("File \"bs_poly_mutable_set_test.ml\", line 67, characters 5-12", Bs_internalAVLset.minimum(v.data), /* Some */[500]); +eq("File \"bs_poly_mutable_set_test.ml\", line 70, characters 5-12", Bs_internalAVLset.minimum(v.data), /* Some */[500]); -eq("File \"bs_poly_mutable_set_test.ml\", line 68, characters 5-12", Bs_internalAVLset.maximum(v.data), /* Some */[2000]); +eq("File \"bs_poly_mutable_set_test.ml\", line 71, characters 5-12", Bs_internalAVLset.maximum(v.data), /* Some */[2000]); -eq("File \"bs_poly_mutable_set_test.ml\", line 69, characters 5-12", Bs_internalAVLset.minUndefined(v.data), 500); +eq("File \"bs_poly_mutable_set_test.ml\", line 72, characters 5-12", Bs_internalAVLset.minUndefined(v.data), 500); -eq("File \"bs_poly_mutable_set_test.ml\", line 70, characters 5-12", Bs_internalAVLset.maxUndefined(v.data), 2000); +eq("File \"bs_poly_mutable_set_test.ml\", line 73, characters 5-12", Bs_internalAVLset.maxUndefined(v.data), 2000); -eq("File \"bs_poly_mutable_set_test.ml\", line 71, characters 5-12", Bs_SetM.reduce(v, 0, (function (x, y) { +eq("File \"bs_poly_mutable_set_test.ml\", line 74, characters 5-12", Bs_SetM.reduce(v, 0, (function (x, y) { return x + y | 0; })), 1876250); -b("File \"bs_poly_mutable_set_test.ml\", line 72, characters 4-11", Bs_List.eq(Bs_internalAVLset.toList(v.data), Bs_List.makeBy(1501, (function (i) { +b("File \"bs_poly_mutable_set_test.ml\", line 75, characters 4-11", Bs_List.eq(Bs_internalAVLset.toList(v.data), Bs_List.makeBy(1501, (function (i) { return i + 500 | 0; })), (function (x, y) { return +(x === y); }))); -eq("File \"bs_poly_mutable_set_test.ml\", line 73, characters 5-12", Bs_internalAVLset.toArray(v.data), Array_data_util.range(500, 2000)); +eq("File \"bs_poly_mutable_set_test.ml\", line 76, characters 5-12", Bs_internalAVLset.toArray(v.data), Array_data_util.range(500, 2000)); -b("File \"bs_poly_mutable_set_test.ml\", line 74, characters 4-11", Bs_internalAVLset.checkInvariantInternal(v.data)); +b("File \"bs_poly_mutable_set_test.ml\", line 77, characters 4-11", Bs_internalAVLset.checkInvariantInternal(v.data)); -eq("File \"bs_poly_mutable_set_test.ml\", line 75, characters 5-12", Bs_SetM.get(v, 3), /* None */0); +eq("File \"bs_poly_mutable_set_test.ml\", line 78, characters 5-12", Bs_SetM.get(v, 3), /* None */0); -eq("File \"bs_poly_mutable_set_test.ml\", line 76, characters 5-12", Bs_SetM.get(v, 1200), /* Some */[1200]); +eq("File \"bs_poly_mutable_set_test.ml\", line 79, characters 5-12", Bs_SetM.get(v, 1200), /* Some */[1200]); var match = Bs_SetM.split(v, 1000); @@ -173,27 +184,27 @@ var bb = match$1[1]; var aa = match$1[0]; -b("File \"bs_poly_mutable_set_test.ml\", line 78, characters 4-11", match[1]); +b("File \"bs_poly_mutable_set_test.ml\", line 81, characters 4-11", match[1]); -b("File \"bs_poly_mutable_set_test.ml\", line 79, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(aa.data), Array_data_util.range(500, 999), (function (x, y) { +b("File \"bs_poly_mutable_set_test.ml\", line 82, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(aa.data), Array_data_util.range(500, 999), (function (x, y) { return +(x === y); }))); -b("File \"bs_poly_mutable_set_test.ml\", line 80, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(bb.data), Array_data_util.range(1001, 2000), (function (x, y) { +b("File \"bs_poly_mutable_set_test.ml\", line 83, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(bb.data), Array_data_util.range(1001, 2000), (function (x, y) { return +(x === y); }))); -b("File \"bs_poly_mutable_set_test.ml\", line 81, characters 5-12", Bs_SetM.subset(aa, v)); +b("File \"bs_poly_mutable_set_test.ml\", line 84, characters 5-12", Bs_SetM.subset(aa, v)); -b("File \"bs_poly_mutable_set_test.ml\", line 82, characters 4-11", Bs_SetM.subset(bb, v)); +b("File \"bs_poly_mutable_set_test.ml\", line 85, characters 4-11", Bs_SetM.subset(bb, v)); var d$1 = Bs_SetM.intersect(aa, bb); -b("File \"bs_poly_mutable_set_test.ml\", line 83, characters 4-11", Bs_internalAVLset.isEmpty(d$1.data)); +b("File \"bs_poly_mutable_set_test.ml\", line 86, characters 4-11", Bs_internalAVLset.isEmpty(d$1.data)); var c = Bs_SetM.removeCheck(v, 1000); -b("File \"bs_poly_mutable_set_test.ml\", line 85, characters 4-11", c); +b("File \"bs_poly_mutable_set_test.ml\", line 88, characters 4-11", c); var match$2 = Bs_SetM.split(v, 1000); @@ -203,82 +214,78 @@ var bb$1 = match$3[1]; var aa$1 = match$3[0]; -b("File \"bs_poly_mutable_set_test.ml\", line 87, characters 4-11", 1 - match$2[1]); +b("File \"bs_poly_mutable_set_test.ml\", line 90, characters 4-11", 1 - match$2[1]); -b("File \"bs_poly_mutable_set_test.ml\", line 88, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(aa$1.data), Array_data_util.range(500, 999), (function (x, y) { +b("File \"bs_poly_mutable_set_test.ml\", line 91, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(aa$1.data), Array_data_util.range(500, 999), (function (x, y) { return +(x === y); }))); -b("File \"bs_poly_mutable_set_test.ml\", line 89, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(bb$1.data), Array_data_util.range(1001, 2000), (function (x, y) { +b("File \"bs_poly_mutable_set_test.ml\", line 92, characters 4-11", Bs_Array.eq(Bs_internalAVLset.toArray(bb$1.data), Array_data_util.range(1001, 2000), (function (x, y) { return +(x === y); }))); -b("File \"bs_poly_mutable_set_test.ml\", line 90, characters 5-12", Bs_SetM.subset(aa$1, v)); +b("File \"bs_poly_mutable_set_test.ml\", line 93, characters 5-12", Bs_SetM.subset(aa$1, v)); -b("File \"bs_poly_mutable_set_test.ml\", line 91, characters 4-11", Bs_SetM.subset(bb$1, v)); +b("File \"bs_poly_mutable_set_test.ml\", line 94, characters 4-11", Bs_SetM.subset(bb$1, v)); var d$2 = Bs_SetM.intersect(aa$1, bb$1); -b("File \"bs_poly_mutable_set_test.ml\", line 92, characters 4-11", Bs_internalAVLset.isEmpty(d$2.data)); +b("File \"bs_poly_mutable_set_test.ml\", line 95, characters 4-11", Bs_internalAVLset.isEmpty(d$2.data)); -function f(param) { - return Bs_SetM.ofArray(param, IntCmp); -} +var aa$2 = ofArray(Array_data_util.randomRange(0, 100)); -var aa$2 = f(Array_data_util.randomRange(0, 100)); - -var bb$2 = f(Array_data_util.randomRange(40, 120)); +var bb$2 = ofArray(Array_data_util.randomRange(40, 120)); var cc = Bs_SetM.union(aa$2, bb$2); -b("File \"bs_poly_mutable_set_test.ml\", line 101, characters 4-11", Bs_SetM.eq(cc, f(Array_data_util.randomRange(0, 120)))); +b("File \"bs_poly_mutable_set_test.ml\", line 104, characters 4-11", Bs_SetM.eq(cc, ofArray(Array_data_util.randomRange(0, 120)))); -b("File \"bs_poly_mutable_set_test.ml\", line 103, characters 4-11", Bs_SetM.eq(Bs_SetM.union(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(21, 40))), f(Array_data_util.randomRange(0, 40)))); +b("File \"bs_poly_mutable_set_test.ml\", line 106, characters 4-11", Bs_SetM.eq(Bs_SetM.union(ofArray(Array_data_util.randomRange(0, 20)), ofArray(Array_data_util.randomRange(21, 40))), ofArray(Array_data_util.randomRange(0, 40)))); var dd = Bs_SetM.intersect(aa$2, bb$2); -b("File \"bs_poly_mutable_set_test.ml\", line 108, characters 4-11", Bs_SetM.eq(dd, f(Array_data_util.randomRange(40, 100)))); +b("File \"bs_poly_mutable_set_test.ml\", line 111, characters 4-11", Bs_SetM.eq(dd, ofArray(Array_data_util.randomRange(40, 100)))); -b("File \"bs_poly_mutable_set_test.ml\", line 109, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(21, 40))), { +b("File \"bs_poly_mutable_set_test.ml\", line 112, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(ofArray(Array_data_util.randomRange(0, 20)), ofArray(Array_data_util.randomRange(21, 40))), { cmp: IntCmp[/* cmp */0], data: Bs_internalAVLset.empty })); -b("File \"bs_poly_mutable_set_test.ml\", line 115, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(f(Array_data_util.randomRange(21, 40)), f(Array_data_util.randomRange(0, 20))), { +b("File \"bs_poly_mutable_set_test.ml\", line 118, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(ofArray(Array_data_util.randomRange(21, 40)), ofArray(Array_data_util.randomRange(0, 20))), { cmp: IntCmp[/* cmp */0], data: Bs_internalAVLset.empty })); -b("File \"bs_poly_mutable_set_test.ml\", line 121, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(f(/* array */[ +b("File \"bs_poly_mutable_set_test.ml\", line 124, characters 4-11", Bs_SetM.eq(Bs_SetM.intersect(ofArray(/* array */[ 1, 3, 4, 5, 7, 9 - ]), f(/* array */[ + ]), ofArray(/* array */[ 2, 4, 5, 6, 8, 10 - ])), f(/* int array */[ + ])), ofArray(/* int array */[ 4, 5 ]))); -b("File \"bs_poly_mutable_set_test.ml\", line 127, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(aa$2, bb$2), f(Array_data_util.randomRange(0, 39)))); +b("File \"bs_poly_mutable_set_test.ml\", line 130, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(aa$2, bb$2), ofArray(Array_data_util.randomRange(0, 39)))); -b("File \"bs_poly_mutable_set_test.ml\", line 129, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(bb$2, aa$2), f(Array_data_util.randomRange(101, 120)))); +b("File \"bs_poly_mutable_set_test.ml\", line 132, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(bb$2, aa$2), ofArray(Array_data_util.randomRange(101, 120)))); -b("File \"bs_poly_mutable_set_test.ml\", line 131, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(f(Array_data_util.randomRange(21, 40)), f(Array_data_util.randomRange(0, 20))), f(Array_data_util.randomRange(21, 40)))); +b("File \"bs_poly_mutable_set_test.ml\", line 134, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(ofArray(Array_data_util.randomRange(21, 40)), ofArray(Array_data_util.randomRange(0, 20))), ofArray(Array_data_util.randomRange(21, 40)))); -b("File \"bs_poly_mutable_set_test.ml\", line 137, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(21, 40))), f(Array_data_util.randomRange(0, 20)))); +b("File \"bs_poly_mutable_set_test.ml\", line 140, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(ofArray(Array_data_util.randomRange(0, 20)), ofArray(Array_data_util.randomRange(21, 40))), ofArray(Array_data_util.randomRange(0, 20)))); -b("File \"bs_poly_mutable_set_test.ml\", line 144, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(f(Array_data_util.randomRange(0, 20)), f(Array_data_util.randomRange(0, 40))), f(Array_data_util.randomRange(0, -1)))); +b("File \"bs_poly_mutable_set_test.ml\", line 147, characters 4-11", Bs_SetM.eq(Bs_SetM.diff(ofArray(Array_data_util.randomRange(0, 20)), ofArray(Array_data_util.randomRange(0, 40))), ofArray(Array_data_util.randomRange(0, -1)))); -var a0 = Bs_SetM.ofArray(Array_data_util.randomRange(0, 1000), IntCmp); +var a0 = ofArray(Array_data_util.randomRange(0, 1000)); var a1 = Bs_SetM.keepBy(a0, (function (x) { return +(x % 2 === 0); @@ -296,11 +303,11 @@ var a4 = match$4[1]; var a3 = match$4[0]; -b("File \"bs_poly_mutable_set_test.ml\", line 159, characters 4-11", Bs_SetM.eq(a1, a3)); +b("File \"bs_poly_mutable_set_test.ml\", line 162, characters 4-11", Bs_SetM.eq(a1, a3)); -b("File \"bs_poly_mutable_set_test.ml\", line 160, characters 4-11", Bs_SetM.eq(a2, a4)); +b("File \"bs_poly_mutable_set_test.ml\", line 163, characters 4-11", Bs_SetM.eq(a2, a4)); -b("File \"bs_poly_mutable_set_test.ml\", line 161, characters 4-11", Bs_List.every(/* :: */[ +b("File \"bs_poly_mutable_set_test.ml\", line 164, characters 4-11", Bs_List.every(/* :: */[ a0, /* :: */[ a1, @@ -331,6 +338,8 @@ var L = 0; var $plus$plus = Bs_SetM.union; +var f = ofArray; + var $eq$tilde = Bs_SetM.eq; exports.suites = suites; @@ -342,6 +351,8 @@ exports.I = I; exports.A = A; exports.IntCmp = IntCmp; exports.L = L; +exports.ofArray = ofArray; +exports.empty = empty; exports.$plus$plus = $plus$plus; exports.f = f; exports.$eq$tilde = $eq$tilde; diff --git a/jscomp/test/bs_poly_mutable_set_test.ml b/jscomp/test/bs_poly_mutable_set_test.ml index fd869c4563..361eddc57e 100644 --- a/jscomp/test/bs_poly_mutable_set_test.ml +++ b/jscomp/test/bs_poly_mutable_set_test.ml @@ -9,9 +9,12 @@ module A = Bs.Array module IntCmp = (val Bs.Cmp.make (fun[@bs] (x:int) y -> compare x y)) module L = Bs.List +let ofArray = N.ofArray ~dict:(module IntCmp) +let empty () = N.empty ~dict:(module IntCmp) + let () = - let u = N.ofArray ~dict:(module IntCmp) (I.range 0 30) in + let u = ofArray (I.range 0 30) in b __LOC__ (N.removeCheck u 0); b __LOC__ (not (N.removeCheck u 0)); b __LOC__ (N.removeCheck u 30); @@ -54,7 +57,7 @@ let () = let () = - let v = N.ofArray ~dict:(module IntCmp) (I.randomRange 1_000 2_000) in + let v = ofArray (I.randomRange 1_000 2_000) in let bs = A.map (I.randomRange 500 1499) (fun [@bs] x -> N.removeCheck v x ) in let indeedRemoved = A.reduce bs 0 (fun [@bs] acc x -> if x then acc + 1 else acc) in eq __LOC__ indeedRemoved 500; @@ -63,7 +66,7 @@ let () = let indeedAded = A.reduce cs 0 (fun[@bs] acc x -> if x then acc + 1 else acc) in eq __LOC__ indeedAded 1000 ; eq __LOC__ (N.size v) 1_501; - b __LOC__ (N.isEmpty (N.empty ~dict:(module IntCmp))); + b __LOC__ (N.isEmpty (empty ())); eq __LOC__ (N.minimum v) (Some 500); eq __LOC__ (N.maximum v) (Some 2000); eq __LOC__ (N.minUndefined v) (Js.Undefined.return 500); @@ -92,7 +95,7 @@ let () = b __LOC__ (N.isEmpty (N.intersect aa bb)) let (++) = N.union -let f = N.ofArray ~dict:(module IntCmp) +let f = ofArray let (=~) = N.eq let () = let aa = f (I.randomRange 0 100) in @@ -110,13 +113,13 @@ let () = (N.intersect (f @@ I.randomRange 0 20) (f @@ I.randomRange 21 40) - =~ (N.empty (module IntCmp)) + =~ (empty ()) ); b __LOC__ (N.intersect (f @@ I.randomRange 21 40) (f @@ I.randomRange 0 20) - =~ (N.empty (module IntCmp)) + =~ (empty ()) ); b __LOC__ (N.intersect @@ -149,7 +152,7 @@ let () = ) let () = - let a0 = N.ofArray ~dict:(module IntCmp) (I.randomRange 0 1000) in + let a0 = ofArray (I.randomRange 0 1000) in let a1,a2 = ( N.keepBy a0 (fun [@bs] x -> x mod 2 = 0), diff --git a/jscomp/test/bs_set_int_test.js b/jscomp/test/bs_set_int_test.js index 41bf59e4a5..c9f3cea847 100644 --- a/jscomp/test/bs_set_int_test.js +++ b/jscomp/test/bs_set_int_test.js @@ -309,6 +309,59 @@ var a11 = Bs_SetInt.removeMany(a9, Array_data_util.randomRange(0, 2000)); b("File \"bs_set_int_test.ml\", line 153, characters 4-11", Bs_SetInt.isEmpty(a11)); +var match$5 = Bs_SetInt.split(Bs_SetInt.empty, 0); + +var match$6 = match$5[0]; + +b("File \"bs_set_int_test.ml\", line 157, characters 4-11", Bs_SetInt.isEmpty(match$6[0])); + +b("File \"bs_set_int_test.ml\", line 158, characters 4-11", Bs_SetInt.isEmpty(match$6[1])); + +b("File \"bs_set_int_test.ml\", line 159, characters 4-11", 1 - match$5[1]); + +var v$12 = Bs_SetInt.ofArray(Array_data_util.randomRange(0, 2000)); + +var v0 = Bs_SetInt.ofArray(Array_data_util.randomRange(0, 2000)); + +var v1 = Bs_SetInt.ofArray(Array_data_util.randomRange(1, 2001)); + +var v2 = Bs_SetInt.ofArray(Array_data_util.randomRange(3, 2002)); + +var v3 = Bs_SetInt.removeMany(v2, /* int array */[ + 2002, + 2001 + ]); + +var us = Bs_Array.map(Array_data_util.randomRange(1000, 3000), (function (x) { + return Bs_SetInt.has(v$12, x); + })); + +var counted = Bs_Array.reduce(us, 0, (function (acc, x) { + if (x) { + return acc + 1 | 0; + } else { + return acc; + } + })); + +eq("File \"bs_set_int_test.ml\", line 169, characters 5-12", counted, 1001); + +b("File \"bs_set_int_test.ml\", line 170, characters 4-11", Bs_SetInt.eq(v$12, v0)); + +b("File \"bs_set_int_test.ml\", line 171, characters 4-11", +(Bs_SetInt.cmp(v$12, v0) === 0)); + +b("File \"bs_set_int_test.ml\", line 172, characters 4-11", +(Bs_SetInt.cmp(v$12, v1) < 0)); + +b("File \"bs_set_int_test.ml\", line 173, characters 4-11", +(Bs_SetInt.cmp(v$12, v2) > 0)); + +b("File \"bs_set_int_test.ml\", line 174, characters 4-11", Bs_SetInt.subset(v3, v0)); + +b("File \"bs_set_int_test.ml\", line 175, characters 4-11", 1 - Bs_SetInt.subset(v1, v0)); + +eq("File \"bs_set_int_test.ml\", line 176, characters 5-12", Bs_SetInt.get(v$12, 30), /* Some */[30]); + +eq("File \"bs_set_int_test.ml\", line 177, characters 5-12", Bs_SetInt.get(v$12, 3000), /* None */0); + Mt.from_pair_suites("bs_set_int_test.ml", suites[0]); var N = 0; diff --git a/jscomp/test/bs_set_int_test.ml b/jscomp/test/bs_set_int_test.ml index 1100518b7d..99b1b92687 100644 --- a/jscomp/test/bs_set_int_test.ml +++ b/jscomp/test/bs_set_int_test.ml @@ -152,5 +152,27 @@ let () = let a11 = N.removeMany a9 (I.randomRange 0 2000) in b __LOC__ (N.isEmpty a11) +let () = + let (aa,bb), pres = N.split N.empty 0 in + b __LOC__ (N.isEmpty aa); + b __LOC__ (N.isEmpty bb); + b __LOC__ (not pres) +let () = + let v = N.ofArray (I.randomRange 0 2_000) in + let v0 = N.ofArray (I.randomRange 0 2_000) in + let v1 = N.ofArray (I.randomRange 1 2_001) in + let v2 = N.ofArray (I.randomRange 3 2_002) in + let v3 = N.removeMany v2 [|2_002; 2_001|] in + let us = A.map (I.randomRange 1_000 3_000) (fun [@bs] x -> N.has v x) in + let counted = A.reduce us 0 (fun [@bs] acc x -> if x then acc + 1 else acc ) in + eq __LOC__ counted 1_001 ; + b __LOC__ (N.eq v v0) ; + b __LOC__ (N.cmp v v0 = 0); + b __LOC__ (N.cmp v v1 < 0); + b __LOC__ (N.cmp v v2 > 0); + b __LOC__ (N.subset v3 v0); + b __LOC__ (not (N.subset v1 v0)); + eq __LOC__ (N.get v 30 ) (Some 30); + eq __LOC__ (N.get v 3_000 ) None ;; Mt.from_pair_suites __FILE__ !suites diff --git a/lib/js/bs_Map.js b/lib/js/bs_Map.js index 261ea4916c..3fa67089bb 100644 --- a/lib/js/bs_Map.js +++ b/lib/js/bs_Map.js @@ -28,14 +28,10 @@ function removeMany(m, x) { var cmp = m.cmp; var odata = m.data; var newData = Bs_SortedMapDict.removeMany(odata, x, cmp); - if (newData === odata) { - return m; - } else { - return { - cmp: cmp, - data: newData - }; - } + return { + cmp: cmp, + data: newData + }; } function set(m, key, d) { diff --git a/lib/js/bs_MapInt.js b/lib/js/bs_MapInt.js index 769ba93602..38a0a431ed 100644 --- a/lib/js/bs_MapInt.js +++ b/lib/js/bs_MapInt.js @@ -118,7 +118,7 @@ function remove(n, x) { } } -function removeArray(t, keys) { +function removeMany(t, keys) { var len = keys.length; if (t !== null) { var _t = t; @@ -254,7 +254,7 @@ exports.getUndefined = getUndefined; exports.getWithDefault = getWithDefault; exports.getExn = getExn; exports.remove = remove; -exports.removeArray = removeArray; +exports.removeMany = removeMany; exports.set = set; exports.update = update; exports.mergeArray = mergeArray; diff --git a/lib/js/bs_MapString.js b/lib/js/bs_MapString.js index 8f7595c1d2..5a45ee9b1d 100644 --- a/lib/js/bs_MapString.js +++ b/lib/js/bs_MapString.js @@ -118,7 +118,7 @@ function remove(n, x) { } } -function removeArray(t, keys) { +function removeMany(t, keys) { var len = keys.length; if (t !== null) { var _t = t; @@ -254,7 +254,7 @@ exports.getUndefined = getUndefined; exports.getWithDefault = getWithDefault; exports.getExn = getExn; exports.remove = remove; -exports.removeArray = removeArray; +exports.removeMany = removeMany; exports.set = set; exports.update = update; exports.mergeArray = mergeArray; diff --git a/lib/js/bs_Set.js b/lib/js/bs_Set.js index 37632c5a01..2331f849a4 100644 --- a/lib/js/bs_Set.js +++ b/lib/js/bs_Set.js @@ -231,6 +231,10 @@ function checkInvariantInternal(d) { return Bs_SortedSetDict.checkInvariantInternal(d.data); } +var Int = 0; + +var $$String = 0; + exports.empty = empty; exports.ofArray = ofArray; exports.ofSortedArrayUnsafe = ofSortedArrayUnsafe; @@ -267,4 +271,6 @@ exports.checkInvariantInternal = checkInvariantInternal; exports.getData = getData; exports.getDict = getDict; exports.packDictData = packDictData; +exports.Int = Int; +exports.$$String = $$String; /* No side effect */