use super::{ErasedWantFor, WantFor};
use crate::tag::{ReifySized, TagTypeId};
use crate::{Lt1, LtList, Want};
pub struct WantOne<'r, L: LtList, T: ?Sized + ReifySized<Lt1<'r, L>>>(Option<T::Reified>);
impl<'r, T: ?Sized + ReifySized<Lt1<'r, L>>, L: LtList> Default for WantOne<'r, L, T> {
fn default() -> Self {
Self(None)
}
}
impl<'r, T: ?Sized + ReifySized<Lt1<'r, L>>, L: LtList> WantOne<'r, L, T> {
pub fn new(value: Option<T::Reified>) -> Self {
Self(value)
}
pub fn into_inner(self) -> Option<T::Reified> {
self.0
}
}
impl<'r, T, L> Want<'r, L> for WantOne<'r, L, T>
where
T: ?Sized + ReifySized<Lt1<'r, L>>,
L: LtList,
{
fn try_for_id(
&mut self,
tag_type_id: TagTypeId<Lt1<'r, L>>,
) -> Option<ErasedWantFor<'_, Lt1<'r, L>>> {
if tag_type_id.is_same(&TagTypeId::<Lt1<'r, L>>::of::<T::Tag, T::Lifetimes>()) {
Some(ErasedWantFor::new::<T>(self))
} else {
None
}
}
fn is_satisfied(&self) -> bool {
self.0.is_some()
}
}
impl<'r, T: ?Sized + ReifySized<Lt1<'r, L>>, L: LtList> WantFor<T::Lifetimes, T::Tag>
for WantOne<'r, L, T>
{
fn fulfill(&mut self, value: <T>::Reified) {
self.0 = Some(value);
}
fn is_satisfied(&self) -> bool {
self.0.is_some()
}
}