From 11df1a6bcdd46de0059cd133e0f5b03d8e0c6c15 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Wed, 13 Nov 2024 03:49:12 +0000 Subject: [PATCH] done implementing delete function in SearchList --- fcore/search-list.sml | 86 +++++++++++++++++++++++++++++++++++++++--- shf | Bin 1246232 -> 1246232 bytes 2 files changed, 81 insertions(+), 5 deletions(-) diff --git a/fcore/search-list.sml b/fcore/search-list.sml index f0aa553..43f4eb0 100644 --- a/fcore/search-list.sml +++ b/fcore/search-list.sml @@ -180,6 +180,9 @@ struct in if finish > last then delRightFromHere (finish, left, tl) + else if finish < Vector.sub (hd, 0) then + (* finish < first *) + {left = left, right = right} else if finish < last then let val delpoint = BinSearch.equalOrMore (finish, hd) @@ -202,6 +205,9 @@ struct in if start > last then moveRightAndDelete (start, finish, joinEndOfLeft (hd, left), tl) + else if start > Vector.sub (hd, 0) then + (* start > first *) + {left = left, right = right} else if start < last then if finish > last then (* delete part of hd, and continue deleting rightwards *) @@ -217,14 +223,16 @@ struct let val startpoint = BinSearch.equalOrMore (start, hd) val finishpoint = BinSearch.equalOrMore (finish, hd) - val lhd = VectorSlice.slice (hd, 0, SOME (Vector.length hd - startpoint)) + val lhd = VectorSlice.slice (hd, 0, SOME + (Vector.length hd - startpoint)) val rhd = VectorSlice.slice (hd, finishpoint, SOME - (Vector.length hd - finishpoint)) + (Vector.length hd - finishpoint)) val lhd = VectorSlice.vector lhd val rhd = VectorSlice.vector rhd in - { left = joinEndOfLeft (lhd, left), right = joinStartOfRight - (rhd, right)} + { left = joinEndOfLeft (lhd, left) + , right = joinStartOfRight (rhd, right) + } end else (* finish = last, which means delete from last part of hd *) @@ -235,7 +243,7 @@ struct in {left = left, right = joinStartOfRight (newHd, tl)} end - else + else (* start = last, meaning delete last and then continue deleting right*) let val length = Vector.length hd - 1 @@ -245,6 +253,7 @@ struct delRightFromHere (finish, joinEndOfLeft (newHd, left), tl) end end + | [] => {left = left, right = right} fun delLeftFromHere (start, left, right) = case left of @@ -254,6 +263,9 @@ struct in if start < first then delLeftFromHere (start, tl, right) + else if start > Vector.sub (hd, Vector.length hd - 1) then + (* start > last *) + {left = left, right = right} else if start > first then let val delpoint = BinSearch.equalOrMore (start, hd) @@ -269,6 +281,70 @@ struct end | [] => {left = left, right = right} + fun moveLeftAndDelete (start, finish, left, right) = + case left of + hd :: tl => + let + val first = Vector.sub (hd, 0) + in + if finish < first then + moveLeftAndDelete (start, finish, tl, joinStartOfRight (hd, right)) + else if finish > Vector.sub (hd, Vector.length hd - 1) then + (* finish > last *) + {left = left, right = right} + else if finish > first then + if start < first then + (* delete from start of hd and continue deleting leftwards *) + let + val startpoint = BinSearch.equalOrMore (finish, hd) + val len = Vector.length hd - startpoint + val newHd = VectorSlice.slice (hd, startpoint, SOME len) + val newHd = VectorSlice.vector newHd + in + delLeftFromHere (start, tl, joinStartOfRight (newHd, right)) + end + else if start > first then + (* delete from middle and then return *) + let + val llen = BinSearch.equalOrMore (start, hd) + val rstart = BinSearch.equalOrMore (finish, hd) + val rlen = Vector.length hd - rstart + val lhd = VectorSlice.slice (hd, 0, SOME llen) + val rhd = VectorSlice.slice (hd, rstart, SOME rlen) + val lhd = VectorSlice.vector lhd + val rhd = VectorSlice.vector rhd + in + { left = joinEndOfLeft (lhd, tl) + , right = joinStartOfRight (rhd, right) + } + end + else + (* start = first and finish > first + * have to delete from start of hd and return*) + let + val startpoint = BinSearch.equalOrMore (finish, hd) + val len = Vector.length hd - startpoint + val newHd = VectorSlice.slice (hd, startpoint, SOME len) + val newHd = VectorSlice.vector newHd + in + {left = joinEndOfLeft (newHd, tl), right = right} + end + else + (* finish = first *) + let + val len = Vector.length hd - 1 + val newHd = VectorSlice.slice (hd, 1, SOME len) + val newHd = VectorSlice.vector newHd + in + if start < first then + delLeftFromHere (start, tl, joinStartOfRight (newHd, right)) + else + (* start = first *) + {left = tl, right = joinStartOfRight (newHd, right)} + end + end + | [] => {left = left, right = right} + fun delFromLeftAndRight (start, finish, left, right) = let val {left, right} = delRightFromHere (finish, left, right) in delLeftFromHere (start, left, right) diff --git a/shf b/shf index 9203db6a62076e3e7ad26f519695fb838db057e7..ef3f89e9bdc2b743f202fcd2d01d74b2491602cf 100755 GIT binary patch delta 11137 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 delta 11151 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