diff --git a/tamer/src/asg/graph.rs b/tamer/src/asg/graph.rs index c1de4c4f..b7a0a538 100644 --- a/tamer/src/asg/graph.rs +++ b/tamer/src/asg/graph.rs @@ -211,8 +211,8 @@ impl Asg { to_oi: ObjectIndex, ctx_span: Option, ) -> Result<(), AsgError> { - from_oi.pre_add_edge(self, to_oi, ctx_span).map(|()| { - self.graph.add_edge( + from_oi.pre_add_edge(self, to_oi, ctx_span, |asg| { + asg.graph.add_edge( from_oi.widen().into(), to_oi.into(), (from_oi.src_rel_ty(), OB::rel_ty(), ctx_span), @@ -512,6 +512,7 @@ pub trait AsgRelMut: ObjectRelatable { fn pre_add_edge( asg: &mut Asg, rel: ProposedRel, + commit: impl FnOnce(&mut Asg), ) -> Result<(), AsgError>; } @@ -528,11 +529,12 @@ impl AsgRelMut for OA { /// overridden for a particular edge for a particular object /// (see [`object::tpl`] as an example). default fn pre_add_edge( - _asg: &mut Asg, + asg: &mut Asg, _rel: ProposedRel, + commit: impl FnOnce(&mut Asg), ) -> Result<(), AsgError> { let _ = _rel.ctx_span; // TODO: remove when used (dead_code) - Ok(()) + Ok(commit(asg)) } } diff --git a/tamer/src/asg/graph/object/rel.rs b/tamer/src/asg/graph/object/rel.rs index de58be0b..4a19b8f9 100644 --- a/tamer/src/asg/graph/object/rel.rs +++ b/tamer/src/asg/graph/object/rel.rs @@ -864,6 +864,7 @@ pub trait ObjectIndexRelTo: Sized + Clone + Copy { asg: &mut Asg, to_oi: ObjectIndex, ctx_span: Option, + commit: impl FnOnce(&mut Asg), ) -> Result<(), AsgError>; /// Check whether an edge exists from `self` to `to_oi`. @@ -947,6 +948,7 @@ where asg: &mut Asg, to_oi: ObjectIndex, ctx_span: Option, + commit: impl FnOnce(&mut Asg), ) -> Result<(), AsgError> { O::pre_add_edge( asg, @@ -955,6 +957,7 @@ where to_oi, ctx_span, }, + commit, ) } } @@ -975,6 +978,7 @@ impl ObjectIndexRelTo for ObjectIndexTo { asg: &mut Asg, to_oi: ObjectIndex, ctx_span: Option, + commit: impl FnOnce(&mut Asg), ) -> Result<(), AsgError> { macro_rules! pre_add_edge { ($ty:ident) => { @@ -985,6 +989,7 @@ impl ObjectIndexRelTo for ObjectIndexTo { to_oi, ctx_span, }, + commit, ) }; } @@ -1019,9 +1024,10 @@ impl ObjectIndexRelTo for ObjectIndexToTree { asg: &mut Asg, to_oi: ObjectIndex, ctx_span: Option, + commit: impl FnOnce(&mut Asg), ) -> Result<(), AsgError> { match self { - Self(oito) => oito.pre_add_edge(asg, to_oi, ctx_span), + Self(oito) => oito.pre_add_edge(asg, to_oi, ctx_span, commit), } } } diff --git a/tamer/src/asg/graph/object/tpl.rs b/tamer/src/asg/graph/object/tpl.rs index aa3f3f87..bb15ccf6 100644 --- a/tamer/src/asg/graph/object/tpl.rs +++ b/tamer/src/asg/graph/object/tpl.rs @@ -221,6 +221,7 @@ object_rel! { fn pre_add_edge( asg: &mut Asg, rel: ProposedRel, + commit: impl FnOnce(&mut Asg), ) -> Result<(), AsgError> { let tpl_name = rel.from_oi.name(asg); let span = rel.to_oi.resolve(asg).span(); @@ -228,7 +229,9 @@ object_rel! { rel.from_oi.try_map_obj_inner( asg, try_adapt_to(TplShape::Expr(span), tpl_name), - ).map(|_| ()) + )?; + + Ok(commit(asg)) } }, @@ -241,6 +244,7 @@ object_rel! { fn pre_add_edge( asg: &mut Asg, rel: ProposedRel, + commit: impl FnOnce(&mut Asg), ) -> Result<(), AsgError> { let tpl_name = rel.from_oi.name(asg); let apply = rel.to_oi.resolve(asg); @@ -251,7 +255,9 @@ object_rel! { rel.from_oi.try_map_obj_inner( asg, try_adapt_to(apply_shape, tpl_name), - ).map(|_| ()) + )?; + + Ok(commit(asg)) } },