From bfab5180943aae98609d15da7b0030cd5e9adcca Mon Sep 17 00:00:00 2001 From: julio4 <30329843+julio4@users.noreply.github.com> Date: Wed, 22 Jan 2025 11:21:02 +0100 Subject: [PATCH 1/3] feat(corelib): Felt252DictFromIterator --- corelib/src/dict.cairo | 13 +++++++++++++ corelib/src/test/dict_test.cairo | 13 +++++++++++++ 2 files changed, 26 insertions(+) diff --git a/corelib/src/dict.cairo b/corelib/src/dict.cairo index 1cdf61e883d..63fff121ebb 100644 --- a/corelib/src/dict.cairo +++ b/corelib/src/dict.cairo @@ -263,3 +263,16 @@ impl Felt252DictIndex< self.get(index) } } + +impl Felt252DictFromIterator< + T, +Destruct, +Destruct>, +Felt252DictValue, +> of crate::iter::FromIterator, (felt252, T)> { + /// Constructs a `Felt252Dict` from an iterator of (felt252, T) key-value pairs. + fn from_iter[Item: (felt252, T)], +Destruct>(iter: I) -> Felt252Dict { + let mut dict = Default::default(); + for (key, value) in iter { + dict.insert(key, value); + }; + dict + } +} diff --git a/corelib/src/test/dict_test.cairo b/corelib/src/test/dict_test.cairo index e5515373e64..7c2fff9b46a 100644 --- a/corelib/src/test/dict_test.cairo +++ b/corelib/src/test/dict_test.cairo @@ -148,3 +148,16 @@ fn test_array_dict() { assert(value.is_null(), 'dict[10] == null'); } +#[test] +fn test_dict_from_iterator() { + let mut dict: Felt252Dict = (0..5_u32) + .into_iter() + .map(|x| (Into::::into(x), x)) + .collect(); + + assert_eq!(@dict[0], @0); + assert_eq!(@dict[1], @1); + assert_eq!(@dict[2], @2); + assert_eq!(@dict[3], @3); + assert_eq!(@dict[4], @4); +} From 87a443a47f7b77374cd767f5d5ac7015418d2ffc Mon Sep 17 00:00:00 2001 From: julio4 <30329843+julio4@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:20:20 +0100 Subject: [PATCH 2/3] apply fix --- corelib/src/dict.cairo | 2 ++ corelib/src/test/dict_test.cairo | 17 +++++++---------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/corelib/src/dict.cairo b/corelib/src/dict.cairo index 63fff121ebb..3c7f75ad0c9 100644 --- a/corelib/src/dict.cairo +++ b/corelib/src/dict.cairo @@ -268,6 +268,8 @@ impl Felt252DictFromIterator< T, +Destruct, +Destruct>, +Felt252DictValue, > of crate::iter::FromIterator, (felt252, T)> { /// Constructs a `Felt252Dict` from an iterator of (felt252, T) key-value pairs. + /// If the iterator contains repeating keys, + /// only the last value in the iterator for each key will be kept. fn from_iter[Item: (felt252, T)], +Destruct>(iter: I) -> Felt252Dict { let mut dict = Default::default(); for (key, value) in iter { diff --git a/corelib/src/test/dict_test.cairo b/corelib/src/test/dict_test.cairo index 7c2fff9b46a..34f8941ac97 100644 --- a/corelib/src/test/dict_test.cairo +++ b/corelib/src/test/dict_test.cairo @@ -150,14 +150,11 @@ fn test_array_dict() { #[test] fn test_dict_from_iterator() { - let mut dict: Felt252Dict = (0..5_u32) - .into_iter() - .map(|x| (Into::::into(x), x)) - .collect(); - - assert_eq!(@dict[0], @0); - assert_eq!(@dict[1], @1); - assert_eq!(@dict[2], @2); - assert_eq!(@dict[3], @3); - assert_eq!(@dict[4], @4); + let mut dict: Felt252Dict = (0..5_u32).into_iter().map(|x| (x.into(), x)).collect(); + + assert_eq!(dict[0], 0); + assert_eq!(dict[1], 1); + assert_eq!(dict[2], 2); + assert_eq!(dict[3], 3); + assert_eq!(dict[4], 4); } From 4f8c612d83bc6c79f9487d88506bb36cf7860de9 Mon Sep 17 00:00:00 2001 From: julio4 <30329843+julio4@users.noreply.github.com> Date: Wed, 22 Jan 2025 15:27:59 +0100 Subject: [PATCH 3/3] test: dict_from_iterator_with_duplicate_keys --- corelib/src/test/dict_test.cairo | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/corelib/src/test/dict_test.cairo b/corelib/src/test/dict_test.cairo index 34f8941ac97..bf3ed4d19e3 100644 --- a/corelib/src/test/dict_test.cairo +++ b/corelib/src/test/dict_test.cairo @@ -158,3 +158,9 @@ fn test_dict_from_iterator() { assert_eq!(dict[3], 3); assert_eq!(dict[4], 4); } + +#[test] +fn test_dict_from_iterator_with_duplicate_keys() { + let mut dict = array![(0, 1_u32), (0, 2_u32)].into_iter().collect::>(); + assert_eq!(dict[0], 2); +}