maybe-borrow 0.1.2

Macros for conditionally returning borrowed data.
Documentation
#[doc(hidden)]
pub use core::marker::PhantomData;

#[doc(hidden)]
pub trait Lt<'a> {
    type Value;
}

#[doc(hidden)]
pub struct _With<W: ?Sized>(PhantomData<W>);

impl<'lt, F: ?Sized, T> Lt<'lt> for F
where
    F: Fn(&'lt ()) -> PhantomData<(&'lt (), T)>,
{
    type Value = T;
}

pub trait WithLtHrtb<'a> {
    type ActualLt;
}

pub trait WithLt: for<'a> WithLtHrtb<'a, ActualLt = Self::Actual<'a>> {
    type Actual<'a>;
}

#[doc(hidden)]
impl<'a, L: ?Sized + Lt<'a>> WithLtHrtb<'a> for _With<L> {
    type ActualLt = L::Value;
}

#[doc(hidden)]
impl<L: ?Sized + for<'a> Lt<'a>> WithLt for _With<L> {
    type Actual<'a> = <L as Lt<'a>>::Value;
}

#[doc(hidden)]
pub type Actual<'a, W> = <W as WithLtHrtb<'a>>::ActualLt;

mod macros {
    #[doc(hidden)]
    #[macro_export]
    macro_rules! WithLt {
        ($lt:lifetime -> $Ty:ty) => {
            $crate::_m::_With<dyn for<$lt> $crate::_m::Lt<$lt, Value = $Ty>>
        };
        ($Ty:ty) => {
            $crate::_m::_With<
                fn(&()) -> $crate::_m::PhantomData<(&(), $Ty)>
            >
        };
    }
    pub use WithLt;
}

pub use macros::WithLt;