use core::marker::PhantomData;
use crate::access::Access;
pub trait Extract<A: Access<T>, T>: Access<T> + Sized {
fn extract(self) -> (A, <A as Access<T>>::RemainderFrom<Self>);
}
pub trait TryExtract<A: Access<T>, T>: Access<T> + Sized {
fn try_extract(self) -> Result<(A, <A as Access<T>>::RemainderFrom<Self>), Self>;
}
impl<T, A: Access<T>> Extract<PhantomData<T>, T> for A {
fn extract(
self,
) -> (
PhantomData<T>,
<PhantomData<T> as Access<T>>::RemainderFrom<Self>,
) {
(PhantomData, self)
}
}
impl<T, A: Access<T>> Extract<Option<T>, T> for A {
fn extract(self) -> (Option<T>, <Option<T> as Access<T>>::RemainderFrom<Self>) {
(self.into_option(), PhantomData)
}
}
impl<T> Extract<T, T> for T {
fn extract(self) -> (T, <T as Access<T>>::RemainderFrom<Self>) {
(self, PhantomData)
}
}
impl<T, A: Access<T>> TryExtract<PhantomData<T>, T> for A {
fn try_extract(
self,
) -> Result<
(
PhantomData<T>,
<PhantomData<T> as Access<T>>::RemainderFrom<Self>,
),
Self,
>
where
PhantomData<T>: Access<T>,
{
Ok(self.extract())
}
}
impl<T, A: Access<T>> TryExtract<Option<T>, T> for A {
fn try_extract(self) -> Result<(Option<T>, <Option<T> as Access<T>>::RemainderFrom<Self>), Self>
where
Option<T>: Access<T>,
{
Ok(self.extract())
}
}
impl<T> TryExtract<T, T> for T {
fn try_extract(self) -> Result<(T, <T as Access<T>>::RemainderFrom<Self>), Self> {
Ok(self.extract())
}
}
impl<T> TryExtract<T, T> for Option<T> {
fn try_extract(self) -> Result<(T, <T as Access<T>>::RemainderFrom<Self>), Self> {
match self {
Some(v) => Ok((v, PhantomData)),
None => Err(None),
}
}
}