radn-rs/src/rcore/point.rs
2023-07-29 14:50:57 +00:00

46 lines
1.3 KiB
Rust

use super::*;
/// The main way to represent a reference in ADN.
pub struct Point<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> {
/// Hash of the referred content.
/// Derived both from the serialised value ([`Serializable::serialize`])
/// and its topology ([`MentionableTop::topology`]).
pub point: Hash,
/// [Origin] used in [`Point::resolve`].
pub origin: Rc<dyn Origin<'a, Ctx, Mtbl = A>>,
}
impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> PartialEq for Point<'a, Ctx, A> {
/// Note: this doesn't check for [Factory] equality.
fn eq(&self, other: &Self) -> bool {
self.point == other.point
}
}
impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Clone for Point<'a, Ctx, A> {
fn clone(&self) -> Self {
Self {
point: self.point,
origin: self.origin.clone(),
}
}
}
impl<'a, Ctx: Context<'a>, A: MentionableBase<'a, Ctx>> Point<'a, Ctx, A>
where
A::Fctr: FactoryParse<'a, Ctx>,
{
/// See [`Origin::resolve`].
pub fn resolve(&self) -> Resolution<'a, Ctx, A> {
self.origin.clone().resolve()
}
/// Resolve the object, then map the [ResolutionResult].
pub fn resolve_map<B: 'a>(
&self,
f: impl 'a + FnOnce(ResolutionResult<'a, Ctx, A>) -> B,
) -> Wrapped<'a, Ctx, B> {
Ctx::fmap(self.resolve(), f)
}
}