From b95fc48252c52dd20ec8868b6ac9ed11c020eb4f Mon Sep 17 00:00:00 2001 From: Humza Shahid Date: Sun, 6 Oct 2024 09:32:56 +0100 Subject: [PATCH] scaffolding for concurrent ml --- fcore/app-type.sml | 3 ++- fcore/app-update.sml | 24 ++++++++++++++++++++ fcore/text-builder.sml | 39 --------------------------------- message-types/draw-msg.sml | 5 +++++ message-types/input-msg.sml | 5 +++++ message-types/mailbox-type.sml | 5 +++++ shell/update-thread.sml | 25 +++++++++++++++++++++ shf | Bin 1042384 -> 1042384 bytes shf.mlb | 7 ++++++ 9 files changed, 73 insertions(+), 40 deletions(-) create mode 100644 fcore/app-update.sml create mode 100644 message-types/draw-msg.sml create mode 100644 message-types/input-msg.sml create mode 100644 message-types/mailbox-type.sml create mode 100644 shell/update-thread.sml diff --git a/fcore/app-type.sml b/fcore/app-type.sml index 2be927f..bacdcc4 100644 --- a/fcore/app-type.sml +++ b/fcore/app-type.sml @@ -1,4 +1,5 @@ structure AppType = struct - + type app_type = + {buffer: LineGap.t, windowWidth: int, windowHeight: int} end diff --git a/fcore/app-update.sml b/fcore/app-update.sml new file mode 100644 index 0000000..cb5cf55 --- /dev/null +++ b/fcore/app-update.sml @@ -0,0 +1,24 @@ +structure AppUpdate = +struct + open AppType + + open MailboxType + open DrawMsg + open InputMsg + + fun resizeText (app: app_type, newWidth, newHeight) = + let + val {buffer, windowWidth, windowHeight} = app + val (textVec, newBuffer) = + TextBuilder.build (0, buffer, newWidth, newHeight) + + val newApp = + {buffer = newBuffer, windowWidth = newWidth, windowHeight = newHeight} + val msg = REDRAW_TEXT textVec + in + (newApp, [DRAW msg]) + end + + fun update (app, msg) = + case msg of RESIZE_EVENT (width, height) => resizeText (app, width, height) +end diff --git a/fcore/text-builder.sml b/fcore/text-builder.sml index fadb6ac..712fc3e 100644 --- a/fcore/text-builder.sml +++ b/fcore/text-builder.sml @@ -136,45 +136,6 @@ struct ) | [] => acc - (* todo: - * before calling continueBuildTextLineGap, - * find start position inside LineGap - * to start building from *) - fun startBuildTextLineGap (startLine, lineGap: LineGap.t, windowWidth, windowHeight) = - let - val lineGap = LineGap.goToLine (startLine, lineGap) - val {rightStrings, rightLines, line = curLine, ...} = lineGap - - val acc = case (rightStrings, rightLines) of - (rStrHd::rStrTl, rLnHd::_) => - let - (* get index of line to start building from *) - val lnPos = startLine - curLine - val startIdx = Vector.sub (rLnHd, lnPos) - val startIdx = - if String.sub (rStrHd, startIdx) = #"\r" andalso startIdx - < String.size rStrHd - 1 andalso String.sub (rStrHd, - startIdx + 1) = #"\n" - then - (* handle \r\n pair *) - startIdx + 2 - else startIdx + 1 - in -buildTextString ( startIdx, rStrHd, [], 5, 5, 5 - , windowWidth, windowHeight, - Real32.fromInt windowWidth, Real32.fromInt windowHeight - , 0.0, 0.0, 0.0, rStrTl - ) - end - | (_, _) => - (* requested line goes beyond the buffer, - * so just return empty list as there is nothig - * else we can do. *) - [] - in - Vector.concat acc - end - fun build (startLine, lineGap: LineGap.t, windowWidth, windowHeight) = let diff --git a/message-types/draw-msg.sml b/message-types/draw-msg.sml new file mode 100644 index 0000000..848dee7 --- /dev/null +++ b/message-types/draw-msg.sml @@ -0,0 +1,5 @@ +structure DrawMsg = +struct + datatype t = + REDRAW_TEXT of Real32.real vector +end diff --git a/message-types/input-msg.sml b/message-types/input-msg.sml new file mode 100644 index 0000000..cdd80b2 --- /dev/null +++ b/message-types/input-msg.sml @@ -0,0 +1,5 @@ +structure InputMsg = +struct + datatype t = + RESIZE_EVENT of int * int +end diff --git a/message-types/mailbox-type.sml b/message-types/mailbox-type.sml new file mode 100644 index 0000000..02941b1 --- /dev/null +++ b/message-types/mailbox-type.sml @@ -0,0 +1,5 @@ +structure MailboxType = +struct + datatype t = + DRAW of DrawMsg.t +end diff --git a/shell/update-thread.sml b/shell/update-thread.sml new file mode 100644 index 0000000..44b58db --- /dev/null +++ b/shell/update-thread.sml @@ -0,0 +1,25 @@ +structure UpdateThread = +struct + open CML + open MailboxType + + fun sendMsg (msg, drawMailbox) = + case msg of DRAW msg => Mailbox.send (drawMailbox, msg) + + fun sendMsgs (msgList, drawMailbox) = + case msgList of + hd :: tl => + let val _ = sendMsg (hd, drawMailbox) + in sendMsgs (tl, drawMailbox) + end + | [] => () + + fun loop (app: AppType.app_type, inputMailbox, drawMailbox) = + let + val inputMsg = Mailbox.recv inputMailbox + val (app, msgList) = AppUpdate.update (app, inputMsg) + val _ = sendMsgs (msgList, drawMailbox) + in + loop (app, inputMailbox, drawMailbox) + end +end diff --git a/shf b/shf index 325237cad50ce2ca81640ca73ec6bbe353d21fc5..187e0b25a57a6127ca6eebe3907d1c34e4f5f993 100755 GIT binary patch delta 6410 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 HUBCQqUiZr{ delta 6416 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 LtzcO~&wKv^64|k( diff --git a/shf.mlb b/shf.mlb index f0ee053..824ef3b 100644 --- a/shf.mlb +++ b/shf.mlb @@ -5,7 +5,13 @@ lib/brolib-sml/src/line_gap.sml lib/cozette-sml/fonts/cozette-ascii.mlb (* FUNCTIONAL CORE *) +message-types/input-msg.sml +message-types/draw-msg.sml +message-types/mailbox-type.sml + +fcore/app-type.sml fcore/text-builder.sml +fcore/app-update.sml (* IMPERATIVE SHELL *) $(SML_LIB)/basis/mlton.mlb @@ -19,6 +25,7 @@ in ffi/glfw-input.sml end +shell/update-thread.sml shell/gl-shaders.sml shell/gl-draw.sml shell/shell.sml