use std::collections::HashMap;
use syntree::{Flavor, Pointer};
pub(crate) type NodeId<F> = <F as Flavor>::Pointer;
pub(crate) struct InternalNode<F>
where
F: Flavor,
{
pub(crate) y_order: usize,
pub(crate) x_center: usize,
pub(crate) x_extent: usize,
pub(crate) x_extent_of_children: usize,
pub(crate) x_extent_children: usize,
pub(crate) text: String,
pub(crate) is_emphasized: bool,
pub(crate) parent: Option<usize>,
pub(crate) ord: usize,
pub(crate) node_id: NodeId<F>,
}
impl<F> Default for InternalNode<F>
where
F: Flavor,
{
fn default() -> Self {
Self {
y_order: Default::default(),
x_center: Default::default(),
x_extent: Default::default(),
x_extent_of_children: Default::default(),
x_extent_children: Default::default(),
text: Default::default(),
is_emphasized: Default::default(),
parent: Default::default(),
ord: Default::default(),
node_id: F::Pointer::new(0).unwrap(),
}
}
}
pub(crate) struct EmbeddingHelperData<F: Flavor>(
pub(crate) Vec<InternalNode<F>>,
pub(crate) HashMap<NodeId<F>, usize>,
);
impl<F> EmbeddingHelperData<F>
where
F: Flavor,
{
pub(crate) fn with_capacity(capacity: usize) -> Self {
Self(
Vec::with_capacity(capacity),
HashMap::with_capacity(capacity),
)
}
pub(crate) fn get_by_ord(&self, ord: usize) -> Option<&InternalNode<F>> {
self.0.get(ord)
}
pub(crate) fn get_mut_by_ord(&mut self, ord: usize) -> Option<&mut InternalNode<F>> {
self.0.get_mut(ord)
}
pub(crate) fn get_by_node_id(&self, node_id: &NodeId<F>) -> Option<&InternalNode<F>> {
self.1.get(node_id).and_then(|n| self.0.get(*n))
}
pub(crate) fn get_mut_by_node_id(
&mut self,
node_id: &NodeId<F>,
) -> Option<&mut InternalNode<F>> {
self.1.get(node_id).and_then(|n| self.0.get_mut(*n))
}
pub(crate) fn insert(&mut self, ord: usize, item: InternalNode<F>) {
self.1.insert(item.node_id, ord);
self.0.insert(ord, item);
}
}