add backtract functionality for range search as well

This commit is contained in:
2025-09-06 23:05:11 +01:00
parent 435c520955
commit 9ba3e8464b

View File

@@ -79,7 +79,8 @@ struct
loopSearch loopSearch
(pos + 1, hd, absIdx + 1, tl, acc, 0, searchString, prevTl) (pos + 1, hd, absIdx + 1, tl, acc, 0, searchString, prevTl)
else else
loopSearch (pos, hd, absIdx, tl, acc, 0, searchString, prevTl)) backtrackFull
(pos, hd, absIdx, tl, acc, searchPos, searchString, prevTl))
end end
fun search ({rightStrings, leftStrings, ...}: LineGap.t, searchString) = fun search ({rightStrings, leftStrings, ...}: LineGap.t, searchString) =
@@ -93,11 +94,64 @@ struct
if String.size searchString > 0 then search (buffer, searchString) if String.size searchString > 0 then search (buffer, searchString)
else empty else empty
fun loopRange (pos, hd, absIdx, tl, acc, searchPos, searchString, finish) = fun backtrackRange
(pos, hd, absIdx, tl, acc, searchPos, searchString, finish, prevTl) =
if searchPos <= 1 then
loopRange (pos, hd, absIdx, tl, acc, 0, searchString, finish, prevTl)
else if pos < 0 then
case prevTl of
prevHd :: prevTl =>
let
val tl = hd :: tl
in
backtrackRange
( String.size prevHd - 1
, prevHd
, absIdx
, tl
, acc
, searchPos
, searchString
, finish
, prevTl
)
end
| [] =>
(* Should never be called *)
raise Fail "SearchList.backtrackRange error: line 120\n"
else
backtrackRange
( pos - 1
, hd
, absIdx - 1
, tl
, acc
, searchPos - 1
, searchString
, finish
, prevTl
)
and loopRange
(pos, hd, absIdx, tl, acc, searchPos, searchString, finish, prevTl) =
if pos = String.size hd then if pos = String.size hd then
case tl of case tl of
hd :: tl => newHd :: newTl =>
loopRange (0, hd, absIdx, tl, acc, searchPos, searchString, finish) let
val prevTl = hd :: prevTl
in
loopRange
( 0
, newHd
, absIdx
, newTl
, acc
, searchPos
, searchString
, finish
, prevTl
)
end
| [] => PersistentVector.toVector acc | [] => PersistentVector.toVector acc
else if absIdx = finish then else if absIdx = finish then
PersistentVector.toVector acc PersistentVector.toVector acc
@@ -114,7 +168,16 @@ struct
val acc = PersistentVector.append (foundIdx, acc) val acc = PersistentVector.append (foundIdx, acc)
in in
loopRange loopRange
(pos + 1, hd, absIdx + 1, tl, acc, 0, searchString, finish) ( pos + 1
, hd
, absIdx + 1
, tl
, acc
, 0
, searchString
, finish
, prevTl
)
end end
else else
loopRange loopRange
@@ -126,13 +189,33 @@ struct
, searchPos + 1 , searchPos + 1
, searchString , searchString
, finish , finish
, prevTl
) )
else else
((if searchPos = 0 then ((if searchPos = 0 then
loopRange loopRange
(pos + 1, hd, absIdx + 1, tl, acc, 0, searchString, finish) ( pos + 1
, hd
, absIdx + 1
, tl
, acc
, 0
, searchString
, finish
, prevTl
)
else else
loopRange (pos, hd, absIdx, tl, acc, 0, searchString, finish))) backtrackRange
( pos
, hd
, absIdx
, tl
, acc
, searchPos
, searchString
, finish
, prevTl
)))
end end
fun searchRange (buffer: LineGap.t, searchString, finish) = fun searchRange (buffer: LineGap.t, searchString, finish) =
@@ -142,7 +225,16 @@ struct
case rightStrings of case rightStrings of
hd :: tl => hd :: tl =>
loopRange loopRange
(0, hd, absIdx, tl, PersistentVector.empty, 0, searchString, finish) ( 0
, hd
, absIdx
, tl
, PersistentVector.empty
, 0
, searchString
, finish
, []
)
| [] => empty | [] => empty
end end
@@ -199,5 +291,4 @@ struct
in in
loopPrevMatch (pos, searchList, count) loopPrevMatch (pos, searchList, count)
end end
end end