2020-05-31 13:52:20 -04:00
|
|
|
use crate::renderer::context_element::IntoContextElement;
|
|
|
|
use std::borrow::Borrow;
|
|
|
|
|
|
|
|
pub trait BreadcrumbTree {
|
|
|
|
fn get_ice(&self) -> &dyn IntoContextElement;
|
|
|
|
|
|
|
|
fn get_parent(&self) -> Option<&dyn BreadcrumbTree>;
|
|
|
|
}
|
|
|
|
|
2020-05-31 15:44:09 -04:00
|
|
|
pub struct BreadcrumbTreeNode<'a, C: IntoContextElement> {
|
2020-05-31 13:52:20 -04:00
|
|
|
parent: Option<&'a dyn BreadcrumbTree>,
|
|
|
|
element: BreadcrumbTreeNodeElement<'a, C>,
|
|
|
|
}
|
|
|
|
|
|
|
|
enum BreadcrumbTreeNodeElement<'a, C: IntoContextElement> {
|
|
|
|
Owned(C),
|
|
|
|
Borrowed(&'a C),
|
|
|
|
}
|
|
|
|
|
2020-05-31 14:29:59 -04:00
|
|
|
impl<'a, C: IntoContextElement> BreadcrumbTreeNode<'a, C> {
|
2020-05-31 15:58:29 -04:00
|
|
|
pub fn ice_iter(&'a self) -> IceTreeIterator<'a> {
|
2020-05-31 15:52:46 -04:00
|
|
|
IceTreeIterator(Some(self))
|
2020-05-31 14:29:59 -04:00
|
|
|
}
|
2020-05-31 15:58:29 -04:00
|
|
|
|
|
|
|
pub fn breadcrumb_iter(&'a self) -> BreadcrumbTreeIterator<'a> {
|
|
|
|
BreadcrumbTreeIterator(Some(self))
|
|
|
|
}
|
2020-05-31 14:29:59 -04:00
|
|
|
}
|
|
|
|
|
2020-05-31 13:52:20 -04:00
|
|
|
impl<'a, C: IntoContextElement> Borrow<dyn IntoContextElement + 'a>
|
|
|
|
for BreadcrumbTreeNodeElement<'a, C>
|
|
|
|
{
|
|
|
|
fn borrow(&self) -> &(dyn IntoContextElement + 'a) {
|
|
|
|
match self {
|
|
|
|
BreadcrumbTreeNodeElement::Owned(ice) => ice,
|
|
|
|
BreadcrumbTreeNodeElement::Borrowed(ice) => *ice,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl<'a, C: IntoContextElement> BreadcrumbTree for BreadcrumbTreeNode<'a, C> {
|
|
|
|
fn get_ice(&self) -> &dyn IntoContextElement {
|
|
|
|
self.element.borrow()
|
|
|
|
}
|
|
|
|
|
|
|
|
fn get_parent(&self) -> Option<&dyn BreadcrumbTree> {
|
|
|
|
self.parent
|
|
|
|
}
|
|
|
|
}
|
2020-05-31 14:17:21 -04:00
|
|
|
|
2020-05-31 15:52:46 -04:00
|
|
|
pub struct IceTreeIterator<'a>(Option<&'a dyn BreadcrumbTree>);
|
2020-05-31 14:17:21 -04:00
|
|
|
|
2020-05-31 15:52:46 -04:00
|
|
|
impl<'a> Iterator for IceTreeIterator<'a> {
|
2020-05-31 14:17:21 -04:00
|
|
|
type Item = &'a dyn IntoContextElement;
|
|
|
|
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
|
|
let ret = self.0;
|
|
|
|
self.0 = self.0.map(|node| node.get_parent()).flatten();
|
|
|
|
ret.map(|node| node.get_ice())
|
|
|
|
}
|
|
|
|
}
|
2020-05-31 14:27:31 -04:00
|
|
|
|
|
|
|
impl<'a, C: IntoContextElement> IntoIterator for &'a BreadcrumbTreeNode<'a, C> {
|
2020-05-31 15:58:29 -04:00
|
|
|
type Item = &'a dyn BreadcrumbTree;
|
|
|
|
type IntoIter = BreadcrumbTreeIterator<'a>;
|
|
|
|
|
|
|
|
fn into_iter(self) -> BreadcrumbTreeIterator<'a> {
|
|
|
|
self.breadcrumb_iter()
|
|
|
|
}
|
|
|
|
}
|
2020-05-31 14:27:31 -04:00
|
|
|
|
2020-05-31 15:58:29 -04:00
|
|
|
pub struct BreadcrumbTreeIterator<'a>(Option<&'a dyn BreadcrumbTree>);
|
|
|
|
|
|
|
|
impl<'a> Iterator for BreadcrumbTreeIterator<'a> {
|
|
|
|
type Item = &'a dyn BreadcrumbTree;
|
|
|
|
|
|
|
|
fn next(&mut self) -> Option<Self::Item> {
|
|
|
|
let ret = self.0;
|
|
|
|
self.0 = self.0.map(|node| node.get_parent()).flatten();
|
|
|
|
ret
|
2020-05-31 14:27:31 -04:00
|
|
|
}
|
|
|
|
}
|