From 54972e82153f7361ad1d889f5fb58c6ddfd7f1f9 Mon Sep 17 00:00:00 2001 From: Andrew Golovashevich Date: Fri, 26 Dec 2025 16:34:59 +0300 Subject: [PATCH] Support for polymorphic access to directed contexts --- src/directed/mod.rs | 6 +- src/direction.rs | 4 + src/parent2node/fixed_wrapper.rs | 139 ++++++++++++++++++++++++++++++- 3 files changed, 145 insertions(+), 4 deletions(-) diff --git a/src/directed/mod.rs b/src/directed/mod.rs index 1b23bdd..a89da1e 100644 --- a/src/directed/mod.rs +++ b/src/directed/mod.rs @@ -1,2 +1,6 @@ mod context; -mod impls; \ No newline at end of file +mod impls; + +pub use context::DirectedBinaryTreeBuilder; +pub use context::DirectedBinaryTreeDownBuilder; +pub use context::DirectedBinaryTreeDownWalker; diff --git a/src/direction.rs b/src/direction.rs index 7963a57..087ca2d 100644 --- a/src/direction.rs +++ b/src/direction.rs @@ -2,3 +2,7 @@ pub enum BinaryTreeDirection { LEFT, RIGHT, } +pub enum DirectedBinaryTreeDirection { + FORWARD, + OPPOSITE, +} diff --git a/src/parent2node/fixed_wrapper.rs b/src/parent2node/fixed_wrapper.rs index 5a49d9e..ddbfaff 100644 --- a/src/parent2node/fixed_wrapper.rs +++ b/src/parent2node/fixed_wrapper.rs @@ -2,6 +2,7 @@ use crate::NodeRefContainer; use crate::context::{ BinaryTreeDownBuilder, BinaryTreeDownWalker, BinaryTreeRootGetter, BinaryTreeRootSetter, }; +use crate::directed::{DirectedBinaryTreeDownBuilder, DirectedBinaryTreeDownWalker}; use crate::parent2node::clojure::{Parent2NodeGetter, Parent2NodeSetter}; struct Parent2LeftChildContextWrapper { @@ -18,6 +19,16 @@ struct Root2NodeContextWrapper { ctx: NodeRef, } +struct Parent2ForwardChildContextWrapper { + ctx: CtxRef, + node: NodeRef, +} + +struct Parent2OppositeChildContextWrapper { + ctx: CtxRef, + node: NodeRef, +} + impl<'ctx, CtxRef: NodeRefContainer> Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> { fn wrap(ctx: &'ctx CtxRef, node: CtxRef::NodeRef) -> Self { return Self { ctx, node }; @@ -54,14 +65,44 @@ impl<'ctx, CtxRef: NodeRefContainer + BinaryTreeRootGetter> Root2NodeContextWrap } } -impl<'ctx, CtxRef: NodeRefContainer> - Root2NodeContextWrapper<&'ctx mut CtxRef> -{ +impl<'ctx, CtxRef: NodeRefContainer> Root2NodeContextWrapper<&'ctx mut CtxRef> { fn wrap(ctx: &'ctx mut CtxRef) -> Self { return Self { ctx }; } } +impl<'ctx, CtxRef: NodeRefContainer> + Parent2ForwardChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + fn wrap(ctx: &'ctx CtxRef, node: CtxRef::NodeRef) -> Self { + return Self { ctx, node }; + } +} + +impl<'ctx, CtxRef: NodeRefContainer> + Parent2ForwardChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn wrap(ctx: &'ctx mut CtxRef, node: CtxRef::NodeRef) -> Self { + return Self { ctx, node }; + } +} + +impl<'ctx, CtxRef: NodeRefContainer> + Parent2OppositeChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + fn wrap(ctx: &'ctx CtxRef, node: CtxRef::NodeRef) -> Self { + return Self { ctx, node }; + } +} + +impl<'ctx, CtxRef: NodeRefContainer> + Parent2OppositeChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn wrap(ctx: &'ctx mut CtxRef, node: CtxRef::NodeRef) -> Self { + return Self { ctx, node }; + } +} + impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer for Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> { @@ -96,6 +137,30 @@ impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer type NodeRef = CtxRef::NodeRef; } +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer + for Parent2ForwardChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + type NodeRef = CtxRef::NodeRef; +} + +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer + for Parent2ForwardChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + type NodeRef = CtxRef::NodeRef; +} + +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer + for Parent2OppositeChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + type NodeRef = CtxRef::NodeRef; +} + +impl<'ctx, CtxRef: NodeRefContainer> NodeRefContainer + for Parent2OppositeChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + type NodeRef = CtxRef::NodeRef; +} + impl<'ctx, CtxRef: BinaryTreeDownWalker> Parent2NodeGetter for Parent2LeftChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> { @@ -144,6 +209,40 @@ impl<'ctx, CtxRef: BinaryTreeRootGetter> Parent2NodeGetter } } + + +impl<'ctx, CtxRef: DirectedBinaryTreeDownWalker> Parent2NodeGetter +for Parent2ForwardChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getForwardChild(self.node); + } +} + +impl<'ctx, CtxRef: DirectedBinaryTreeDownWalker> Parent2NodeGetter +for Parent2ForwardChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getForwardChild(self.node); + } +} + +impl<'ctx, CtxRef: DirectedBinaryTreeDownWalker> Parent2NodeGetter +for Parent2OppositeChildContextWrapper<&'ctx CtxRef, CtxRef::NodeRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getOppositeChild(self.node); + } +} + +impl<'ctx, CtxRef: DirectedBinaryTreeDownWalker> Parent2NodeGetter +for Parent2OppositeChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn getChild(&self) -> Self::NodeRef { + return self.ctx.getOppositeChild(self.node); + } +} + impl<'ctx, CtxRef: BinaryTreeDownBuilder> Parent2NodeSetter for Parent2LeftChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> { @@ -191,3 +290,37 @@ impl<'ctx, CtxRef: BinaryTreeRootSetter> Parent2NodeSetter self.ctx.clearRoot() } } + + +impl<'ctx, CtxRef: DirectedBinaryTreeDownBuilder> Parent2NodeSetter +for Parent2ForwardChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn xSetChild(&mut self, newChild: Option) { + self.ctx.xSetLeftChild(self.node, newChild); + } + + fn setChild(&mut self, newChild: Self::NodeRef) { + self.ctx.setLeftChild(self.node, newChild); + } + + fn clearChild(&mut self) { + self.ctx.clearLeftChild(self.node); + } +} + +impl<'ctx, CtxRef: DirectedBinaryTreeDownBuilder> Parent2NodeSetter +for Parent2OppositeChildContextWrapper<&'ctx mut CtxRef, CtxRef::NodeRef> +{ + fn xSetChild(&mut self, newChild: Option) { + self.ctx.xSetRightChild(self.node, newChild); + } + + fn setChild(&mut self, newChild: Self::NodeRef) { + self.ctx.setRightChild(self.node, newChild); + } + + fn clearChild(&mut self) { + self.ctx.clearRightChild(self.node); + } +} +