use std::cell::Cell;
use crate::dom::Node;
pub(crate) struct BindContext<'a> {
pub(crate) parent: &'a Node,
pub(crate) tree_connected: bool,
pub(crate) tree_is_in_a_document_tree: bool,
pub(crate) tree_is_in_a_shadow_tree: bool,
pub(crate) is_shadow_tree: IsShadowTree,
}
#[derive(Debug, Eq, PartialEq)]
pub(crate) enum IsShadowTree {
Yes,
No,
}
impl<'a> BindContext<'a> {
pub(crate) fn new(parent: &'a Node, is_shadow_tree: IsShadowTree) -> Self {
BindContext {
parent,
tree_connected: parent.is_connected(),
tree_is_in_a_document_tree: parent.is_in_a_document_tree(),
tree_is_in_a_shadow_tree: parent.is_in_a_shadow_tree(),
is_shadow_tree,
}
}
pub(crate) fn is_in_tree(&self) -> bool {
self.tree_is_in_a_document_tree || self.tree_is_in_a_shadow_tree
}
}
pub(crate) struct UnbindContext<'a> {
index: Cell<Option<u32>>,
pub(crate) parent: &'a Node,
prev_sibling: Option<&'a Node>,
pub(crate) next_sibling: Option<&'a Node>,
pub(crate) tree_connected: bool,
pub(crate) tree_is_in_a_document_tree: bool,
pub(crate) tree_is_in_a_shadow_tree: bool,
}
impl<'a> UnbindContext<'a> {
pub(crate) fn new(
parent: &'a Node,
prev_sibling: Option<&'a Node>,
next_sibling: Option<&'a Node>,
cached_index: Option<u32>,
) -> Self {
UnbindContext {
index: Cell::new(cached_index),
parent,
prev_sibling,
next_sibling,
tree_connected: parent.is_connected(),
tree_is_in_a_document_tree: parent.is_in_a_document_tree(),
tree_is_in_a_shadow_tree: parent.is_in_a_shadow_tree(),
}
}
pub(crate) fn index(&self) -> u32 {
if let Some(index) = self.index.get() {
return index;
}
let index = self.prev_sibling.map_or(0, |sibling| sibling.index() + 1);
self.index.set(Some(index));
index
}
}
pub(crate) struct MoveContext<'a> {
index: Cell<Option<u32>>,
pub(crate) old_parent: Option<&'a Node>,
prev_sibling: Option<&'a Node>,
pub(crate) next_sibling: Option<&'a Node>,
}
impl<'a> MoveContext<'a> {
pub(crate) fn new(
old_parent: Option<&'a Node>,
prev_sibling: Option<&'a Node>,
next_sibling: Option<&'a Node>,
cached_index: Option<u32>,
) -> Self {
MoveContext {
index: Cell::new(cached_index),
old_parent,
prev_sibling,
next_sibling,
}
}
pub(crate) fn index(&self) -> u32 {
if let Some(index) = self.index.get() {
return index;
}
let index = self.prev_sibling.map_or(0, |sibling| sibling.index() + 1);
self.index.set(Some(index));
index
}
}