write-out interface for points

This commit is contained in:
AF 2023-04-22 21:44:48 +00:00
parent 770d3594e8
commit cb18245de6
8 changed files with 29 additions and 26 deletions

View File

@ -89,13 +89,21 @@ pub trait Mentionable<'a, Ctx: 'a + Context>: 'a + Serializable {
/// Used for walking over object trees to ensure two objects with different references don't collide. /// Used for walking over object trees to ensure two objects with different references don't collide.
fn topology(&self) -> Hash { fn topology(&self) -> Hash {
let mut vec = Vec::new(); let mut vec = Vec::new();
for point in self.points() { let mut points = Vec::new();
self.points(&mut points);
for point in points {
vec.extend(point.point); vec.extend(point.point);
} }
Ctx::hash(&vec) Ctx::hash(&vec)
} }
/// References ([Point]s) to other objects. /// References ([Point]s) to other objects.
fn points(&self) -> Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>; fn points(&self, points: &mut Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>);
fn points_vec(&self) -> Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>> {
let mut points = Vec::new();
self.points(&mut points);
points
}
} }
/// Short-hand for the type of values returned by [`Resolver::resolve`]. /// Short-hand for the type of values returned by [`Resolver::resolve`].
@ -273,8 +281,8 @@ impl<'a, Ctx: 'a + Context> Mentionable<'a, Ctx> for TypelessMentionable<'a, Ctx
self.t_topology self.t_topology
} }
fn points(&self) -> Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>> { fn points(&self, points: &mut Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>) {
self.t_points.clone() points.extend(self.t_points.iter().map(Clone::clone));
} }
} }
@ -324,7 +332,7 @@ impl<'a, Ctx: 'a + Context> TypelessMentionable<'a, Ctx> {
pub fn from_typed<A: Mentionable<'a, Ctx>>(mentionable: Rc<A>) -> Self { pub fn from_typed<A: Mentionable<'a, Ctx>>(mentionable: Rc<A>) -> Self {
let factory = TypelessFactory::from_typed(mentionable.factory()); let factory = TypelessFactory::from_typed(mentionable.factory());
let topology = mentionable.topology(); let topology = mentionable.topology();
let points = mentionable.points(); let points = mentionable.points_vec();
TypelessMentionable { TypelessMentionable {
t_serialize: Box::new(move |serializer| mentionable.serialize(serializer)), t_serialize: Box::new(move |serializer| mentionable.serialize(serializer)),
t_factory: factory, t_factory: factory,

View File

@ -127,8 +127,8 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx> for Po
Ctx::hash(&self.point) Ctx::hash(&self.point)
} }
fn points(&self) -> Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>> { fn points(&self, points: &mut Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>) {
vec![self.typeless()] points.push(self.typeless());
} }
} }

View File

@ -43,9 +43,7 @@ impl<'a, Ctx: 'a + Context, A: Atomic> Mentionable<'a, Ctx> for AtomicObject<A>
Ctx::hash(b"") Ctx::hash(b"")
} }
fn points(&self) -> Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>> { fn points(&self, _points: &mut Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>) {}
vec![]
}
} }
/// Generic implementation of a factory for [Atomic]s. /// Generic implementation of a factory for [Atomic]s.
@ -97,4 +95,3 @@ impl<A: Atomic> ExtAtomicObject for A {
self.into() self.into()
} }
} }

View File

@ -84,7 +84,7 @@ where
|resolved| match resolved { |resolved| match resolved {
Ok(mentionable) => { Ok(mentionable) => {
let resolver: Rc<dyn Resolver<'a, Ctx>> = Rc::new(CastResolver { let resolver: Rc<dyn Resolver<'a, Ctx>> = Rc::new(CastResolver {
points: mentionable.points(), points: mentionable.points_vec(),
}); });
Ok((mentionable.bytes(), resolver)) Ok((mentionable.bytes(), resolver))
} }
@ -111,7 +111,7 @@ where
factory.parse_slice( factory.parse_slice(
&self.bytes(), &self.bytes(),
Rc::new(CastResolver { Rc::new(CastResolver {
points: self.points(), points: self.points_vec(),
}), }),
) )
} }

View File

@ -44,10 +44,9 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx>
StackNodeFactory::new(self.element.factory()) StackNodeFactory::new(self.element.factory())
} }
fn points(&self) -> Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>> { fn points(&self, points: &mut Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>) {
let mut points = self.rest.points(); self.rest.points(points);
points.extend(self.element.points()); self.element.points(points);
points
} }
} }

View File

@ -1,7 +1,7 @@
pub mod static_pair; pub mod static_pair;
use super::atomic::*;
use super::atomic::atomic_object::*; use super::atomic::atomic_object::*;
use super::atomic::*;
use crate::core::*; use crate::core::*;
use crate::std::*; use crate::std::*;

View File

@ -79,11 +79,10 @@ impl<'a, Ctx: 'a + Context, SP: StaticPair<'a, Ctx>> Mentionable<'a, Ctx> for St
} }
} }
fn points(&self) -> Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>> { fn points(&self, points: &mut Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>) {
let (a, b) = self.pair.elements(); let (a, b) = self.pair.elements();
let mut vec = a.points(); a.points(points);
vec.extend(b.points()); b.points(points);
vec
} }
} }

View File

@ -40,11 +40,11 @@ impl<'a, Ctx: 'a + Context, A: Mentionable<'a, Ctx>> Mentionable<'a, Ctx> for Nu
} }
} }
fn points(&self) -> Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>> { fn points(&self, points: &mut Vec<Point<'a, Ctx, TypelessMentionable<'a, Ctx>>>) {
match self { match self {
Nullable::Null(_) => vec![], Nullable::Null(_) => {}
Nullable::NotNull(point) => vec![point.typeless()], Nullable::NotNull(point) => points.push(point.typeless()),
} };
} }
} }