progress making string iterator for line_gap.sml
This commit is contained in:
@@ -34,6 +34,12 @@ sig
|
|||||||
val idxToLineNumber: int * t -> int
|
val idxToLineNumber: int * t -> int
|
||||||
val lineNumberToIdx: 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 *)
|
(* for testing *)
|
||||||
val verifyIndex: t -> unit
|
val verifyIndex: t -> unit
|
||||||
val verifyLines: t -> unit
|
val verifyLines: t -> unit
|
||||||
@@ -3337,6 +3343,44 @@ struct
|
|||||||
(findLine, curIdx, curLine, rightStrings, rightLines)
|
(findLine, curIdx, curLine, rightStrings, rightLines)
|
||||||
end
|
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 *)
|
(* TEST CODE *)
|
||||||
local
|
local
|
||||||
fun lineBreaksToString vec =
|
fun lineBreaksToString vec =
|
||||||
|
|||||||
Reference in New Issue
Block a user