diff --git a/fcore/cursor-dfa/make-dfa-loop.sml b/fcore/cursor-dfa/make-dfa-loop.sml index 1d0cb37..2493804 100644 --- a/fcore/cursor-dfa/make-dfa-loop.sml +++ b/fcore/cursor-dfa/make-dfa-loop.sml @@ -1,11 +1,10 @@ signature MAKE_DFA_LOOP = sig - val fNext: int * int * string * string list * Word8.word * int -> int - val fPrev: int * int * string * string list * Word8.word * int -> int + val fStart: int * int * string * string list * Word8.word * int -> int val startState: Word8.word end -functor MakeDfaLoop(M: MAKE_DFA_LOOP) = +functor MakeNextDfaLoop(M: MAKE_DFA_LOOP) = struct fun next (lineGap: LineGap.t, cursorIdx) = let @@ -19,17 +18,20 @@ struct in if strIdx < String.size shd then (* strIdx is in this string *) - M.fNext (strIdx, cursorIdx, shd, stl, M.startState, 1) + M.fStart (strIdx, cursorIdx, shd, stl, M.startState, 1) else (* strIdx is in tl *) case stl of stlhd :: stltl => - M.fNext (strIdx, cursorIdx, stlhd, stltl, M.startState, 1) + M.fStart (strIdx, cursorIdx, stlhd, stltl, M.startState, 1) | _ => cursorIdx end | [] => cursorIdx end +end +functor MakePrevDfaLoop(M: MAKE_DFA_LOOP) = +struct fun prev (lineGap: LineGap.t, cursorIdx) = let val {rightStrings, leftStrings, idx = bufferIdx, ...} = lineGap @@ -42,7 +44,7 @@ struct in if strIdx < String.size shd then (* strIdx is in this string *) - M.fPrev (strIdx, cursorIdx, shd, leftStrings, M.startState, 1) + M.fStart (strIdx, cursorIdx, shd, leftStrings, M.startState, 1) else (* strIdx is in tl *) (case stl of @@ -51,7 +53,7 @@ struct val strIdx = strIdx - String.size shd val leftStrings = shd :: leftStrings in - M.fPrev + M.fStart (strIdx, cursorIdx, stlhd, leftStrings, M.startState, 1) end | [] => cursorIdx) diff --git a/fcore/cursor-dfa/vi-WORD-dfa.sml b/fcore/cursor-dfa/vi-WORD-dfa.sml index 104e1ca..5e3c21b 100644 --- a/fcore/cursor-dfa/vi-WORD-dfa.sml +++ b/fcore/cursor-dfa/vi-WORD-dfa.sml @@ -35,15 +35,15 @@ struct Vector.sub (currentTable, charIdx) end - structure TraverseWORD = - MakeDfaLoop + structure StartOfNextWORD = + MakeNextDfaLoop (struct val startState = startState - fun fNext (idx, absIdx, str, tl, currentState, counter) = + fun fStart (idx, absIdx, str, tl, currentState, counter) = if idx = String.size str then case tl of - str :: tl => fNext (0, absIdx, str, tl, currentState, counter) + str :: tl => fStart (0, absIdx, str, tl, currentState, counter) | [] => Int.max (absIdx - 2, 0) else let @@ -55,16 +55,23 @@ struct absIdx else (* new loop, so reset to start state and proceed *) - fNext (idx + 1, absIdx + 1, str, tl, startState, counter - 1) + fStart + (idx + 1, absIdx + 1, str, tl, startState, counter - 1) else - fNext (idx + 1, absIdx + 1, str, tl, newState, counter) + fStart (idx + 1, absIdx + 1, str, tl, newState, counter) end + end) - fun fPrev (idx, absIdx, str, tl, currentState, counter) = + structure EndOfPrevWORD = + MakePrevDfaLoop + (struct + val startState = startState + + fun fStart (idx, absIdx, str, tl, currentState, counter) = if idx < 0 then case tl of str :: tl => - fPrev + fStart (String.size str - 1, absIdx, str, tl, currentState, counter) | [] => 0 else @@ -77,12 +84,13 @@ struct absIdx else (* reset to start state and proceed *) - fPrev (idx - 1, absIdx - 1, str, tl, startState, counter - 1) + fStart + (idx - 1, absIdx - 1, str, tl, startState, counter - 1) else - fPrev (idx - 1, absIdx - 1, str, tl, newState, counter) + fStart (idx - 1, absIdx - 1, str, tl, newState, counter) end end) - val next = TraverseWORD.next - val prev = TraverseWORD.prev + val startOfNextWORD = StartOfNextWORD.next + val endOfPrevWORD = EndOfPrevWORD.prev end diff --git a/fcore/cursor.sml b/fcore/cursor.sml index cd8f05b..db5b282 100644 --- a/fcore/cursor.sml +++ b/fcore/cursor.sml @@ -886,7 +886,7 @@ struct toNextWord (lineGap, cursorIdx, helpNextWord) (* equivalent of vi's 'W' command *) - val nextWORD = ViWORDDfa.next + val nextWORD = ViWORDDfa.startOfNextWORD fun helpPrevWord (strPos, str, absIdx, strTl, lineTl) = if strPos < 0 then @@ -1077,8 +1077,7 @@ struct toEndOfPrevWord (lineGap, cursorIdx, helpEndOfPrevWord) (* equivalent of vi's 'gE' command *) - fun endOfPrevWORD (lineGap, cursorIdx) = - toEndOfPrevWord (lineGap, cursorIdx, helpEndOfPrevWORD) + val endOfPrevWORD = ViWORDDfa.endOfPrevWORD fun helpEndOfWord (strPos, str, absIdx, stl, ltl) = if strPos = String.size str then