cairo-language-server 2.20.0

The Cairo Language Server
Documentation
use std::hash::Hash;

use cairo_lang_utils::ordered_hash_map::OrderedHashMap;
#[cfg(doc)]
use itertools::Itertools;

pub trait IteratorExtension: Iterator {
    /// Groups the iterator identically to [`Itertools::into_group_map`]
    /// but produces an [`OrderedHashMap`] instead.
    ///
    /// # Invariant
    /// This function relies on the fact that [`Iterator`]
    /// is always consumed in order.
    fn into_ordered_group_map<K, V>(self) -> OrderedHashMap<K, Vec<V>>
    where
        Self: Iterator<Item = (K, V)> + Sized,
        K: Hash + Eq,
    {
        let mut groups = OrderedHashMap::<K, Vec<V>>::default();

        for (key, value) in self {
            groups.entry(key).or_default().push(value);
        }

        groups
    }
}

impl<T: Iterator> IteratorExtension for T {}