about summary refs log tree commit diff stats
path: root/065duplex_list.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-09-01 12:38:21 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-09-01 12:38:32 -0700
commitcb75d366506687b34213d8fa6b99de926f4d3b36 (patch)
treec2b804ec20d24c92bd7067708c415e0dee087563 /065duplex_list.mu
parent2e69df9fe5e59c6336e5bc9af07f14d00f36a899 (diff)
downloadmu-cb75d366506687b34213d8fa6b99de926f4d3b36.tar.gz
2121 - undo now supports the 'delete' key
Still to go: ctrl-k and ctrl-u.
Diffstat (limited to '065duplex_list.mu')
-rw-r--r--065duplex_list.mu79
1 files changed, 79 insertions, 0 deletions
diff --git a/065duplex_list.mu b/065duplex_list.mu
index e3eafcba..a8091a22 100644
--- a/065duplex_list.mu
+++ b/065duplex_list.mu
@@ -392,6 +392,72 @@ recipe remove-duplex-between [
   reply start
 ]
 
+scenario remove-range [
+  # construct a duplex list with six elements [13, 14, 15, 16, 17, 18]
+  1:address:duplex-list <- copy 0  # 1 points to singleton list
+  1:address:duplex-list <- push-duplex 18, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 17, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 16, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 15, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 14, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 13, 1:address:duplex-list
+  run [
+    # delete 16 onwards
+    # first pointer: to the third element
+    2:address:duplex-list <- next-duplex 1:address:duplex-list
+    2:address:duplex-list <- next-duplex 2:address:duplex-list
+    remove-duplex-between 2:address:duplex-list, 0
+    # now check the list
+    4:number <- get *1:address:duplex-list, value:offset
+    5:address:duplex-list <- next-duplex 1:address:duplex-list
+    6:number <- get *5:address:duplex-list, value:offset
+    7:address:duplex-list <- next-duplex 5:address:duplex-list
+    8:number <- get *7:address:duplex-list, value:offset
+    9:address:duplex-list <- next-duplex 7:address:duplex-list
+  ]
+  memory-should-contain [
+    4 <- 13
+    6 <- 14
+    8 <- 15
+    9 <- 0
+  ]
+]
+
+scenario remove-range-to-end [
+  # construct a duplex list with six elements [13, 14, 15, 16, 17, 18]
+  1:address:duplex-list <- copy 0  # 1 points to singleton list
+  1:address:duplex-list <- push-duplex 18, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 17, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 16, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 15, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 14, 1:address:duplex-list
+  1:address:duplex-list <- push-duplex 13, 1:address:duplex-list
+  run [
+    # delete 15, 16 and 17
+    # first pointer: to the third element
+    2:address:duplex-list <- next-duplex 1:address:duplex-list
+    # second pointer: to the fifth element
+    3:address:duplex-list <- next-duplex 2:address:duplex-list
+    3:address:duplex-list <- next-duplex 3:address:duplex-list
+    3:address:duplex-list <- next-duplex 3:address:duplex-list
+    3:address:duplex-list <- next-duplex 3:address:duplex-list
+    remove-duplex-between 2:address:duplex-list, 3:address:duplex-list
+    # now check the list
+    4:number <- get *1:address:duplex-list, value:offset
+    5:address:duplex-list <- next-duplex 1:address:duplex-list
+    6:number <- get *5:address:duplex-list, value:offset
+    7:address:duplex-list <- next-duplex 5:address:duplex-list
+    8:number <- get *7:address:duplex-list, value:offset
+    9:address:duplex-list <- next-duplex 7:address:duplex-list
+  ]
+  memory-should-contain [
+    4 <- 13
+    6 <- 14
+    8 <- 18
+    9 <- 0
+  ]
+]
+
 # l:address:duplex-list <- insert-duplex-range in:address:duplex-list, new:address:duplex-list
 # Inserts list beginning at 'new' after 'in'. Returns some pointer into the list.
 recipe insert-duplex-range [
@@ -422,6 +488,19 @@ recipe insert-duplex-range [
   reply in
 ]
 
+recipe append-duplex [
+  local-scope
+  in:address:duplex-list <- next-ingredient
+  new:address:duplex-list <- next-ingredient
+  last:address:duplex-list <- last-duplex in
+  dest:address:address:duplex-list <- get-address *last, next:offset
+  *dest <- copy new
+  reply-unless new, in/same-as-ingredient:0
+  dest <- get-address *new, prev:offset
+  *dest <- copy last
+  reply in/same-as-ingredient:0
+]
+
 recipe last-duplex [
   local-scope
   in:address:duplex-list <- next-ingredient