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