pub mod vcomp;
pub mod vlist;
pub mod vnode;
pub mod vtag;
pub mod vtext;
use std::collections::{HashMap, HashSet};
use std::fmt;
use web_sys::{Element, Node};
pub use self::vcomp::VComp;
pub use self::vlist::VList;
pub use self::vnode::VNode;
pub use self::vtag::VTag;
pub use self::vtext::VText;
use html::{Component, EventListenerHandle, Scope};
pub trait Listener<COMP: Component> {
fn kind(&self) -> &'static str;
fn attach(&mut self, element: &Element, scope: Scope<COMP>) -> EventListenerHandle;
}
impl<COMP: Component> fmt::Debug for dyn Listener<COMP> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Listener {{ kind: {} }}", self.kind())
}
}
type Listeners<COMP> = Vec<Box<dyn Listener<COMP>>>;
type Attributes = HashMap<String, String>;
type Classes = HashSet<String>;
enum Patch<ID, T> {
Add(ID, T),
Replace(ID, T),
Remove(ID),
}
enum Reform {
Keep,
Before(Option<Node>),
}
pub trait VDiff {
type Component: Component;
fn detach(&mut self, parent: &Node) -> Option<Node>;
fn apply(
&mut self,
parent: &Node,
precursor: Option<&Node>,
ancestor: Option<VNode<Self::Component>>,
scope: &Scope<Self::Component>,
) -> Option<Node>;
}