From cf18916d001c39c7756dac130b23667e1009567a Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sun, 14 Jul 2024 16:39:44 +0100 Subject: [PATCH] additional progress with delete --- src/line_gap.sml | 54 +++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/src/line_gap.sml b/src/line_gap.sml index c7a11e6..aa6d7ad 100644 --- a/src/line_gap.sml +++ b/src/line_gap.sml @@ -1609,17 +1609,61 @@ struct ) end else if prevIdx < start then - (* Equivalent in gap_buffer.sml is line 350. *) - (* We want to delete in the middle of lefStringsHd. *) + (* We want to delete in the middle of leftStringsHd. + * We also have to delete in the middle of leftLinesHd in order to + * do this. *) let val sub1Length = start - prevIdx val sub1 = String.substring (leftStringsHd, 0, sub1Length) val sub2Start = finish - prevIdx - val sub2 = String.substring (leftStringsHd, sub2Start, - String.size leftStringsHd - sub2Start) + val sub2 = String.substring + ( leftStringsHd + , sub2Start + , String.size leftStringsHd - sub2Start + ) + + val sub1Lines = + let + val midpoint = binSearch (String.size sub1 - 1, leftLinesHd) + in + if midpoint >= 0 then + let + val slice = VectorSlice.slice + (leftLinesHd, 0, SOME (midpoint + 1)) + in + VectorSlice.vector slice + end + else + Vector.fromList [] + end + + val sub2Lines = + let + val midpoint = forwardBinSearch (sub2Start, leftLinesHd) + in + if midpoint < Vector.length leftLinesHd then + Vector.tabulate + ( Vector.length leftLinesHd - midpoint + , fn idx => + Vector.sub (leftLinesHd, idx + midpoint) - sub2Start + ) + else + Vector.fromList [] + end in - 0 + { idx = prevIdx + String.size sub1 + , line = + (curLine - Vector.length leftLinesHd) + + Vector.length sub1Lines + , leftStrings = sub1 :: leftStringsTl + , leftLines = sub1Lines :: leftLinesTl + , rightStrings = sub2 :: rightStrings + , rightLines = sub2Lines :: rightLines + } end + else + (* Equivalent in gap_buffer.sml is line 365. *) + 0 else 0 end