summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core.fnl17
-rw-r--r--core_test.fnl8
2 files changed, 22 insertions, 3 deletions
diff --git a/core.fnl b/core.fnl
index fc072ed..0be0a48 100644
--- a/core.fnl
+++ b/core.fnl
@@ -353,6 +353,21 @@ oppisite truth value."
(fn inc [x] (+ x 1))
(fn dec [x] (- x 1))
+
+(fn* assoc
+ "Associate key `k' with value `v' in associative `tbl'."
+ ([tbl k v] (doto tbl (tset k v)))
+ ([tbl k v & kvs]
+ (tset tbl k v)
+ (assert (zero? (% (length kvs) 2)) "expected even amount key-value args")
+ (var [i k v] [1 nil nil])
+ (var (i k) (next kvs))
+ (while i
+ (set (i v) (next kvs i))
+ (tset tbl k v)
+ (set (i k) (next kvs i)))
+ tbl))
+
{: apply
: seq
: first
@@ -390,4 +405,4 @@ oppisite truth value."
: reverse
: inc
: dec
- }
+ : assoc}
diff --git a/core_test.fnl b/core_test.fnl
index 38ce135..0367ae2 100644
--- a/core_test.fnl
+++ b/core_test.fnl
@@ -39,7 +39,8 @@
: range
: reverse
: inc
- : dec}
+ : dec
+ : assoc}
(require :core))
(deftest equality
@@ -241,7 +242,10 @@
(assert-eq (rest {:a 1}) []))
(testing reduce-kv
- (assert-eq (reduce-kv #(+ $1 $3) 0 {:a 1 :b 2 :c 3}) 6)))
+ (assert-eq (reduce-kv #(+ $1 $3) 0 {:a 1 :b 2 :c 3}) 6))
+
+ (testing assoc
+ (assert-eq (assoc {} :a 1 :b 2 :c 3 :d 4) {:a 1 :b 2 :c 3 :d 4})))
(deftest function-manipulation
(testing constantly