Files
sml-projects/fcore/move.sml

61 lines
2.3 KiB
Standard ML

signature MOVE =
sig
val fMove: LineGap.t * int -> int
end
signature MAKE_MOVE =
sig
val move: AppType.app_type * int -> AppType.app_type
end
functor MakeMove(Fn: MOVE): MAKE_MOVE =
struct
fun helpMove (app: AppType.app_type, buffer, cursorIdx, count) =
if count = 0 then
Finish.buildTextAndClear (app, buffer, cursorIdx, #searchList app)
else
(* move LineGap to cursorIdx, which is necessary for finding newCursorIdx *)
let
val buffer = LineGap.goToIdx (cursorIdx, buffer)
val newCursorIdx = Fn.fMove (buffer, cursorIdx)
val newCursorIdx = Cursor.clipIdx (buffer, newCursorIdx)
val newCount =
(* it's possible to loop a very high number like 5432131
* which will take a long time because of the high number of loops
* regardless of the data structure used.
* If this happens, and the newCursorIdx is the same as the old one,
* then skip to end of loop by going to base case. *)
if cursorIdx = newCursorIdx then 0
else count - 1
in
helpMove (app, buffer, newCursorIdx, newCount)
end
fun move (app: AppType.app_type, count) =
let val {cursorIdx, buffer, ...} = app
in helpMove (app, buffer, cursorIdx, count)
end
end
structure MoveViH = MakeMove (struct val fMove = Cursor.viH end)
structure MoveViJ = MakeMove (struct val fMove = Cursor.viJ end)
structure MoveViK = MakeMove (struct val fMove = Cursor.viK end)
structure MoveViL = MakeMove (struct val fMove = Cursor.viL end)
structure MoveToNextWord = MakeMove (struct val fMove = Cursor.nextWord end)
structure MoveToNextWORD = MakeMove (struct val fMove = Cursor.nextWORD end)
structure MoveToEndOfWord = MakeMove (struct val fMove = Cursor.endOfWord end)
structure MoveToEndOfWORD = MakeMove (struct val fMove = Cursor.endOfWORD end)
structure MoveToPrevWord = MakeMove (struct val fMove = Cursor.prevWord end)
structure MoveToPrevWORD = MakeMove (struct val fMove = Cursor.prevWORD end)
structure MoveToEndOfPrevWord =
MakeMove (struct val fMove = Cursor.endOfPrevWord end)
structure MoveToEndOfPrevWORD =
MakeMove (struct val fMove = Cursor.endOfPrevWORD end)
structure MoveToStartOfLine = MakeMove (struct val fMove = Cursor.vi0 end)
structure MoveToEndOfLine = MakeMove (struct val fMove = Cursor.viDlr end)