From 9b45f43948cc6c0751a8e74fe243e09e7ae37d96 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Tue, 12 Nov 2024 09:14:39 +0000 Subject: [PATCH] start implementing delete in search-list.sml (with top-down programming, calling functions that do not yet exist) --- fcore/search-list.sml | 94 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 82 insertions(+), 12 deletions(-) diff --git a/fcore/search-list.sml b/fcore/search-list.sml index 849a6ef..2bc08f6 100644 --- a/fcore/search-list.sml +++ b/fcore/search-list.sml @@ -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