///|
/// Node array - a list of nodes with text range information
pub struct NodeArray[T] {
  elements : Array[T]
  start : Span
  end : Span
  has_trailing_comma : Bool
  is_missing_list : Bool
} derive(Eq, Show)

///|
pub fn[T] NodeArray::length(self : NodeArray[T]) -> Int {
  self.elements.length()
}

///|
pub fn[T] NodeArray::get(self : NodeArray[T], index : Int) -> T? {
  if index >= 0 && index < self.elements.length() {
    Some(self.elements[index])
  } else {
    None
  }
}

///|
pub fn[T] NodeArray::iter(self : NodeArray[T]) -> Iter[T] {
  self.elements.iter()
}

///|
/// Identifier node
pub struct Identifier {
  text : String
  has_extended_unicode_escape : Bool
  is_in_jsdoc_namespace : Bool
  span : Span
} derive(Eq, Show)

///|
pub fn Identifier::new(text : String, span : Span) -> Identifier {
  {
    text,
    has_extended_unicode_escape: false,
    is_in_jsdoc_namespace: false,
    span,
  }
}