extern crate alloc;
use alloc::boxed::Box;
use alloc::collections::BTreeSet;
use crate::metis::{Dot, DotSet, DotStore};
use super::Node;
impl<K: Ord + Clone, V: Clone> DotStore for Node<K, V> {
fn dots(&self) -> impl Iterator<Item = Dot> + '_ {
let children: Box<dyn Iterator<Item = Dot> + '_> = Box::new(self.children().dots());
self.tag()
.dots()
.chain(self.register().dots())
.chain(children)
.chain(self.sequence().dots())
}
fn is_bottom(&self) -> bool {
self.tag().is_bottom()
&& self.children().is_bottom()
&& self.register().is_bottom()
&& self.sequence().is_bottom()
}
fn causal_merge(&self, self_context: &DotSet, other: &Self, other_context: &DotSet) -> Self {
Self {
tag: self
.tag()
.causal_merge(self_context, other.tag(), other_context),
register: self
.register()
.causal_merge(self_context, other.register(), other_context),
children: self
.children()
.causal_merge(self_context, other.children(), other_context),
sequence: self
.sequence()
.causal_merge(self_context, other.sequence(), other_context),
}
}
fn causal_merge_from(&mut self, self_context: &DotSet, other: &Self, other_context: &DotSet) {
self.tag
.causal_merge_from(self_context, other.tag(), other_context);
self.register
.causal_merge_from(self_context, other.register(), other_context);
self.children
.causal_merge_from(self_context, other.children(), other_context);
self.sequence
.causal_merge_from(self_context, other.sequence(), other_context);
}
fn restrict(&self, roster: impl IntoIterator<Item = u32>) -> Self {
let roster: BTreeSet<u32> = roster.into_iter().collect();
Self {
tag: self.tag().restrict(roster.iter().copied()),
register: self.register().restrict(roster.iter().copied()),
children: self.children().restrict(roster.iter().copied()),
sequence: self.sequence().restrict(roster.iter().copied()),
}
}
fn novel_to(&self, context: &DotSet) -> Self {
Self {
tag: self.tag().novel_to(context),
register: self.register().novel_to(context),
children: self.children().novel_to(context),
sequence: self.sequence().novel_to(context),
}
}
fn novel_to_witnessed(&self, context: &DotSet, recording: &DotSet) -> Self {
Self {
tag: self.tag().novel_to_witnessed(context, recording),
register: self.register().novel_to_witnessed(context, recording),
children: self.children().novel_to_witnessed(context, recording),
sequence: self.sequence().novel_to_witnessed(context, recording),
}
}
}