add backtract functionality for range search as well
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user