From 8857f49537ef2c056a42d1ce3cfbf54e286c7b31 Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Wed, 8 Oct 2025 05:20:33 +0100 Subject: [PATCH] pass DFA to 'SearchList.buildRange' function, so that we don't need to parse search string into DFA each time --- fcore/normal-mode/make-normal-delete.sml | 29 ++++++++------- fcore/normal-mode/normal-search-finish.sml | 2 + fcore/normal-mode/normal-search-mode.sml | 24 ++++++++---- fcore/search-list/search-list.sml | 31 ++++++---------- fcore/text-builder/search-bar.sml | 43 +++++++++++++++------- 5 files changed, 75 insertions(+), 54 deletions(-) diff --git a/fcore/normal-mode/make-normal-delete.sml b/fcore/normal-mode/make-normal-delete.sml index 9229ad2..ee029de 100644 --- a/fcore/normal-mode/make-normal-delete.sml +++ b/fcore/normal-mode/make-normal-delete.sml @@ -18,7 +18,7 @@ struct val buffer = LineGap.goToIdx (low - 1111, buffer) val (buffer, searchList) = - SearchList.buildRange (buffer, searchString, low + 1111) + SearchList.buildRange (buffer, searchString, low + 1111, #dfa app) val buffer = LineGap.goToIdx (low, buffer) in @@ -241,7 +241,8 @@ struct val buffer = LineGap.goToIdx (cursorIdx - 1111, buffer) val (buffer, searchList) = - SearchList.buildRange (buffer, searchString, cursorIdx + 1111) + SearchList.buildRange + (buffer, searchString, cursorIdx + 1111, #dfa app) (* If we have deleted from the buffer so that cursorIdx * is no longer a valid idx, @@ -705,7 +706,7 @@ struct fun deleteToStart (app: app_type, time) : AppType.app_type = let - val {cursorIdx, buffer, windowWidth, windowHeight, searchString, ...} = + val {cursorIdx, buffer, windowWidth, windowHeight, searchString, dfa, ...} = app val buffer = LineGap.goToIdx (cursorIdx, buffer) val cursorIdx = Cursor.viDlrForDelete (buffer, cursorIdx, 1) @@ -719,7 +720,7 @@ struct val buffer = LineGap.goToIdx (cursorIdx - 1111, buffer) val (buffer, searchList) = - SearchList.buildRange (buffer, searchString, cursorIdx + 1111) + SearchList.buildRange (buffer, searchString, cursorIdx + 1111, dfa) val cursorIdx = 0 val startLine = 0 @@ -756,7 +757,7 @@ struct fun helpDeleteToMatch (app: app_type, low, high, time) = let - val {buffer, searchString, ...} = app + val {buffer, searchString, dfa, ...} = app val buffer = LineGap.goToIdx (high, buffer) val length = high - low val initialMsg = Fn.initMsgs (low, length, buffer) @@ -767,7 +768,7 @@ struct val buffer = LineGap.goToIdx (low - 1111, buffer) val (buffer, searchList) = - SearchList.buildRange (buffer, searchString, low + 1111) + SearchList.buildRange (buffer, searchString, low + 1111, dfa) val buffer = LineGap.goToIdx (low, buffer) in @@ -804,7 +805,7 @@ struct fun deleteInsideWord (app: app_type, time) = let - val {buffer, cursorIdx, searchString, ...} = app + val {buffer, cursorIdx, searchString, dfa, ...} = app val buffer = LineGap.goToIdx (cursorIdx, buffer) val low = Cursor.prevWordStrict (buffer, cursorIdx, 1) @@ -826,7 +827,7 @@ struct val buffer = LineGap.goToIdx (low - 1111, buffer) val (buffer, searchList) = - SearchList.buildRange (buffer, searchString, low + 1111) + SearchList.buildRange (buffer, searchString, low + 1111, dfa) val buffer = LineGap.goToIdx (low, buffer) in @@ -839,7 +840,7 @@ struct fun deleteInsideWORD (app: app_type, time) = let - val {buffer, cursorIdx, searchString, ...} = app + val {buffer, cursorIdx, searchString, dfa, ...} = app val buffer = LineGap.goToIdx (cursorIdx, buffer) val low = Cursor.prevWORDStrict (buffer, cursorIdx, 1) @@ -858,7 +859,7 @@ struct val buffer = LineGap.goToIdx (low - 1111, buffer) val (buffer, searchList) = - SearchList.buildRange (buffer, searchString, low + 1111) + SearchList.buildRange (buffer, searchString, low + 1111, dfa) val buffer = LineGap.goToIdx (low, buffer) in @@ -874,7 +875,7 @@ struct NormalFinish.clearMode app else let - val {cursorIdx, buffer, searchString, ...} = app + val {cursorIdx, buffer, searchString, dfa, ...} = app val low = origLow + 1 val length = high - low @@ -887,7 +888,7 @@ struct val buffer = LineGap.goToIdx (low - 1111, buffer) val (buffer, searchList) = - SearchList.buildRange (buffer, searchString, low + 1111) + SearchList.buildRange (buffer, searchString, low + 1111, dfa) val buffer = LineGap.goToIdx (origLow, buffer) in @@ -970,7 +971,7 @@ struct fun deletePair (app: app_type, time) = let - val {cursorIdx, buffer, ...} = app + val {cursorIdx, buffer, dfa, ...} = app val otherIdx = Cursor.matchPair (buffer, cursorIdx) in if otherIdx = cursorIdx then @@ -1001,7 +1002,7 @@ struct val buffer = LineGap.goToIdx (low - 1111, buffer) val (buffer, searchList) = - SearchList.buildRange (buffer, searchString, low + 1111) + SearchList.buildRange (buffer, searchString, low + 1111, dfa) val buffer = LineGap.goToIdx (low, buffer) in diff --git a/fcore/normal-mode/normal-search-finish.sml b/fcore/normal-mode/normal-search-finish.sml index a3ffa1e..4684a3c 100644 --- a/fcore/normal-mode/normal-search-finish.sml +++ b/fcore/normal-mode/normal-search-finish.sml @@ -49,6 +49,7 @@ struct , floatWindowHeight , searchCursorIdx , searchScrollColumn + , caseSensitive ) val buffer = LineGap.goToIdx (cursorIdx, buffer) @@ -121,6 +122,7 @@ struct , floatWindowHeight , searchCursorIdx , searchScrollColumn + , caseSensitive ) val buffer = LineGap.goToIdx (cursorIdx, buffer) diff --git a/fcore/normal-mode/normal-search-mode.sml b/fcore/normal-mode/normal-search-mode.sml index a3ae115..dafb0e2 100644 --- a/fcore/normal-mode/normal-search-mode.sml +++ b/fcore/normal-mode/normal-search-mode.sml @@ -4,8 +4,14 @@ struct open InputMsg open MailboxType - fun buildTempSearchList (searchString, buffer, cursorIdx) = - SearchList.buildRange (buffer, searchString, cursorIdx + 1111) + fun buildTempSearchList (searchString, buffer, cursorIdx, caseSensitive) = + let + val dfa = + if caseSensitive then CaseSensitiveDfa.fromString searchString + else CaseInsensitiveDfa.fromString searchString + in + SearchList.buildRange (buffer, searchString, cursorIdx + 1111, dfa) + end fun addChr ( app: app_type @@ -34,7 +40,7 @@ struct val buffer = LineGap.goToIdx (cursorIdx - 1111, buffer) val (buffer, tempSearchList) = - buildTempSearchList (searchString, buffer, cursorIdx) + buildTempSearchList (searchString, buffer, cursorIdx, caseSensitive) in NormalSearchFinish.onSearchChanged ( app @@ -58,7 +64,8 @@ struct end (* save search string and tempSearchList and return to normal mode *) - fun saveSearch (app: app_type, searchString, tempSearchList, time) = + fun saveSearch + (app: app_type, searchString, tempSearchList, caseSensitive, time) = let val { buffer @@ -94,7 +101,9 @@ struct val mode = NORMAL_MODE "" - val dfa = raise Fail "todo" + val dfa = + if caseSensitive then CaseSensitiveDfa.fromString searchString + else CaseInsensitiveDfa.fromString searchString in NormalSearchModeWith.returnToNormalMode (app, buffer, searchString, tempSearchList, startLine, mode, dfa, msgs) @@ -129,7 +138,7 @@ struct val {cursorIdx, buffer, ...} = app val buffer = LineGap.goToIdx (cursorIdx - 1111, buffer) val (buffer, tempSearchList) = - buildTempSearchList (searchString, buffer, cursorIdx) + buildTempSearchList (searchString, buffer, cursorIdx, caseSensitive) in NormalSearchFinish.onSearchChanged ( app @@ -224,7 +233,8 @@ struct , caseSensitive ) | KEY_ESC => exitToNormalMode app - | KEY_ENTER => saveSearch (app, searchString, tempSearchList, time) + | KEY_ENTER => + saveSearch (app, searchString, tempSearchList, caseSensitive, time) | ARROW_LEFT => moveLeft ( app diff --git a/fcore/search-list/search-list.sml b/fcore/search-list/search-list.sml index 678ef76..84fa330 100644 --- a/fcore/search-list/search-list.sml +++ b/fcore/search-list/search-list.sml @@ -159,25 +159,18 @@ struct ) end - fun buildRange (buffer, searchString, finishIdx) = - if String.size searchString > 0 then - let - val dfa = DfaGen.fromString searchString - in - if Vector.length dfa = 0 then - (buffer, PersistentVector.empty) - else - rangeLoop - ( dfa - , #idx buffer - , buffer - , finishIdx - , PersistentVector.empty - , 0 - , #idx buffer - , ~1 - ) - end + fun buildRange (buffer, searchString, finishIdx, dfa) = + if String.size searchString > 0 andalso Vector.length dfa > 0 then + rangeLoop + ( dfa + , #idx buffer + , buffer + , finishIdx + , PersistentVector.empty + , 0 + , #idx buffer + , ~1 + ) else (buffer, PersistentVector.empty) diff --git a/fcore/text-builder/search-bar.sml b/fcore/text-builder/search-bar.sml index e69d1c8..c1a475b 100644 --- a/fcore/text-builder/search-bar.sml +++ b/fcore/text-builder/search-bar.sml @@ -59,11 +59,12 @@ struct , floatWindowHeight , searchCursorIdx , searchScrollColumn + , caseSensitive ) = let - val r: Real32.real = 0.67 - val g: Real32.real = 0.51 - val b: Real32.real = 0.83 + val r: Real32.real = 0.1 + val g: Real32.real = 0.1 + val b: Real32.real = 0.1 val z: Real32.real = 0.1 val width = endX - startX @@ -101,17 +102,31 @@ struct val xpos = Int.min (endX, xpos) val x = Real32.fromInt xpos in - PipeCursor.lerp - ( x - , fPosY - , 0.01 - , TextConstants.scale - , floatWindowWidth - , floatWindowHeight - , r - , g - , b - ) + if caseSensitive then + CozetteAscii.make + ( #"?" + , x + , fPosY + , 0.01 + , TC.scale + , floatWindowWidth + , floatWindowWidth + , r + , g + , b + ) + else + PipeCursor.lerp + ( x + , fPosY + , 0.01 + , TC.scale + , floatWindowWidth + , floatWindowHeight + , r + , g + , b + ) end val posX = startX + TC.xSpace