use crate::{Tuple, TupleLike};
pub struct Searched;
pub struct Searching<Result>(Result);
pub trait Search<T, Result>: TupleLike {
type TakeRemainder: TupleLike;
fn take(self) -> (T, Self::TakeRemainder);
fn ref_of(&self) -> &T;
fn mut_of(&mut self) -> &mut T;
}
impl<First, Other> Search<First, Searched> for Tuple<First, Other>
where
Other: TupleLike,
{
type TakeRemainder = Other;
fn take(self) -> (First, Self::TakeRemainder) {
(self.0, self.1)
}
fn ref_of(&self) -> &First {
&self.0
}
fn mut_of(&mut self) -> &mut First {
&mut self.0
}
}
impl<First, Other, T, Result> Search<T, Searching<Result>> for Tuple<First, Other>
where
Other: TupleLike + Search<T, Result>,
{
type TakeRemainder = Tuple<First, Other::TakeRemainder>;
fn take(self) -> (T, Self::TakeRemainder) {
let (value, remainder) = self.1.take();
(value, Tuple(self.0, remainder))
}
fn ref_of(&self) -> &T {
self.1.ref_of()
}
fn mut_of(&mut self) -> &mut T {
self.1.mut_of()
}
}