use crate::legacy::apply::Apply;
pub trait Applicative<A>: Apply<A> {
type Applicative<T>;
fn pure(v: A) -> Self::Applicative<A>;
}
impl<A: 'static> Applicative<A> for Option<A> {
type Applicative<T> = Option<T>;
fn pure(v: A) -> Self::Applicative<A> {
Some(v)
}
}
impl<A: 'static, E: 'static + Clone> Applicative<A> for Result<A, E> {
type Applicative<T> = Result<T, E>;
fn pure(v: A) -> Self::Applicative<A> {
Ok(v)
}
}
impl<A: 'static + Clone> Applicative<A> for Vec<A> {
type Applicative<T> = Vec<T>;
fn pure(v: A) -> Self::Applicative<A> {
vec![v]
}
}