diff options
| author | Laurenz <laurmaedje@gmail.com> | 2023-05-22 13:10:27 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2023-05-22 13:10:48 +0200 |
| commit | 3d83960322e1a2053f2e6ef64cf5139b0b04cb47 (patch) | |
| tree | 86f4fbcf1ab807616ec4316badaf6c122b04751e | |
| parent | 08870d4a4c3890b9e36c67c8972e41f6af1e0042 (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.rs | 2 | ||||
| -rw-r--r-- | tests/typ/compiler/dict.typ | 6 |
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) |
