///|
pub(all) struct Node[A] {
  v : A
  meta : Meta
} derive(Eq, Debug)

///|
#deprecated
#doc(hidden)
pub extend Node with Eq::{not_equal, equal}

///|
#deprecated
#doc(hidden)
pub extend Node with @debug.Debug::{to_repr}

///|
pub fn[A] Node::new(v : A, meta~ : Meta = Meta::none()) -> Node[A] {
  { v, meta, }
}

///|
pub fn[A, B] Node::map(self : Node[A], f : (A) -> B) -> Node[B] {
  { v: f(self.v), meta: self.meta, }
}

///|
pub type StringNode = Node[String]

///|
pub type BlanksNode = Node[Blanks]

///|
pub fn StringNode::empty(meta~ : Meta = Meta::none()) -> StringNode {
  { v: "", meta, }
}