about summary refs log tree commit diff stats
path: root/archive/1.vm/063array.mu
diff options
context:
space:
mode:
Diffstat (limited to 'archive/1.vm/063array.mu')
-rw-r--r--archive/1.vm/063array.mu181
1 files changed, 181 insertions, 0 deletions
diff --git a/archive/1.vm/063array.mu b/archive/1.vm/063array.mu
new file mode 100644
index 00000000..a56e87f0
--- /dev/null
+++ b/archive/1.vm/063array.mu
@@ -0,0 +1,181 @@
+scenario array-from-args [
+  run [
+    local-scope
+    x:&:@:num <- new-array 0, 1, 2
+    10:@:num/raw <- copy *x
+  ]
+  memory-should-contain [
+    10 <- 3  # array length
+    11 <- 0
+    12 <- 1
+    13 <- 2
+  ]
+]
+
+# create an array out of a list of args
+def new-array -> result:&:@:_elem [
+  local-scope
+  capacity:num <- copy 0
+  {
+    # while read curr-value
+    curr-value:_elem, exists?:bool <- next-input
+    break-unless exists?
+    capacity <- add capacity, 1
+    loop
+  }
+  result <- new _elem:type, capacity
+  rewind-inputs
+  i:num <- copy 0
+  {
+    # while read curr-value
+    done?:bool <- greater-or-equal i, capacity
+    break-if done?
+    curr-value:_elem, exists?:bool <- next-input
+    assert exists?, [error in rewinding inputs to new-array]
+    *result <- put-index *result, i, curr-value
+    i <- add i, 1
+    loop
+  }
+  return result
+]
+
+# fill an existing array with a set of numbers
+# (contributed by Caleb Couch)
+def fill array:&:@:num -> array:&:@:num [
+  local-scope
+  load-inputs
+  loopn:num <- copy 0
+  length:num <- length *array
+  {
+    length?:bool <- equal loopn, length
+    break-if length?
+    object:num, arg-received?:bool <- next-input
+    break-unless arg-received?
+    *array <- put-index *array, loopn, object
+    loopn <- add loopn, 1
+    loop
+  }
+]
+
+scenario fill-on-an-empty-array [
+  local-scope
+  array:&:@:num <- new number:type, 3
+  run [
+    array <- fill array, 1 2 3
+    10:@:num/raw <- copy *array
+  ]
+  memory-should-contain [
+    10 <- 3
+    11 <- 1
+    12 <- 2
+    13 <- 3
+  ]
+]
+
+scenario fill-overwrites-existing-values [
+  local-scope
+  array:&:@:num <- new number:type, 3
+  *array <- put-index *array, 0, 4
+  run [
+    array <- fill array, 1 2 3
+    10:@:num/raw <- copy *array
+  ]
+  memory-should-contain [
+    10 <- 3
+    11 <- 1
+    12 <- 2
+    13 <- 3
+  ]
+]
+
+scenario fill-exits-gracefully-when-given-no-inputs [
+  local-scope
+  array:&:@:num <- new number:type, 3
+  run [
+    array <- fill array
+    10:@:num/raw <- copy *array
+  ]
+  memory-should-contain [
+    10 <- 3
+    11 <- 0
+    12 <- 0
+    13 <- 0
+  ]
+]
+
+# swap two elements of an array
+# (contributed by Caleb Couch)
+def swap array:&:@:num, index1:num, index2:num -> array:&:@:num [
+  local-scope
+  load-inputs
+  object1:num <- index *array, index1
+  object2:num <- index *array, index2
+  *array <- put-index *array, index1, object2
+  *array <- put-index *array, index2, object1
+]
+
+scenario swap-works [
+  local-scope
+  array:&:@:num <- new number:type, 4
+  array <- fill array, 4 3 2 1
+  run [
+    array <- swap array, 0, 2
+    10:num/raw <- index *array, 0
+    11:num/raw <- index *array, 2
+  ]
+  memory-should-contain [
+    10 <- 2
+    11 <- 4
+  ]
+]
+
+# reverse the elements of an array
+# (contributed by Caleb Couch)
+def reverse array:&:@:_elem -> array:&:@:_elem [
+  local-scope
+  load-inputs
+  start:num <- copy 0
+  length:num <- length *array
+  end:num <- subtract length, 1
+  {
+    done?:bool <- greater-or-equal start, end
+    break-if done?
+    array <- swap array, start, end
+    start <- add start, 1
+    end <- subtract end, 1
+    loop
+  }
+]
+
+scenario reverse-array-odd-length [
+  local-scope
+  array:&:@:num <- new number:type, 3
+  array <- fill array, 3 2 1
+  run [
+    array <- reverse array
+    10:@:num/raw <- copy *array
+  ]
+  memory-should-contain [
+    10 <- 3
+    11 <- 1
+    12 <- 2
+    13 <- 3
+  ]
+]
+
+scenario reverse-array-even-length [
+  local-scope
+  array:&:@:num <- new number:type, 4
+  array <- fill array, 4 3 2 1
+  run [
+    array <- reverse array
+    10:@:num/raw <- copy *array
+  ]
+  memory-should-contain [
+    10 <- 4
+    11 <- 1
+    12 <- 2
+    13 <- 3
+    14 <- 4
+  ]
+]