Documentation
use deref_derive::{Deref, DerefMut};

use crate::{Span, ToSpan};

#[derive(Deref, DerefMut, ToSpan, Clone, PartialEq)]
pub struct Node<T> {
    pub span: Span,
    #[deref]
    pub value: T,
}
pub use teleparse_macros::Node;

impl<T> Node<T> {
    pub fn new<S: Into<Span>>(span: S, value: T) -> Self {
        Self {
            span: span.into(),
            value,
        }
    }

    #[inline]
    pub fn into_inner(self) -> T {
        self.value
    }
}

impl<T: std::fmt::Debug> std::fmt::Debug for Node<T> {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "{:?} => ", self.span)?;
        self.value.fmt(f)
    }
}