progress making string iterator for line_gap.sml
This commit is contained in:
@@ -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 =
|
||||
|
||||
Reference in New Issue
Block a user