use crate::extendable::par_extend_core::ParExtendCore;
use alloc::vec::Vec;
use core::hash::Hash;
use std::collections::HashMap;
impl<K: Hash + Eq + Send, V: Send> ParExtendCore<(K, V)> for HashMap<K, V> {
type ThreadValues = Self;
type OrderedThreadValues = Self;
fn new_thread_values() -> Self::ThreadValues {
Default::default()
}
fn new_ordered_thread_values() -> Self::OrderedThreadValues {
Default::default()
}
fn add_thread_value(collected: &mut Self::ThreadValues, (key, value): (K, V)) {
_ = collected.insert(key, value);
}
fn add_thread_values(
collected: &mut Self::ThreadValues,
values: impl IntoIterator<Item = (K, V)>,
) {
collected.extend(values)
}
fn add_ordered_thread_value(
collected: &mut Self::OrderedThreadValues,
_idx: usize,
value: (K, V),
) {
Self::add_thread_value(collected, value);
}
fn add_ordered_thread_values(
collected: &mut Self::OrderedThreadValues,
_idx: usize,
values: impl IntoIterator<Item = (K, V)>,
) {
Self::add_thread_values(collected, values);
}
fn add_ordered_thread_optionals(
collected: &mut Self::OrderedThreadValues,
_idx: usize,
values: impl IntoIterator<Item = Option<(K, V)>>,
) -> Option<()> {
for value in values {
let (key, value) = value?;
_ = collected.insert(key, value);
}
Some(())
}
fn add_ordered_thread_fallibles<E>(
collected: &mut Self::OrderedThreadValues,
_idx: usize,
values: impl IntoIterator<Item = Result<(K, V), E>>,
) -> Result<(), E> {
for value in values {
let (key, value) = value?;
collected.insert(key, value);
}
Ok(())
}
fn add_one(&mut self, (key, value): (K, V)) {
_ = self.insert(key, value);
}
fn extend_merge_infallibles(&mut self, results: Vec<Self::ThreadValues>) {
for result in results {
self.extend(result);
}
}
fn extend_merge_ordered_infallibles(&mut self, results: Vec<Self::OrderedThreadValues>) {
self.extend_merge_infallibles(results);
}
}