///|
fn is_whitespace_text_node(node : @dom.Node) -> Bool {
  if node.kind != Text {
    return false
  }
  for ch in node.data {
    if !ch.is_ascii_whitespace() {
      return false
    }
  }
  true
}

///|
fn text_node_without_leading_ascii_whitespace(node : @dom.Node) -> @dom.Node? {
  let view = node.data[:]
  let mut start = 0
  while start < view.length() {
    match view.get_char(start) {
      Some(ch) if ch.is_ascii_whitespace() => start += ch.utf16_len()
      _ => break
    }
  }
  if start == 0 {
    Some(node)
  } else if start >= view.length() {
    None
  } else {
    Some(@dom.text(view[start:view.length()]))
  }
}

///|
fn split_text_node_leading_ascii_whitespace(
  node : @dom.Node,
) -> (@dom.Node?, @dom.Node?) {
  let view = node.data[:]
  let mut start = 0
  while start < view.length() {
    match view.get_char(start) {
      Some(ch) if ch.is_ascii_whitespace() => start += ch.utf16_len()
      _ => break
    }
  }
  if start == 0 {
    (None, Some(node))
  } else if start >= view.length() {
    (Some(node), None)
  } else {
    (Some(@dom.text(view[0:start])), Some(@dom.text(view[start:view.length()])))
  }
}