From 21bd4f7171799a7866b38ce5ce0f5aeef602625b Mon Sep 17 00:00:00 2001 From: Jeroen van Dijk Date: Mon, 1 Dec 2025 12:21:13 +0200 Subject: [PATCH] Fix #553 update and update-in for higher arities --- convex-core/src/main/cvx/convex/core/core.cvx | 6 +++--- convex-core/src/test/java/convex/core/lang/CoreTest.java | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/convex-core/src/main/cvx/convex/core/core.cvx b/convex-core/src/main/cvx/convex/core/core.cvx index bf6643b6b..4f41bf1a5 100644 --- a/convex-core/src/main/cvx/convex/core/core.cvx +++ b/convex-core/src/main/cvx/convex/core/core.cvx @@ -691,7 +691,7 @@ ([m k f x] (assoc m k (f (get m k) x))) ([m k f x & more] - (assoc m k (apply f (get m k) more)))) + (assoc m k (apply f (get m k) x more)))) (defn update-in ^{:doc {:description "Update a value in a nested associative data structure by applying a function." @@ -701,8 +701,8 @@ (assoc-in m ks (f (get-in m ks)))) ([m ks f x] (assoc-in m ks (f (get-in m ks) x))) - ([m k f x & more] - (assoc-in m ks (apply f (get-in m ks) more)))) + ([m ks f x & more] + (assoc-in m ks (apply f (get-in m ks) x more)))) (defn dissoc-in ^{:doc {:description "Dissocs from a nested associative data structure. If a nested result is empty? dissoc it as well." diff --git a/convex-core/src/test/java/convex/core/lang/CoreTest.java b/convex-core/src/test/java/convex/core/lang/CoreTest.java index ce24c50dc..7641b6cdc 100644 --- a/convex-core/src/test/java/convex/core/lang/CoreTest.java +++ b/convex-core/src/test/java/convex/core/lang/CoreTest.java @@ -1421,6 +1421,10 @@ public void testUpdate() { assertEquals(Vectors.of(1,2,3),eval("(update [1 2 3] 1 identity)")); + assertEquals(Vectors.of(0,2,0),eval("(update [0 1 0] 1 + 1)")); + assertEquals(Vectors.of(0,4,0),eval("(update [0 1 0] 1 + 1 2)")); + assertEquals(Vectors.of(0,46,0),eval("(apply update [0 1 0] 1 + [1 2 3 4 5 6 7 8 9])")); + // nil works as empty map assertEquals(Maps.of(2,Sets.of(2,3)),eval("(update nil 2 union #{2,3})")); @@ -1444,6 +1448,10 @@ public void testUpdateIn() { assertEquals(Vectors.of(1,2,3),eval("(update-in [1 2 3] [1] identity)")); + assertEquals(Vectors.of(0,2,0),eval("(update-in [0 1 0] [1] + 1)")); + assertEquals(Vectors.of(0,4,0),eval("(update-in [0 1 0] [1] + 1 2)")); + assertEquals(Vectors.of(0,46,0),eval("(apply update-in [0 1 0] [1] + [1 2 3 4 5 6 7 8 9])")); + // nil works as empty map assertEquals(Maps.of(2,Sets.of(2,3)),eval("(update-in nil [2] union #{2,3})"));