use super::*;
pub trait Origin<'a, Ctx: Context<'a>>: 'a + Send + Sync {
type Mtbl: MentionableBase<'a>;
fn factory(&self) -> OFctr<'a, Ctx, Self>;
fn resolve(self: Arc<Self>) -> Resolution<'a, Ctx, Self::Mtbl>
where
OFctr<'a, Ctx, Self>: FactoryParse<'a, Ctx>;
fn resolve_bytes(self: Arc<Self>) -> HashResolution<'a, Ctx>;
}
pub type OFctr<'a, Ctx, O> = Fctr<'a, <O as Origin<'a, Ctx>>::Mtbl>;
pub trait OriginMap<'a, Ctx: Context<'a>>: Origin<'a, Ctx> {
fn ref_resolve(self: &Arc<Self>) -> Resolution<'a, Ctx, Self::Mtbl>
where
OFctr<'a, Ctx, Self>: FactoryParse<'a, Ctx>,
{
self.clone().resolve()
}
fn ref_resolve_bytes(self: &Arc<Self>) -> HashResolution<'a, Ctx> {
self.clone().resolve_bytes()
}
fn resolve_map<T: 'a + Send>(
self: &Arc<Self>,
f: impl 'a + Send + FnOnce(ResolutionResult<'a, Ctx, Self::Mtbl>) -> T,
) -> Wrapped<'a, Ctx, T>
where
OFctr<'a, Ctx, Self>: FactoryParse<'a, Ctx>,
{
Ctx::fmap(self.ref_resolve(), f)
}
fn resolve_bytes_map<T: 'a + Send>(
self: &Arc<Self>,
f: impl 'a + Send + FnOnce(HashResolutionResult<'a, Ctx>) -> T,
) -> Wrapped<'a, Ctx, T> {
Ctx::fmap(self.ref_resolve_bytes(), f)
}
}
impl<'a, Ctx: Context<'a>, R: ?Sized + Origin<'a, Ctx>> OriginMap<'a, Ctx> for R {}