use crate::future_wrapper::FutureWrapper;
use crate::resolve::{Env, ResolvedPath};
use futures::future::Shared;
use std::hash::Hash;
use std::rc::Rc;
pub trait EnvContainer<'sg, 'rslv, LABEL: 'sg, DATA: 'sg>:
From<Env<'sg, LABEL, DATA>> + 'rslv
{
fn empty() -> Self;
fn flat_map(
&self,
map: impl 'rslv + for<'short> FnOnce(&'short Env<'sg, LABEL, DATA>) -> Self,
) -> Self;
}
impl<'sg: 'rslv, 'rslv, LABEL, DATA> EnvContainer<'sg, 'rslv, LABEL, DATA> for Env<'sg, LABEL, DATA>
where
ResolvedPath<'sg, LABEL, DATA>: Hash + Eq,
{
fn empty() -> Self {
Self::new()
}
fn flat_map(
&self,
map: impl 'rslv + for<'short> FnOnce(&'short Env<'sg, LABEL, DATA>) -> Self,
) -> Self {
map(self)
}
}
impl<'sg: 'rslv, 'rslv, LABEL: 'sg, DATA: 'sg> EnvContainer<'sg, 'rslv, LABEL, DATA>
for Rc<Env<'sg, LABEL, DATA>>
where
ResolvedPath<'sg, LABEL, DATA>: Hash + Eq,
{
fn empty() -> Self {
Self::new(Env::empty())
}
fn flat_map(
&self,
map: impl for<'short> FnOnce(&'short Env<'sg, LABEL, DATA>) -> Self,
) -> Self {
map(self)
}
}
impl<'sg, LABEL: 'sg, DATA: 'sg, E> From<Env<'sg, LABEL, DATA>>
for Result<Env<'sg, LABEL, DATA>, E>
{
fn from(value: Env<'sg, LABEL, DATA>) -> Self {
Ok(value)
}
}
impl<'sg: 'rslv, 'rslv, LABEL: 'sg, DATA: 'sg, E: 'rslv> EnvContainer<'sg, 'rslv, LABEL, DATA>
for Result<Env<'sg, LABEL, DATA>, E>
where
ResolvedPath<'sg, LABEL, DATA>: Hash + Eq,
E: Clone,
{
fn empty() -> Self {
Ok(Env::empty())
}
fn flat_map(&self, map: impl for<'short> FnOnce(&Env<'sg, LABEL, DATA>) -> Self) -> Self {
match self {
Ok(env) => map(env),
Err(err) => Err(err.clone()),
}
}
}
impl<'sg: 'rslv, 'rslv, LABEL: 'sg, DATA: 'sg> EnvContainer<'sg, 'rslv, LABEL, DATA>
for FutureWrapper<'rslv, Env<'sg, LABEL, DATA>>
where
ResolvedPath<'sg, LABEL, DATA>: Hash + Eq,
LABEL: Clone,
{
fn empty() -> Self {
FutureWrapper::new(std::future::ready(Env::empty()))
}
fn flat_map(
&self,
map: impl 'rslv + for<'short> FnOnce(&'short Env<'sg, LABEL, DATA>) -> Self,
) -> Self {
let fut = Shared::clone(&self.0);
FutureWrapper::new(async move {
let env = fut.await;
map(&env).0.await
})
}
}
impl<'sg: 'rslv, 'rslv, LABEL, DATA> From<Env<'sg, LABEL, DATA>>
for FutureWrapper<'rslv, Env<'sg, LABEL, DATA>>
where
LABEL: Clone,
{
fn from(value: Env<'sg, LABEL, DATA>) -> Self {
FutureWrapper::new(std::future::ready(value))
}
}