diff --git a/fcore/app-update.sml b/fcore/app-update.sml index 1bf2823..b4e7a20 100644 --- a/fcore/app-update.sml +++ b/fcore/app-update.sml @@ -668,7 +668,7 @@ struct app val buffer = LineGap.delete (0, cursorIdx, buffer) - val (buffer, searchList) = SearchList.build (buffer, searchString) + val searchList = SearchList.empty val buffer = LineGap.goToEnd buffer val initialMsg = [SEARCH (buffer, #searchString app)] diff --git a/fcore/search-list.sml b/fcore/search-list.sml index 914d55d..61523ae 100644 --- a/fcore/search-list.sml +++ b/fcore/search-list.sml @@ -39,30 +39,20 @@ struct loopSearch (pos - 1, hd, absIdx - 1, tl, acc, searchString) end - (* Prerequisite: move buffer/LineGap to end *) fun search (buffer: LineGap.t, searchString) = - if String.size searchString = 0 then - empty - else - let - val {leftStrings, idx = absIdx, ...} = buffer - in - case leftStrings of - hd :: tl => - loopSearch - (String.size hd - 1, hd, absIdx - 1, tl, [], searchString) - | [] => empty - end + let + val {leftStrings, idx = absIdx, ...} = buffer + in + case leftStrings of + hd :: tl => + loopSearch (String.size hd - 1, hd, absIdx - 1, tl, [], searchString) + | [] => empty + end + (* Prerequisite: move buffer/LineGap to end *) fun build (buffer, searchString) = - if String.size searchString > 0 then - let - val searchList = search (buffer, searchString) - in - searchList - end - else - empty + if String.size searchString > 0 then search (buffer, searchString) + else empty fun loopNextMatch (pos, searchList, count) = if count = 0 then @@ -111,4 +101,87 @@ struct in loopPrevMatch (pos, searchList, count) end + + fun rangeSearchStep (pos, hd, absIdx, tl, acc, searchPos, searchString, low) = + if searchPos < 0 then + (absIdx + 1) :: acc + else if absIdx < low then + acc + else if pos < 0 then + case tl of + hd :: tl => + rangeSearchStep + ( String.size hd - 1 + , hd + , absIdx + , tl + , acc + , searchPos + , searchString + , low + ) + | [] => acc + else + let + val bufferChr = String.sub (hd, pos) + val searchChr = String.sub (searchString, searchPos) + in + if bufferChr = searchChr then + rangeSearchStep + (pos - 1, hd, absIdx - 1, tl, acc, searchPos - 1, searchString, low) + else + acc + end + + fun loopRange (pos, hd, absIdx, tl, acc, searchString, low) = + if absIdx < low then + Vector.fromList acc + else if pos < 0 then + case tl of + hd :: tl => + loopRange (String.size hd - 1, hd, absIdx, tl, acc, searchString, low) + | [] => Vector.fromList acc + else + let + val acc = rangeSearchStep + ( pos + , hd + , absIdx + , tl + , acc + , String.size searchString - 1 + , searchString + , low + ) + in + loopRange (pos - 1, hd, absIdx - 1, tl, acc, searchString, low) + end + + fun searchRange (buffer: LineGap.t, searchString, low) = + let + val {rightStrings, leftStrings, idx = absIdx, ...} = buffer + in + case rightStrings of + hd :: _ => + let + val pos = String.size hd - 1 + val absIdx = absIdx + String.size hd - 1 + in + loopRange (pos, hd, absIdx, leftStrings, [], searchString, low) + end + | [] => + (case leftStrings of + hd :: tl => + let + val pos = String.size hd - 1 + val absIdx = absIdx - 1 + in + loopRange (pos, hd, absIdx, tl, [], searchString, low) + end + | [] => empty) + end + + fun buildRange (buffer, searchString, low) = + if String.size searchString > 0 then searchRange (buffer, searchString, low) + else empty end diff --git a/shell/shell.sml b/shell/shell.sml index a14fa0f..4766d54 100644 --- a/shell/shell.sml +++ b/shell/shell.sml @@ -68,9 +68,10 @@ struct (* todo: remove temp line below which tests search list *) val app = let + val buffer = #buffer app + val buffer = LineGap.goToEnd buffer val searchString = "val " - val (buffer, searchList) = - SearchList.build (#buffer app, searchString) + val searchList = SearchList.build (buffer, searchString) val buffer = LineGap.goToStart buffer in AppWith.searchList (app, searchList, buffer, searchString)