use crate::{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)
}
}