use crate::{Foldable, Functor, HKT, HKT2, NoConstraint, Placeholder, Satisfies};
use std::collections::HashMap;
use std::hash::Hash;
pub struct HashMapWitness<K>(Placeholder, K);
impl<K> HKT2<K> for HashMapWitness<K> {
type Type<V> = HashMap<K, V>;
}
impl<K> HKT for HashMapWitness<K> {
type Constraint = NoConstraint;
type Type<V> = HashMap<K, V>;
}
impl<K> Functor<HashMapWitness<K>> for HashMapWitness<K>
where
K: Hash + Eq + Clone + 'static,
{
fn fmap<A, B, Func>(
m_a: <HashMapWitness<K> as HKT2<K>>::Type<A>,
mut f: Func,
) -> <HashMapWitness<K> as HKT2<K>>::Type<B>
where
A: Satisfies<NoConstraint>,
B: Satisfies<NoConstraint>,
Func: FnMut(A) -> B,
{
m_a.into_iter().map(|(k, v)| (k, f(v))).collect()
}
}
impl<K> Foldable<HashMapWitness<K>> for HashMapWitness<K>
where
K: Hash + Eq + 'static,
{
fn fold<A, B, Func>(fa: HashMap<K, A>, init: B, f: Func) -> B
where
Func: FnMut(B, A) -> B,
{
fa.into_values().fold(init, f)
}
}