use crate::{DebugFunctor, EqFunctor, Foldable, Functor, HKT, NoConstraint, Satisfies};
use alloc::collections::VecDeque;
pub struct VecDequeWitness;
impl HKT for VecDequeWitness {
type Constraint = NoConstraint;
type Type<T> = VecDeque<T>;
}
impl Functor<VecDequeWitness> for VecDequeWitness {
fn fmap<A, B, Func>(
m_a: <VecDequeWitness as HKT>::Type<A>,
f: Func,
) -> <VecDequeWitness as HKT>::Type<B>
where
A: Satisfies<NoConstraint>,
B: Satisfies<NoConstraint>,
Func: FnMut(A) -> B,
{
m_a.into_iter().map(f).collect()
}
}
impl Foldable<VecDequeWitness> for VecDequeWitness {
fn fold<A, B, Func>(fa: VecDeque<A>, init: B, f: Func) -> B
where
Func: FnMut(B, A) -> B,
{
fa.into_iter().fold(init, f)
}
}
impl EqFunctor for VecDequeWitness {
fn eq_type<T: PartialEq>(a: &VecDeque<T>, b: &VecDeque<T>) -> bool {
a == b
}
}
impl DebugFunctor for VecDequeWitness {
fn fmt_type<T: core::fmt::Debug>(
fa: &VecDeque<T>,
f: &mut core::fmt::Formatter<'_>,
) -> core::fmt::Result {
core::fmt::Debug::fmt(fa, f)
}
}