summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-05-22 13:10:27 +0200
committerLaurenz <laurmaedje@gmail.com>2023-05-22 13:10:48 +0200
commit3d83960322e1a2053f2e6ef64cf5139b0b04cb47 (patch)
tree86f4fbcf1ab807616ec4316badaf6c122b04751e
parent08870d4a4c3890b9e36c67c8972e41f6af1e0042 (diff)
Fix removal order for dictionary
Switches to `shift_remove` for now. In the future, we should look into a more efficient implementation. Fixes #1258.
-rw-r--r--src/eval/dict.rs2
-rw-r--r--tests/typ/compiler/dict.typ6
2 files changed, 7 insertions, 1 deletions
diff --git a/src/eval/dict.rs b/src/eval/dict.rs
index 1b28a6ba..49a60147 100644
--- a/src/eval/dict.rs
+++ b/src/eval/dict.rs
@@ -88,7 +88,7 @@ impl Dict {
/// Remove a mapping by `key` and return the value.
pub fn remove(&mut self, key: &str) -> StrResult<Value> {
- match Arc::make_mut(&mut self.0).remove(key) {
+ match Arc::make_mut(&mut self.0).shift_remove(key) {
Some(value) => Ok(value),
None => Err(missing_key(key)),
}
diff --git a/tests/typ/compiler/dict.typ b/tests/typ/compiler/dict.typ
index fd95920b..6a2f1c7c 100644
--- a/tests/typ/compiler/dict.typ
+++ b/tests/typ/compiler/dict.typ
@@ -61,6 +61,12 @@
#test(dict, (a: 3, b: 1))
---
+// Test that removal keeps order.
+#let dict = (a: 1, b: 2, c: 3, d: 4)
+#dict.remove("b")
+#test(dict.keys(), ("a", "c", "d"))
+
+---
// Error: 24-29 duplicate key: first
#(first: 1, second: 2, first: 3)