diff --git a/corelib/src/dict.cairo b/corelib/src/dict.cairo index 1cdf61e883d..3c7f75ad0c9 100644 --- a/corelib/src/dict.cairo +++ b/corelib/src/dict.cairo @@ -263,3 +263,18 @@ 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. + /// 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 { + dict.insert(key, value); + }; + dict + } +} diff --git a/corelib/src/test/dict_test.cairo b/corelib/src/test/dict_test.cairo index e5515373e64..bf3ed4d19e3 100644 --- a/corelib/src/test/dict_test.cairo +++ b/corelib/src/test/dict_test.cairo @@ -148,3 +148,19 @@ 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| (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); +} + +#[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); +}