about summary refs log tree commit diff stats
path: root/070table.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2016-10-31 23:13:20 -0700
committerKartik K. Agaram <vc@akkartik.com>2016-10-31 23:13:20 -0700
commit48835572a7c6922927a443c27985434fddaeacf5 (patch)
treec51a9c2e46193293a15ee541ea37f1c6f9be60a6 /070table.mu
parent9d9da2adf96d783ae51edc1bf6c9cbe6017ead8f (diff)
downloadmu-48835572a7c6922927a443c27985434fddaeacf5.tar.gz
3619
Diffstat (limited to '070table.mu')
-rw-r--r--070table.mu31
1 files changed, 25 insertions, 6 deletions
diff --git a/070table.mu b/070table.mu
index 171bb2a8..ce51f317 100644
--- a/070table.mu
+++ b/070table.mu
@@ -6,10 +6,11 @@ scenario table-read-write [
   tab:&:table:num:num <- new-table 30
   run [
     put-index tab, 12, 34
-    1:num/raw <- index tab, 12
+    60:num/raw, 61:bool/raw <- index tab, 12
   ]
   memory-should-contain [
-    1 <- 34
+    60 <- 34
+    61 <- 1  # found
   ]
 ]
 
@@ -18,10 +19,23 @@ scenario table-read-write-non-integer [
   tab:&:table:text:num <- new-table 30
   run [
     put-index tab, [abc def], 34
-    1:num/raw <- index tab, [abc def]
+    1:num/raw, 2:bool/raw <- index tab, [abc def]
   ]
   memory-should-contain [
     1 <- 34
+    2 <- 1  # found
+  ]
+]
+
+scenario table-read-not-found [
+  local-scope
+  tab:&:table:text:num <- new-table 30
+  run [
+    1:num/raw, 2:bool/raw <- index tab, [abc def]
+  ]
+  memory-should-contain [
+    1 <- 0
+    2 <- 0  # not found
   ]
 ]
 
@@ -62,7 +76,7 @@ def put-index table:&:table:_key:_value, key:_key, value:_value -> table:&:table
   *table-data <- put-index *table-data, hash-key, new-row
 ]
 
-def index table:&:table:_key:_value, key:_key -> result:_value [
+def index table:&:table:_key:_value, key:_key -> result:_value, found?:bool [
   local-scope
   load-ingredients
   hash:num <- hash key
@@ -72,8 +86,13 @@ def index table:&:table:_key:_value, key:_key -> result:_value [
   hash-key <- abs hash-key  # in case hash overflows from a double into a negative integer inside 'divide-with-remainder' above
   table-data:&:@:table-row:_key:_value <- get *table, data:offset
   x:table-row:_key:_value <- index *table-data, hash-key
-  occupied?:bool <- get x, occupied?:offset
-  assert occupied?, [can't handle missing elements yet]
+  empty:&:_value <- new _value:type
+  result <- copy *empty
+  found?:bool <- get x, occupied?:offset
+  return-unless found?
+  key2:_key <- get x, key:offset
+  found?:bool <- equal key, key2
+  return-unless found?
   result <- get x, value:offset
 ]