progress making string iterator for line_gap.sml

This commit is contained in:
2025-10-08 06:12:40 +01:00
parent 56a469e578
commit 3345f618ca

View File

@@ -34,6 +34,12 @@ sig
val idxToLineNumber: int * t -> int
val lineNumberToIdx: int * t -> int
type string_iterator =
{idx: int, leftStrings: string list, rightStrings: string list}
val makeStringIterator: t -> string_iterator
val moveIteratorToIdx: int * string_iterator -> string_iterator
(* for testing *)
val verifyIndex: t -> unit
val verifyLines: t -> unit
@@ -3337,6 +3343,44 @@ struct
(findLine, curIdx, curLine, rightStrings, rightLines)
end
type string_iterator =
{idx: int, leftStrings: string list, rightStrings: string list}
fun makeStringIterator ({idx, leftStrings, rightStrings, ...}: t) =
{idx = idx, leftStrings = leftStrings, rightStrings = rightStrings}
fun moveIteratorLeft (findIdx, idx, leftStrings, rightStrings) =
case leftStrings of
hd :: tl =>
let
val prevIdx = idx - String.size hd
in
if findIdx < prevIdx then
moveIteratorLeft (findIdx, prevIdx, tl, hd :: rightStrings)
else
{idx = idx, leftStrings = leftStrings, rightStrings = rightStrings}
end
| [] => {idx = idx, leftStrings = leftStrings, rightStrings = rightStrings}
fun moveIteratorRight (findIdx, idx, leftStrings, rightStrings) =
case rightStrings of
hd :: tl =>
let
val nextIdx = idx + String.size hd
in
if findIdx > nextIdx then
moveIteratorRight (findIdx, nextIdx, hd :: leftStrings, tl)
else
{idx = idx, leftStrings = leftStrings, rightStrings = rightStrings}
end
| [] => {idx = idx, leftStrings = leftStrings, rightStrings = rightStrings}
fun moveIteratorToIdx (findIdx, {idx, leftStrings, rightStrings}) =
if findIdx < idx then
moveIteratorLeft (findIdx, idx, leftStrings, rightStrings)
else
moveIteratorRight (findIdx, idx, leftStrings, rightStrings)
(* TEST CODE *)
local
fun lineBreaksToString vec =