start implementing delete in search-list.sml (with top-down programming, calling functions that do not yet exist)

This commit is contained in:
2024-11-12 09:14:39 +00:00
parent 3b81d087f0
commit 9b45f43948

View File

@@ -144,17 +144,12 @@ struct
hd :: tl =>
if num < Vector.sub (hd, 0) then
(* continue *)
helpGoToNumLeft
( num, tl
, joinStartOfRight (hd, right)
)
helpGoToNumLeft (num, tl, joinStartOfRight (hd, right))
else
(* greater or equal to first element so return.
* Note: caller which destructures list expects found hd to always be
* on right. *)
{ left = tl
, right = joinStartOfRight (hd, right)
}
{left = tl, right = joinStartOfRight (hd, right)}
| [] => {left = left, right = right}
fun helpGoToNumRight (num, left, right) =
@@ -162,11 +157,7 @@ struct
hd :: tl =>
if num > Vector.sub (hd, Vector.length hd - 1) then
(* continue *)
helpGoToNumRight
( num
, joinEndOfLeft (hd, left)
, tl
)
helpGoToNumRight (num, joinEndOfLeft (hd, left), tl)
else
(* less than or equal to last element so return *)
{left = left, right = right}
@@ -180,4 +171,83 @@ struct
else
helpGoToNumLeft (num, left, right)
| [] => helpGoToNumLeft (num, left, right)
fun del (start, finish, left, right) =
case right of
rhd :: rtl =>
let
val rfirst = Vector.sub (rhd, 0)
in
if start < rfirst then
(case left of
lhd :: ltl =>
let
val llast = Vector.sub (lhd, Vector.length lhd - 1)
in
if
start < llast
then
if finish < rfirst then
(* start < rfirst and start < llast and finish < rfirst
* move left and delete *)
moveLeftAndDelete (start, finish, left, right)
else
(* start < rfirst and start < llast and finish >= rfirst
* in middle; delete from both sides *)
delFromLeftAndRight (start, finish, left, right)
else if
start = llast
then
if finish < rfirst then
(* start < rfirst, start = llast, and finish < rfirst
* so just have to delete left from here *)
deleteLeftFromHere (start, left, right)
else
(* start < rfirst, start = llast, finish >= rfirst
* in middle; delete from both sides *)
delFromLeftAndRight (start, finish, left, right)
else (* start > llast and start < rfirst *) if
finish >= rfirst
then
(* delete right from here *)
delRightFromHere (finish, left, right)
else
(* start < rfirst and finish < rfirst
* so just return *)
{left = left, right = right}
end
| [] =>
(* start < rfirst
* but left is empty.
* All we can do is 1. Delete right or 2. Return *)
if finish < rfirst then {left = left, right = right}
else delRightFromHere (finish, left, right))
else if start = rfirst then
delRightFromHere (finish, left, right)
else
(* start > rfirst
* move right and then start deleting *)
moveRightAndDelete (start, finish, left, right)
end
| [] =>
(case left of
lhd :: ltl =>
let
val llast = Vector.sub (lhd, Vector.length lhd - 1)
in
if start < llast then
if finish <= llast then
moveRightAndDelete (start, finish, left, right)
else
deleteLeftFromHere (finish, left, right)
else
moveRightAndDelete (start, finish, left, right)
end
| [] =>
(* left and right are both empty *)
{left = left, right = right})
fun delete (start, length, {left, right}: t) =
if length > 0 then del (start, start + length, left, right)
else {left = left, right = right}
end