add function to go to start of line_gap.sml

This commit is contained in:
2024-10-05 14:17:15 +01:00
parent 2a5a5b0787
commit 36edbb6dee

View File

@@ -19,6 +19,8 @@ sig
val insert: int * string * t -> t val insert: int * string * t -> t
val append: string * t -> t val append: string * t -> t
val goToStart: t -> t
(* for testing *) (* for testing *)
val verifyIndex: t -> unit val verifyIndex: t -> unit
val verifyLines: t -> unit val verifyLines: t -> unit
@@ -1943,6 +1945,69 @@ struct
buffer buffer
end end
fun helpGoToStart
(idx, line, leftStrings, leftLines, rightStrings, rightLines) =
case (leftStrings, leftLines) of
(lStrHd :: lStrTl, lLnHd :: lLnTl) =>
(case (rightStrings, rightLines) of
(rStrHd :: rStrTl, rLnHd :: rLnTl) =>
if isInLimit (lStrHd, rStrHd, lLnHd, rLnHd) then
(* join if possible *)
let
val newRstrHd = lStrHd ^ rStrHd
val newRlnHd =
Vector.tabulate
( Vector.length lLnHd + Vector.length rLnHd
, fn lnIdx =>
if lnIdx < Vector.length lLnHd then
Vector.sub (lLnHd, lnIdx)
else
Vector.sub (rLnHd, lnIdx - Vector.length lLnHd)
+ String.size lStrHd
)
in
helpGoToStart
( idx - String.size lStrHd
, line - Vector.length lLnHd
, lStrTl
, lLnTl
, newRstrHd :: rStrTl
, newRlnHd :: rLnTl
)
end
else
helpGoToStart
( idx - String.size lStrHd
, line - Vector.length lLnHd
, lStrTl
, lLnTl
, lStrHd :: rightStrings
, lLnHd :: rightLines
)
| (_, _) =>
(* rightStrings and rightLines are both empty *)
helpGoToStart
( idx - String.size lStrHd
, line - Vector.length lLnHd
, lStrTl
, lLnTl
, [lStrHd]
, [lLnHd]
))
| (_, _) =>
(* left strings are empty, meaning we are at start and can return *)
{ idx = idx
, line = line
, leftStrings = []
, leftLines = []
, rightStrings = rightStrings
, rightLines = rightLines
}
fun goToStart
({idx, line, leftStrings, leftLines, rightStrings, rightLines}: t) =
helpGoToStart (idx, line, leftStrings, leftLines, rightStrings, rightLines)
(* TEST CODE *) (* TEST CODE *)
local local
fun lineBreaksToString vec = fun lineBreaksToString vec =