add 'textLength' value to line_gap.sml's string_iterator, and remove function to check if iterator is t end

This commit is contained in:
2025-10-08 06:49:39 +01:00
parent 1d6213636e
commit ec62efb40c

View File

@@ -35,12 +35,15 @@ sig
val lineNumberToIdx: int * t -> int val lineNumberToIdx: int * t -> int
type string_iterator = type string_iterator =
{idx: int, leftStrings: string list, rightStrings: string list} { idx: int
, leftStrings: string list
, rightStrings: string list
, textLength: int
}
val makeStringIterator: t -> string_iterator val makeStringIterator: t -> string_iterator
val moveIteratorToIdx: int * string_iterator -> string_iterator val moveIteratorToIdx: int * string_iterator -> string_iterator
val subIterator: int * string_iterator -> char val subIterator: int * string_iterator -> char
val isIteratorAtEnd: string_iterator -> bool
(* for testing *) (* for testing *)
val verifyIndex: t -> unit val verifyIndex: t -> unit
@@ -3346,47 +3349,72 @@ struct
end end
type string_iterator = type string_iterator =
{idx: int, leftStrings: string list, rightStrings: string list} { idx: int
, leftStrings: string list
, rightStrings: string list
, textLength: int
}
fun makeStringIterator ({idx, leftStrings, rightStrings, ...}: t) = fun makeStringIterator ({idx, leftStrings, rightStrings, textLength, ...}: t) =
{idx = idx, leftStrings = leftStrings, rightStrings = rightStrings} { idx = idx
, leftStrings = leftStrings
, rightStrings = rightStrings
, textLength = textLength
}
fun moveIteratorLeft (findIdx, idx, leftStrings, rightStrings) = fun moveIteratorLeft (findIdx, idx, leftStrings, rightStrings, textLength) =
case leftStrings of case leftStrings of
hd :: tl => hd :: tl =>
let let
val prevIdx = idx - String.size hd val prevIdx = idx - String.size hd
in in
if findIdx < prevIdx then if findIdx < prevIdx then
moveIteratorLeft (findIdx, prevIdx, tl, hd :: rightStrings) moveIteratorLeft
(findIdx, prevIdx, tl, hd :: rightStrings, textLength)
else else
{idx = idx, leftStrings = leftStrings, rightStrings = rightStrings} { idx = idx
, leftStrings = leftStrings
, rightStrings = rightStrings
, textLength = textLength
}
end end
| [] => {idx = idx, leftStrings = leftStrings, rightStrings = rightStrings} | [] =>
{ idx = idx
, leftStrings = leftStrings
, rightStrings = rightStrings
, textLength = textLength
}
fun moveIteratorRight (findIdx, idx, leftStrings, rightStrings) = fun moveIteratorRight (findIdx, idx, leftStrings, rightStrings, textLength) =
case rightStrings of case rightStrings of
hd :: tl => hd :: tl =>
let let
val nextIdx = idx + String.size hd val nextIdx = idx + String.size hd
in in
if findIdx > nextIdx then if findIdx > nextIdx then
moveIteratorRight (findIdx, nextIdx, hd :: leftStrings, tl) moveIteratorRight
(findIdx, nextIdx, hd :: leftStrings, tl, textLength)
else else
{idx = idx, leftStrings = leftStrings, rightStrings = rightStrings} { idx = idx
, leftStrings = leftStrings
, rightStrings = rightStrings
, textLength = textLength
}
end end
| [] => {idx = idx, leftStrings = leftStrings, rightStrings = rightStrings} | [] =>
{ idx = idx
, leftStrings = leftStrings
, rightStrings = rightStrings
, textLength = textLength
}
fun moveIteratorToIdx (findIdx, {idx, leftStrings, rightStrings}) = fun moveIteratorToIdx (findIdx, {idx, leftStrings, rightStrings, textLength}) =
if findIdx < idx then if findIdx < idx then
moveIteratorLeft (findIdx, idx, leftStrings, rightStrings) moveIteratorLeft (findIdx, idx, leftStrings, rightStrings, textLength)
else else
moveIteratorRight (findIdx, idx, leftStrings, rightStrings) moveIteratorRight (findIdx, idx, leftStrings, rightStrings, textLength)
fun isIteratorAtEnd {idx = _, leftStrings = _, rightStrings} = fun subIterator (findIdx, {idx, leftStrings, rightStrings, textLength = _}) =
List.null rightStrings
fun subIterator (findIdx, {idx, leftStrings, rightStrings}) =
if findIdx >= idx then if findIdx >= idx then
case rightStrings of case rightStrings of
hd :: tl => subRight (findIdx, idx, hd, tl) hd :: tl => subRight (findIdx, idx, hd, tl)