in fcore/search-list.sml, only call 'insMiddle' function if new value is not in middle
This commit is contained in:
@@ -63,9 +63,8 @@ struct
|
|||||||
new :: right
|
new :: right
|
||||||
| [] => new :: right
|
| [] => new :: right
|
||||||
|
|
||||||
fun insMiddle (new, hd, tl, left, right) =
|
fun insMiddle (new, middle, hd, tl, left, right) =
|
||||||
let
|
let
|
||||||
val middle = BinSearch.equalOrMore (new, hd)
|
|
||||||
val leftSlice = VectorSlice.slice (hd, 0, SOME middle)
|
val leftSlice = VectorSlice.slice (hd, 0, SOME middle)
|
||||||
val rightLength = Vector.length hd - middle
|
val rightLength = Vector.length hd - middle
|
||||||
val rightSlice = VectorSlice.slice (hd, middle, SOME rightLength)
|
val rightSlice = VectorSlice.slice (hd, middle, SOME rightLength)
|
||||||
@@ -111,8 +110,17 @@ struct
|
|||||||
val last = Vector.sub (hd, Vector.length hd - 1)
|
val last = Vector.sub (hd, Vector.length hd - 1)
|
||||||
in
|
in
|
||||||
if new < last then
|
if new < last then
|
||||||
(* have to insert in middle *)
|
(* new is or should be in middle *)
|
||||||
insMiddle (new, hd, tl, left, right)
|
let
|
||||||
|
val middle = BinSearch.equalOrMore (new, hd)
|
||||||
|
in
|
||||||
|
if new <> Vector.sub (hd, middle) then
|
||||||
|
(* not in middle, so insert *)
|
||||||
|
insMiddle (new, middle, hd, tl, left, right)
|
||||||
|
else
|
||||||
|
(* new is in middle, so just return *)
|
||||||
|
{left = left, right = right}
|
||||||
|
end
|
||||||
else if new > last then
|
else if new > last then
|
||||||
(* have to insert new at end of left
|
(* have to insert new at end of left
|
||||||
* or start of right (both are equivalent) *)
|
* or start of right (both are equivalent) *)
|
||||||
@@ -146,7 +154,16 @@ struct
|
|||||||
in
|
in
|
||||||
if new > first then
|
if new > first then
|
||||||
(* have to insert in middle *)
|
(* have to insert in middle *)
|
||||||
insMiddle (new, hd, tl, left, right)
|
let
|
||||||
|
val middle = BinSearch.equalOrMore (new, hd)
|
||||||
|
in
|
||||||
|
if new <> Vector.sub (hd, middle) then
|
||||||
|
(* not in middle, so insert *)
|
||||||
|
insMiddle (new, middle, hd, tl, left, right)
|
||||||
|
else
|
||||||
|
(* new is in middle, so return *)
|
||||||
|
{left = left, right = right}
|
||||||
|
end
|
||||||
else if new < first then
|
else if new < first then
|
||||||
(* have to insert new at start of right
|
(* have to insert new at start of right
|
||||||
* or end of left (both are equivalent) *)
|
* or end of left (both are equivalent) *)
|
||||||
|
|||||||
Reference in New Issue
Block a user