use super::*;
mod display;
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ViewNode<E> {
pub index0: bool,
pub base: E,
pub terms: Vec<ViewTermNode<E>>,
pub range: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum ViewTermNode<E> {
Index(E),
Range(ViewRangeNode<E>),
}
#[derive(Clone, Debug, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ViewRangeNode<E> {
pub start: Option<E>,
pub end: Option<E>,
pub step: Option<E>,
pub range: Range<usize>,
}
impl<E> ViewNode<E> {
pub fn rebase(mut self: Box<Self>, base: E) -> Box<Self> {
self.base = base;
self
}
pub fn method(&self) -> &'static str {
if self.index0 { "subscript0" } else { "subscript1" }
}
}
impl<E> ViewTermNode<E> {
pub fn indexed(index: E) -> Self {
Self::Index(index)
}
pub fn ranged(start: Option<E>, end: Option<E>, step: Option<E>, range: Range<usize>) -> Self {
Self::Range(ViewRangeNode { start, end, step, range })
}
}