///|
/// The type for CommonMark documents.
pub(all) struct Doc {
  nl : String
  block : Block
  defs : LabelDefs
} derive(Debug)

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

///|
pub fn Doc::new(
  nl~ : String = "\n",
  defs~ : LabelDefs = Map([]),
  block : Block,
) -> Doc {
  { nl, block, defs, }
}

///|
pub fn Doc::empty() -> Doc {
  Doc::new(Block::empty())
}

///|
pub fn Doc::from_string(
  defs~ : LabelDefs = Map([]),
  resolver~ : LabelResolverFn = LabelContext::default_resolver,
  nested_links~ : Bool = false,
  heading_auto_ids~ : Bool = false,
  layout~ : Bool = false,
  locs~ : Bool = false,
  file~ : FilePath = file_path_none,
  strict~ : Bool = true,
  s : String,
) -> Doc {
  let p = Parser::new(
    defs~,
    resolver~,
    nested_links~,
    heading_auto_ids~,
    layout~,
    locs~,
    file~,
    strict~,
    s,
  )
  let (nl, doc) = p.parse_block()
  let block = p.block_struct_to_doc(doc)
  Doc::new(nl~, block, defs=p.defs)
}