///|
using @cmark_base {type Indent}

///|
using @cmark_base {type Meta}

///|
using @cmark_base {type TextLoc}

///|
using @cmark_base {type LinePos}

///|
using @cmark_base {type CharCodePos}

///|
using @cmark_base {type FilePath}

///|
let file_path_none = @cmark_base.file_path_none

///|
using @cmark_base {type Span}

///|
using @cmark_base {type LineSpan}

///|
priv struct Tokens(@deque.Deque[Token]) derive(Debug)

///|
test {
  // Prevent warning about unused Debug.
  (fn(t : Tokens) { @debug.to_string(t) }) |> ignore()
}

///|
fn Tokens::push(self : Tokens, t : Token) -> Unit {
  self.0.push_back(t)
}

// fn Tokens::pop(self : Tokens) -> Token? {
//   self._.pop_back()
// }

///|
priv struct RevTokens(@deque.Deque[Token]) derive(Debug)

///|
test {
  // Prevent warning about unused Debug.
  (fn(t : RevTokens) { @debug.to_string(t) }) |> ignore()
}

///|
fn RevTokens::push(self : RevTokens, t : Token) -> Unit {
  self.0.push_front(t)
}

///|
fn RevTokens::pop(self : RevTokens) -> Token? {
  self.0.pop_front()
}

///|
using @cmark_base {type HeadingLevel}

///|
using @cmark_base {type NextLineFn}

///|
using @cmark_base {type HtmlBlockEndCond}

///|
using @cmark_base {type ListType}

///|
using @cmark_base {type LineType}