From 9ba3e8464b30978f87de351d6629753cf7d69ab0 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sat, 6 Sep 2025 23:05:11 +0100 Subject: [PATCH] add backtract functionality for range search as well --- fcore/search-list.sml | 109 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 100 insertions(+), 9 deletions(-) diff --git a/fcore/search-list.sml b/fcore/search-list.sml index 6a6503a..84e9ee9 100644 --- a/fcore/search-list.sml +++ b/fcore/search-list.sml @@ -79,7 +79,8 @@ struct loopSearch (pos + 1, hd, absIdx + 1, tl, acc, 0, searchString, prevTl) else - loopSearch (pos, hd, absIdx, tl, acc, 0, searchString, prevTl)) + backtrackFull + (pos, hd, absIdx, tl, acc, searchPos, searchString, prevTl)) end fun search ({rightStrings, leftStrings, ...}: LineGap.t, searchString) = @@ -93,11 +94,64 @@ struct if String.size searchString > 0 then search (buffer, searchString) 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 case tl of - hd :: tl => - loopRange (0, hd, absIdx, tl, acc, searchPos, searchString, finish) + newHd :: newTl => + let + val prevTl = hd :: prevTl + in + loopRange + ( 0 + , newHd + , absIdx + , newTl + , acc + , searchPos + , searchString + , finish + , prevTl + ) + end | [] => PersistentVector.toVector acc else if absIdx = finish then PersistentVector.toVector acc @@ -114,7 +168,16 @@ struct val acc = PersistentVector.append (foundIdx, acc) in loopRange - (pos + 1, hd, absIdx + 1, tl, acc, 0, searchString, finish) + ( pos + 1 + , hd + , absIdx + 1 + , tl + , acc + , 0 + , searchString + , finish + , prevTl + ) end else loopRange @@ -126,13 +189,33 @@ struct , searchPos + 1 , searchString , finish + , prevTl ) else ((if searchPos = 0 then loopRange - (pos + 1, hd, absIdx + 1, tl, acc, 0, searchString, finish) + ( pos + 1 + , hd + , absIdx + 1 + , tl + , acc + , 0 + , searchString + , finish + , prevTl + ) else - loopRange (pos, hd, absIdx, tl, acc, 0, searchString, finish))) + backtrackRange + ( pos + , hd + , absIdx + , tl + , acc + , searchPos + , searchString + , finish + , prevTl + ))) end fun searchRange (buffer: LineGap.t, searchString, finish) = @@ -142,7 +225,16 @@ struct case rightStrings of hd :: tl => loopRange - (0, hd, absIdx, tl, PersistentVector.empty, 0, searchString, finish) + ( 0 + , hd + , absIdx + , tl + , PersistentVector.empty + , 0 + , searchString + , finish + , [] + ) | [] => empty end @@ -199,5 +291,4 @@ struct in loopPrevMatch (pos, searchList, count) end - end