From d009e158803956c76adbf8f58a62884c3e7affb3 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Tue, 26 Jan 2016 23:47:23 -0800 Subject: 2605 --- html/edit/011-editor-undo.mu.html | 738 +++++++++++++++++++------------------- 1 file changed, 369 insertions(+), 369 deletions(-) (limited to 'html/edit/011-editor-undo.mu.html') diff --git a/html/edit/011-editor-undo.mu.html b/html/edit/011-editor-undo.mu.html index 801ca648..d5d66d09 100644 --- a/html/edit/011-editor-undo.mu.html +++ b/html/edit/011-editor-undo.mu.html @@ -46,13 +46,13 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } container insert-operation [ before-row:number before-column:number - before-top-of-screen:address:duplex-list:character + before-top-of-screen:address:shared:duplex-list:character after-row:number after-column:number - after-top-of-screen:address:duplex-list:character + after-top-of-screen:address:shared:duplex-list:character # inserted text is from 'insert-from' until 'insert-until'; list doesn't have to terminate - insert-from:address:duplex-list:character - insert-until:address:duplex-list:character + insert-from:address:shared:duplex-list:character + insert-until:address:shared:duplex-list:character tag:number # event causing this operation; might be used to coalesce runs of similar events # 0: no coalesce (enter+indent) # 1: regular alphanumeric characters @@ -61,10 +61,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } container move-operation [ before-row:number before-column:number - before-top-of-screen:address:duplex-list:character + before-top-of-screen:address:shared:duplex-list:character after-row:number after-column:number - after-top-of-screen:address:duplex-list:character + after-top-of-screen:address:shared:duplex-list:character tag:number # event causing this operation; might be used to coalesce runs of similar events # 0: no coalesce (touch events, etc) # 1: left arrow @@ -76,13 +76,13 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } container delete-operation [ before-row:number before-column:number - before-top-of-screen:address:duplex-list:character + before-top-of-screen:address:shared:duplex-list:character after-row:number after-column:number - after-top-of-screen:address:duplex-list:character - deleted-text:address:duplex-list:character - delete-from:address:duplex-list:character - delete-until:address:duplex-list:character + after-top-of-screen:address:shared:duplex-list:character + deleted-text:address:shared:duplex-list:character + delete-from:address:shared:duplex-list:character + delete-until:address:shared:duplex-list:character tag:number # event causing this operation; might be used to coalesce runs of similar events # 0: no coalesce (ctrl-k, ctrl-u) # 1: backspace @@ -91,8 +91,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # every editor accumulates a list of operations to undo/redo container editor-data [ - undo:address:list:address:operation - redo:address:list:address:operation + undo:address:shared:list:address:shared:operation + redo:address:shared:list:address:shared:operation ] # ctrl-z - undo operation @@ -100,11 +100,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } { undo?:boolean <- equal *c, 26/ctrl-z break-unless undo? - undo:address:address:list:address:operation <- get-address *editor, undo:offset + undo:address:address:shared:list:address:shared:operation <- get-address *editor, undo:offset break-unless *undo - op:address:operation <- first *undo + op:address:shared:operation <- first *undo *undo <- rest *undo - redo:address:address:list:address:operation <- get-address *editor, redo:offset + redo:address:address:shared:list:address:shared:operation <- get-address *editor, redo:offset *redo <- push op, *redo <handle-undo> reply screen/same-as-ingredient:0, editor/same-as-ingredient:1, 1/go-render @@ -116,11 +116,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } { redo?:boolean <- equal *c, 25/ctrl-y break-unless redo? - redo:address:address:list:address:operation <- get-address *editor, redo:offset + redo:address:address:shared:list:address:shared:operation <- get-address *editor, redo:offset break-unless *redo - op:address:operation <- first *redo + op:address:shared:operation <- first *redo *redo <- rest *redo - undo:address:address:list:address:operation <- get-address *editor, undo:offset + undo:address:address:shared:list:address:shared:operation <- get-address *editor, undo:offset *undo <- push op, *undo <handle-redo> reply screen/same-as-ingredient:0, editor/same-as-ingredient:1, 1/go-render @@ -132,19 +132,19 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-typing [ # create an editor and type a character assume-screen 10/width, 5/height - 1:address:array:character <- new [] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data assume-console [ type [0] ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # character should be gone screen-should-contain [ @@ -158,7 +158,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -170,34 +170,34 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # save operation to undo after <insert-character-begin> [ - top-before:address:duplex-list:character <- get *editor, top-of-screen:offset - cursor-before:address:duplex-list:character <- copy *before-cursor + top-before:address:shared:duplex-list:character <- get *editor, top-of-screen:offset + cursor-before:address:shared:duplex-list:character <- copy *before-cursor ] before <insert-character-end> [ - top-after:address:duplex-list:character <- get *editor, top-of-screen:offset - undo:address:address:list:address:operation <- get-address *editor, undo:offset + top-after:address:shared:duplex-list:character <- get *editor, top-of-screen:offset + undo:address:address:shared:list:address:shared:operation <- get-address *editor, undo:offset { # if previous operation was an insert, coalesce this operation with it break-unless *undo - op:address:operation <- first *undo + op:address:shared:operation <- first *undo typing:address:insert-operation <- maybe-convert *op, typing:variant break-unless typing previous-coalesce-tag:number <- get *typing, tag:offset break-unless previous-coalesce-tag - insert-until:address:address:duplex-list:character <- get-address *typing, insert-until:offset + insert-until:address:address:shared:duplex-list:character <- get-address *typing, insert-until:offset *insert-until <- next *before-cursor after-row:address:number <- get-address *typing, after-row:offset *after-row <- copy *cursor-row after-column:address:number <- get-address *typing, after-column:offset *after-column <- copy *cursor-column - after-top:address:address:duplex-list:character <- get-address *typing, after-top-of-screen:offset + after-top:address:address:shared:duplex-list:character <- get-address *typing, after-top-of-screen:offset *after-top <- get *editor, top-of-screen:offset break +done-adding-insert-operation:label } # if not, create a new operation - insert-from:address:duplex-list:character <- next cursor-before - insert-to:address:duplex-list:character <- next insert-from - op:address:operation <- new operation:type + insert-from:address:shared:duplex-list:character <- next cursor-before + insert-to:address:shared:duplex-list:character <- next insert-from + op:address:shared:operation <- new operation:type *op <- merge 0/insert-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, insert-from, insert-to, 1/coalesce editor <- add-operation editor, op +done-adding-insert-operation @@ -207,15 +207,15 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } after <insert-enter-begin> [ cursor-row-before:number <- copy *cursor-row cursor-column-before:number <- copy *cursor-column - top-before:address:duplex-list:character <- get *editor, top-of-screen:offset - cursor-before:address:duplex-list:character <- copy *before-cursor + top-before:address:shared:duplex-list:character <- get *editor, top-of-screen:offset + cursor-before:address:shared:duplex-list:character <- copy *before-cursor ] before <insert-enter-end> [ - top-after:address:duplex-list:character <- get *editor, top-of-screen:offset + top-after:address:shared:duplex-list:character <- get *editor, top-of-screen:offset # never coalesce - insert-from:address:duplex-list:character <- next cursor-before - insert-to:address:duplex-list:character <- next *before-cursor - op:address:operation <- new operation:type + insert-from:address:shared:duplex-list:character <- next cursor-before + insert-to:address:shared:duplex-list:character <- next *before-cursor + op:address:shared:operation <- new operation:type *op <- merge 0/insert-operation, cursor-row-before, cursor-column-before, top-before, *cursor-row/after, *cursor-column/after, top-after, insert-from, insert-to, 0/never-coalesce editor <- add-operation editor, op ] @@ -224,12 +224,12 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # redo stack, because it's now obsolete. # Beware: since we're counting cursor moves as operations, this means just # moving the cursor can lose work on the undo stack. -recipe add-operation editor:address:editor-data, op:address:operation -> editor:address:editor-data [ +recipe add-operation editor:address:shared:editor-data, op:address:shared:operation -> editor:address:shared:editor-data [ local-scope load-ingredients - undo:address:address:list:address:operation <- get-address *editor, undo:offset + undo:address:address:shared:list:address:shared:operation <- get-address *editor, undo:offset *undo <- push op *undo - redo:address:address:list:address:operation <- get-address *editor, redo:offset + redo:address:address:shared:list:address:shared:operation <- get-address *editor, redo:offset *redo <- copy 0 reply editor/same-as-ingredient:0 ] @@ -238,14 +238,14 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } { typing:address:insert-operation <- maybe-convert *op, typing:variant break-unless typing - start:address:duplex-list:character <- get *typing, insert-from:offset - end:address:duplex-list:character <- get *typing, insert-until:offset + start:address:shared:duplex-list:character <- get *typing, insert-from:offset + end:address:shared:duplex-list:character <- get *typing, insert-until:offset # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *before-cursor <- prev start remove-between *before-cursor, end *cursor-row <- get *typing, before-row:offset *cursor-column <- get *typing, before-column:offset - top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset + top:address:address:shared:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *typing, before-top-of-screen:offset } ] @@ -253,19 +253,19 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-typing-multiple [ # create an editor and type multiple characters assume-screen 10/width, 5/height - 1:address:array:character <- new [] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data assume-console [ type [012] ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # all characters must be gone screen-should-contain [ @@ -279,14 +279,14 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-typing-multiple-2 [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [a] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [a] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # type some characters assume-console [ type [012] ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . .012a . @@ -298,7 +298,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # back to original text screen-should-contain [ @@ -312,7 +312,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [3] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -325,15 +325,15 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-typing-enter [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [ abc] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [ abc] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # new line assume-console [ left-click 1, 8 press enter ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . . abc . @@ -342,8 +342,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } . . ] # line is indented - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 2 4 <- 2 @@ -353,10 +353,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 5 @@ -373,7 +373,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -388,14 +388,14 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-redo-typing [ # create an editor, type something, undo assume-screen 10/width, 5/height - 1:address:array:character <- new [a] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [a] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data assume-console [ type [012] press ctrl-z ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . .a . @@ -407,7 +407,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # all characters must be back screen-should-contain [ @@ -421,7 +421,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [3] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -435,13 +435,13 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } { typing:address:insert-operation <- maybe-convert *op, typing:variant break-unless typing - insert-from:address:duplex-list:character <- get *typing, insert-from:offset # ignore insert-to because it's already been spliced away + insert-from:address:shared:duplex-list:character <- get *typing, insert-from:offset # ignore insert-to because it's already been spliced away # assert insert-to matches next(*before-cursor) insert-range *before-cursor, insert-from # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *cursor-row <- get *typing, after-row:offset *cursor-column <- get *typing, after-column:offset - top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset + top:address:address:shared:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *typing, after-top-of-screen:offset } ] @@ -449,14 +449,14 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-redo-typing-empty [ # create an editor, type something, undo assume-screen 10/width, 5/height - 1:address:array:character <- new [] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data assume-console [ type [012] press ctrl-z ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . . . @@ -468,7 +468,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # all characters must be back screen-should-contain [ @@ -482,7 +482,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [3] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -495,21 +495,21 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-work-clears-redo-stack [ # create an editor with some text, do some work, undo assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data assume-console [ type [1] press ctrl-z ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # do some more work assume-console [ type [0] ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . .0abc . @@ -522,7 +522,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # nothing should happen screen-should-contain [ @@ -537,9 +537,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-redo-typing-and-enter-and-tab [ # create an editor assume-screen 10/width, 5/height - 1:address:array:character <- new [] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # insert some text and tabs, hit enter, some more text and tabs assume-console [ press tab @@ -550,7 +550,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press tab type [efg] ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . . ab cd . @@ -558,8 +558,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .┈┈┈┈┈┈┈┈┈┈. . . ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 2 4 <- 7 @@ -569,11 +569,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # typing in second line deleted, but not indent - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 2 4 <- 2 @@ -590,11 +590,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # indent and newline deleted - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 8 @@ -610,11 +610,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # empty screen - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 0 @@ -630,11 +630,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # first line inserted - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 8 @@ -650,11 +650,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # newline and indent inserted - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 2 4 <- 2 @@ -671,11 +671,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # indent and newline deleted - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 2 4 <- 7 @@ -694,24 +694,24 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-touch [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # move the cursor assume-console [ left-click 3, 1 ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # click undone memory-should-contain [ @@ -723,7 +723,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -737,19 +737,19 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } after <move-cursor-begin> [ before-cursor-row:number <- get *editor, cursor-row:offset before-cursor-column:number <- get *editor, cursor-column:offset - before-top-of-screen:address:duplex-list:character <- get *editor, top-of-screen:offset + before-top-of-screen:address:shared:duplex-list:character <- get *editor, top-of-screen:offset ] before <move-cursor-end> [ after-cursor-row:number <- get *editor, cursor-row:offset after-cursor-column:number <- get *editor, cursor-column:offset - after-top-of-screen:address:duplex-list:character <- get *editor, top-of-screen:offset + after-top-of-screen:address:shared:duplex-list:character <- get *editor, top-of-screen:offset { break-unless undo-coalesce-tag # if previous operation was also a move, and also had the same coalesce # tag, coalesce with it - undo:address:address:list:address:operation <- get-address *editor, undo:offset + undo:address:address:shared:list:address:shared:operation <- get-address *editor, undo:offset break-unless *undo - op:address:operation <- first *undo + op:address:shared:operation <- first *undo move:address:move-operation <- maybe-convert *op, move:variant break-unless move previous-coalesce-tag:number <- get *move, tag:offset @@ -759,11 +759,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } *after-row <- copy after-cursor-row after-column:address:number <- get-address *move, after-column:offset *after-column <- copy after-cursor-column - after-top:address:address:duplex-list:character <- get-address *move, after-top-of-screen:offset + after-top:address:address:shared:duplex-list:character <- get-address *move, after-top-of-screen:offset *after-top <- get *editor, top-of-screen:offset break +done-adding-move-operation:label } - op:address:operation <- new operation:type + op:address:shared:operation <- new operation:type *op <- merge 1/move-operation, before-cursor-row, before-cursor-column, before-top-of-screen, after-cursor-row, after-cursor-column, after-top-of-screen, undo-coalesce-tag editor <- add-operation editor, op +done-adding-move-operation @@ -774,7 +774,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } move:address:move-operation <- maybe-convert *op, move:variant break-unless move # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen - top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset + top:address:address:shared:duplex-list:character <- get-address *editor, top-of-screen:offset *cursor-row <- get *move, before-row:offset *cursor-column <- get *move, before-column:offset *top <- get *move, before-top-of-screen:offset @@ -785,18 +785,18 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # screen has 1 line for menu + 3 lines assume-screen 5/width, 4/height # editor contains a wrapped line - 1:address:array:character <- new [a + 1:address:shared:array:character <- new [a b cdefgh] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 5/right + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 5/right # position cursor at end of screen and try to move right assume-console [ left-click 3, 3 press right-arrow ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset # screen scrolls screen-should-contain [ . . @@ -813,9 +813,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moved back memory-should-contain [ @@ -834,7 +834,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -847,25 +847,25 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-left-arrow [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # move the cursor assume-console [ left-click 3, 1 press left-arrow ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moves back memory-should-contain [ @@ -877,7 +877,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -891,19 +891,19 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-up-arrow [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # move the cursor assume-console [ left-click 3, 1 press up-arrow ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 2 4 <- 1 @@ -913,9 +913,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moves back memory-should-contain [ @@ -927,7 +927,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -941,25 +941,25 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-down-arrow [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # move the cursor assume-console [ left-click 2, 1 press down-arrow ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moves back memory-should-contain [ @@ -971,7 +971,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -985,27 +985,27 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-ctrl-f [ # create an editor with multiple pages of text assume-screen 10/width, 5/height - 1:address:array:character <- new [a + 1:address:shared:array:character <- new [a b c d e f] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # scroll the page assume-console [ press ctrl-f ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # screen should again show page 1 screen-should-contain [ @@ -1020,27 +1020,27 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-page-down [ # create an editor with multiple pages of text assume-screen 10/width, 5/height - 1:address:array:character <- new [a + 1:address:shared:array:character <- new [a b c d e f] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # scroll the page assume-console [ press page-down ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # screen should again show page 1 screen-should-contain [ @@ -1055,28 +1055,28 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-ctrl-b [ # create an editor with multiple pages of text assume-screen 10/width, 5/height - 1:address:array:character <- new [a + 1:address:shared:array:character <- new [a b c d e f] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # scroll the page down and up assume-console [ press page-down press ctrl-b ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # screen should again show page 2 screen-should-contain [ @@ -1091,28 +1091,28 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-page-up [ # create an editor with multiple pages of text assume-screen 10/width, 5/height - 1:address:array:character <- new [a + 1:address:shared:array:character <- new [a b c d e f] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # scroll the page down and up assume-console [ press page-down press page-up ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # screen should again show page 2 screen-should-contain [ @@ -1127,25 +1127,25 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-ctrl-a [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # move the cursor, then to start of line assume-console [ left-click 2, 1 press ctrl-a ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moves back memory-should-contain [ @@ -1157,7 +1157,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -1171,25 +1171,25 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-home [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # move the cursor, then to start of line assume-console [ left-click 2, 1 press home ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moves back memory-should-contain [ @@ -1201,7 +1201,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -1215,25 +1215,25 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-ctrl-e [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # move the cursor, then to start of line assume-console [ left-click 2, 1 press ctrl-e ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moves back memory-should-contain [ @@ -1245,7 +1245,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -1259,25 +1259,25 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-end [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # move the cursor, then to start of line assume-console [ left-click 2, 1 press end ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # undo assume-console [ press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moves back memory-should-contain [ @@ -1289,7 +1289,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -1303,17 +1303,17 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-separates-undo-insert-from-undo-cursor-move [ # create an editor, type some text, move the cursor, type some more text assume-screen 10/width, 5/height - 1:address:array:character <- new [] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data assume-console [ type [abc] left-click 1, 1 type [d] ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset screen-should-contain [ . . .adbc . @@ -1329,9 +1329,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # last letter typed is deleted screen-should-contain [ @@ -1349,9 +1349,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # no change to screen; cursor moves screen-should-contain [ @@ -1369,9 +1369,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # screen empty screen-should-contain [ @@ -1389,9 +1389,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # first insert screen-should-contain [ @@ -1409,9 +1409,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moves screen-should-contain [ @@ -1429,9 +1429,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # second insert screen-should-contain [ @@ -1449,11 +1449,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-multiple-arrows-in-the-same-direction [ # create an editor with some text assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # move the cursor assume-console [ left-click 2, 1 @@ -1461,9 +1461,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press right-arrow press up-arrow ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 3 @@ -1473,9 +1473,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # up-arrow is undone memory-should-contain [ @@ -1487,9 +1487,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # both right-arrows are undone memory-should-contain [ @@ -1503,24 +1503,24 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-redo-touch [ # create an editor with some text, click on a character, undo assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def ghi] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data assume-console [ left-click 3, 1 press ctrl-z ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data # redo assume-console [ press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset ] # cursor moves to left-click memory-should-contain [ @@ -1532,7 +1532,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -1550,7 +1550,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *cursor-row <- get *move, after-row:offset *cursor-column <- get *move, after-column:offset - top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset + top:address:address:shared:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *move, after-top-of-screen:offset } ] @@ -1560,24 +1560,24 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-and-redo-backspace [ # create an editor assume-screen 10/width, 5/height - 1:address:array:character <- new [] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # insert some text and hit backspace assume-console [ type [abc] press backspace press backspace ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . .a . .┈┈┈┈┈┈┈┈┈┈. . . ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 1 @@ -1587,10 +1587,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 3 @@ -1606,10 +1606,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 1 @@ -1624,38 +1624,38 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } # save operation to undo after <backspace-character-begin> [ - top-before:address:duplex-list:character <- get *editor, top-of-screen:offset + top-before:address:shared:duplex-list:character <- get *editor, top-of-screen:offset ] before <backspace-character-end> [ { break-unless backspaced-cell # backspace failed; don't add an undo operation - top-after:address:duplex-list:character <- get *editor, top-of-screen:offset - undo:address:address:list:address:operation <- get-address *editor, undo:offset + top-after:address:shared:duplex-list:character <- get *editor, top-of-screen:offset + undo:address:address:shared:list:address:shared:operation <- get-address *editor, undo:offset { # if previous operation was an insert, coalesce this operation with it break-unless *undo - op:address:operation <- first *undo + op:address:shared:operation <- first *undo deletion:address:delete-operation <- maybe-convert *op, delete:variant break-unless deletion previous-coalesce-tag:number <- get *deletion, tag:offset coalesce?:boolean <- equal previous-coalesce-tag, 1/coalesce-backspace break-unless coalesce? - delete-from:address:address:duplex-list:character <- get-address *deletion, delete-from:offset + delete-from:address:address:shared:duplex-list:character <- get-address *deletion, delete-from:offset *delete-from <- copy *before-cursor - backspaced-so-far:address:address:duplex-list:character <- get-address *deletion, deleted-text:offset + backspaced-so-far:address:address:shared:duplex-list:character <- get-address *deletion, deleted-text:offset insert-range backspaced-cell, *backspaced-so-far *backspaced-so-far <- copy backspaced-cell after-row:address:number <- get-address *deletion, after-row:offset *after-row <- copy *cursor-row after-column:address:number <- get-address *deletion, after-column:offset *after-column <- copy *cursor-column - after-top:address:address:duplex-list:character <- get-address *deletion, after-top-of-screen:offset + after-top:address:address:shared:duplex-list:character <- get-address *deletion, after-top-of-screen:offset *after-top <- get *editor, top-of-screen:offset break +done-adding-backspace-operation:label } # if not, create a new operation - op:address:operation <- new operation:type - deleted-until:address:duplex-list:character <- next *before-cursor + op:address:shared:operation <- new operation:type + deleted-until:address:shared:duplex-list:character <- next *before-cursor *op <- merge 2/delete-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, backspaced-cell/deleted, *before-cursor/delete-from, deleted-until, 1/coalesce-backspace editor <- add-operation editor, op +done-adding-backspace-operation @@ -1666,17 +1666,17 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } { deletion:address:delete-operation <- maybe-convert *op, delete:variant break-unless deletion - start2:address:address:duplex-list:character <- get-address *editor, data:offset - anchor:address:duplex-list:character <- get *deletion, delete-from:offset + start2:address:address:shared:duplex-list:character <- get-address *editor, data:offset + anchor:address:shared:duplex-list:character <- get *deletion, delete-from:offset break-unless anchor - deleted:address:duplex-list:character <- get *deletion, deleted-text:offset - old-cursor:address:duplex-list:character <- last deleted + deleted:address:shared:duplex-list:character <- get *deletion, deleted-text:offset + old-cursor:address:shared:duplex-list:character <- last deleted insert-range anchor, deleted # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *before-cursor <- copy old-cursor *cursor-row <- get *deletion, before-row:offset *cursor-column <- get *deletion, before-column:offset - top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset + top:address:address:shared:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *deletion, before-top-of-screen:offset } ] @@ -1685,13 +1685,13 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } { deletion:address:delete-operation <- maybe-convert *op, delete:variant break-unless deletion - start:address:duplex-list:character <- get *deletion, delete-from:offset - end:address:duplex-list:character <- get *deletion, delete-until:offset + start:address:shared:duplex-list:character <- get *deletion, delete-from:offset + end:address:shared:duplex-list:character <- get *deletion, delete-until:offset remove-between start, end # assert cursor-row/cursor-column/top-of-screen match after-row/after-column/after-top-of-screen *cursor-row <- get *deletion, after-row:offset *cursor-column <- get *deletion, after-column:offset - top:address:address:duplex-list:character <- get-address *editor, top-of-screen:offset + top:address:address:shared:duplex-list:character <- get-address *editor, top-of-screen:offset *top <- get *deletion, after-top-of-screen:offset } ] @@ -1701,9 +1701,9 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-and-redo-delete [ # create an editor assume-screen 10/width, 5/height - 1:address:array:character <- new [] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # insert some text and hit delete and backspace a few times assume-console [ type [abcdef] @@ -1713,15 +1713,15 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press delete press delete ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . .af . .┈┈┈┈┈┈┈┈┈┈. . . ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 1 @@ -1731,10 +1731,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 1 @@ -1750,10 +1750,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 2 @@ -1769,10 +1769,10 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 2 @@ -1788,11 +1788,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # first line inserted - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 2 @@ -1808,11 +1808,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # first line inserted - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 1 @@ -1828,11 +1828,11 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # first line inserted - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 1 @@ -1846,37 +1846,37 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] after <delete-character-begin> [ - top-before:address:duplex-list:character <- get *editor, top-of-screen:offset + top-before:address:shared:duplex-list:character <- get *editor, top-of-screen:offset ] before <delete-character-end> [ { break-unless deleted-cell # delete failed; don't add an undo operation - top-after:address:duplex-list:character <- get *editor, top-of-screen:offset - undo:address:address:list:address:operation <- get-address *editor, undo:offset + top-after:address:shared:duplex-list:character <- get *editor, top-of-screen:offset + undo:address:address:shared:list:address:shared:operation <- get-address *editor, undo:offset { # if previous operation was an insert, coalesce this operation with it break-unless *undo - op:address:operation <- first *undo + op:address:shared:operation <- first *undo deletion:address:delete-operation <- maybe-convert *op, delete:variant break-unless deletion previous-coalesce-tag:number <- get *deletion, tag:offset coalesce?:boolean <- equal previous-coalesce-tag, 2/coalesce-delete break-unless coalesce? - delete-until:address:address:duplex-list:character <- get-address *deletion, delete-until:offset + delete-until:address:address:shared:duplex-list:character <- get-address *deletion, delete-until:offset *delete-until <- next *before-cursor - deleted-so-far:address:address:duplex-list:character <- get-address *deletion, deleted-text:offset + deleted-so-far:address:address:shared:duplex-list:character <- get-address *deletion, deleted-text:offset *deleted-so-far <- append *deleted-so-far, deleted-cell after-row:address:number <- get-address *deletion, after-row:offset *after-row <- copy *cursor-row after-column:address:number <- get-address *deletion, after-column:offset *after-column <- copy *cursor-column - after-top:address:address:duplex-list:character <- get-address *deletion, after-top-of-screen:offset + after-top:address:address:shared:duplex-list:character <- get-address *deletion, after-top-of-screen:offset *after-top <- get *editor, top-of-screen:offset break +done-adding-delete-operation:label } # if not, create a new operation - op:address:operation <- new operation:type - deleted-until:address:duplex-list:character <- next *before-cursor + op:address:shared:operation <- new operation:type + deleted-until:address:shared:duplex-list:character <- next *before-cursor *op <- merge 2/delete-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, deleted-cell/deleted, *before-cursor/delete-from, deleted-until, 2/coalesce-delete editor <- add-operation editor, op +done-adding-delete-operation @@ -1888,16 +1888,16 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-and-redo-ctrl-k [ # create an editor assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # insert some text and hit delete and backspace a few times assume-console [ left-click 1, 1 press ctrl-k ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . .a . @@ -1905,8 +1905,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .┈┈┈┈┈┈┈┈┈┈. . . ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 1 @@ -1916,7 +1916,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -1925,8 +1925,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .┈┈┈┈┈┈┈┈┈┈. . . ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 1 @@ -1936,7 +1936,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # first line inserted screen-should-contain [ @@ -1946,8 +1946,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .┈┈┈┈┈┈┈┈┈┈. . . ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 1 @@ -1957,7 +1957,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -1969,15 +1969,15 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] after <delete-to-end-of-line-begin> [ - top-before:address:duplex-list:character <- get *editor, top-of-screen:offset + top-before:address:shared:duplex-list:character <- get *editor, top-of-screen:offset ] before <delete-to-end-of-line-end> [ { break-unless deleted-cells # delete failed; don't add an undo operation - top-after:address:duplex-list:character <- get *editor, top-of-screen:offset - undo:address:address:list:address:operation <- get-address *editor, undo:offset - op:address:operation <- new operation:type - deleted-until:address:duplex-list:character <- next *before-cursor + top-after:address:shared:duplex-list:character <- get *editor, top-of-screen:offset + undo:address:address:shared:list:address:shared:operation <- get-address *editor, undo:offset + op:address:shared:operation <- new operation:type + deleted-until:address:shared:duplex-list:character <- next *before-cursor *op <- merge 2/delete-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, deleted-cells/deleted, *before-cursor/delete-from, deleted-until, 0/never-coalesce editor <- add-operation editor, op +done-adding-delete-operation @@ -1989,16 +1989,16 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-and-redo-ctrl-u [ # create an editor assume-screen 10/width, 5/height - 1:address:array:character <- new [abc + 1:address:shared:array:character <- new [abc def] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # insert some text and hit delete and backspace a few times assume-console [ left-click 1, 2 press ctrl-u ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . .c . @@ -2006,8 +2006,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .┈┈┈┈┈┈┈┈┈┈. . . ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 0 @@ -2017,7 +2017,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-z ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -2026,8 +2026,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .┈┈┈┈┈┈┈┈┈┈. . . ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 2 @@ -2037,7 +2037,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } press ctrl-y ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] # first line inserted screen-should-contain [ @@ -2047,8 +2047,8 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } .┈┈┈┈┈┈┈┈┈┈. . . ] - 3:number <- get *2:address:editor-data, cursor-row:offset - 4:number <- get *2:address:editor-data, cursor-column:offset + 3:number <- get *2:address:shared:editor-data, cursor-row:offset + 4:number <- get *2:address:shared:editor-data, cursor-column:offset memory-should-contain [ 3 <- 1 4 <- 0 @@ -2058,7 +2058,7 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } type [1] ] run [ - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data ] screen-should-contain [ . . @@ -2070,15 +2070,15 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } ] after <delete-to-start-of-line-begin> [ - top-before:address:duplex-list:character <- get *editor, top-of-screen:offset + top-before:address:shared:duplex-list:character <- get *editor, top-of-screen:offset ] before <delete-to-start-of-line-end> [ { break-unless deleted-cells # delete failed; don't add an undo operation - top-after:address:duplex-list:character <- get *editor, top-of-screen:offset - undo:address:address:list:address:operation <- get-address *editor, undo:offset - op:address:operation <- new operation:type - deleted-until:address:duplex-list:character <- next *before-cursor + top-after:address:shared:duplex-list:character <- get *editor, top-of-screen:offset + undo:address:address:shared:list:address:shared:operation <- get-address *editor, undo:offset + op:address:shared:operation <- new operation:type + deleted-until:address:shared:duplex-list:character <- next *before-cursor *op <- merge 2/delete-operation, save-row/before, save-column/before, top-before, *cursor-row/after, *cursor-column/after, top-after, deleted-cells/deleted, *before-cursor/delete-from, deleted-until, 0/never-coalesce editor <- add-operation editor, op +done-adding-delete-operation @@ -2088,16 +2088,16 @@ body { font-family: monospace; color: #eeeeee; background-color: #080808; } scenario editor-can-undo-and-redo-ctrl-u-2 [ # create an editor assume-screen 10/width, 5/height - 1:address:array:character <- new [] - 2:address:editor-data <- new-editor 1:address:array:character, screen:address:screen, 0/left, 10/right - editor-render screen, 2:address:editor-data + 1:address:shared:array:character <- new [] + 2:address:shared:editor-data <- new-editor 1:address:shared:array:character, screen:address:shared:screen, 0/left, 10/right + editor-render screen, 2:address:shared:editor-data # insert some text and hit delete and backspace a few times assume-console [ type [abc] press ctrl-u press ctrl-z ] - editor-event-loop screen:address:screen, console:address:console, 2:address:editor-data + editor-event-loop screen:address:shared:screen, console:address:shared:console, 2:address:shared:editor-data screen-should-contain [ . . .abc . -- cgit 1.4.1-2-gfad0