use ty_tag::lifetime_list::LifetimeList;
use ty_tag::{ReifySized, TagTypeId};
use super::{ErasedWantFor, Want, WantFor};
pub struct WantOne<L: LifetimeList, T: ?Sized + ReifySized<L>>(Option<T::Reified>);
impl<T: ?Sized + ReifySized<L>, L: LifetimeList> Default for WantOne<L, T> {
fn default() -> Self {
Self(None)
}
}
impl<T: ?Sized + ReifySized<L>, L: LifetimeList> WantOne<L, T> {
pub const fn new(value: Option<T::Reified>) -> Self {
Self(value)
}
pub fn into_inner(self) -> Option<T::Reified> {
self.0
}
}
impl<T, L> Want<L> for WantOne<L, T>
where
T: ?Sized + ReifySized<L>,
L: LifetimeList,
{
fn try_for_id(&mut self, tag_type_id: TagTypeId<L>) -> Option<ErasedWantFor<'_, L>> {
if tag_type_id == TagTypeId::<L>::of_reify::<T>() {
Some(ErasedWantFor::new::<T>(self))
} else {
None
}
}
fn is_satisfied(&self) -> bool {
self.0.is_some()
}
}
impl<T: ?Sized + ReifySized<L>, L: LifetimeList> WantFor<T::Reified> for WantOne<L, T> {
fn fulfill(&mut self, value: <T>::Reified) {
self.0 = Some(value);
}
fn is_satisfied(&self) -> bool {
self.0.is_some()
}
}