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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user