text: import NodeType from './nodes/type';
  function isTag(node) {
      return node && node.nodeType === NodeType.ELEMENT_NODE;
  }
  function getAttributeValue(elem, name) {
      return isTag(elem) ? elem.getAttribute(name) : undefined;
  }
  function getName(elem) {
      return ((elem && elem.rawTagName) || '').toLowerCase();
  }
  function getChildren(node) {
      return node && node.childNodes;
  }
  function getParent(node) {
      return node ? node.parentNode : null;
  }
  function getText(node) {
      return node.text;
  }
  function removeSubsets(nodes) {
      let idx = nodes.length;
      let node;
      let ancestor;
      let replace;
      // Check if each node (or one of its ancestors) is already contained in the
      // array.
      while (--idx > -1) {
          node = ancestor = nodes[idx];
          // Temporarily remove the node under consideration
          nodes[idx] = null;
          replace = true;
          while (ancestor) {
              if (nodes.indexOf(ancestor) > -1) {
                  replace = false;
                  nodes.splice(idx, 1);
                  break;
              }
              ancestor = getParent(ancestor);
          }
          // If the node has been found to be unique, re-insert it.
          if (replace) {
              nodes[idx] = node;
          }
      }
      return nodes;
  }
  function existsOne(test, elems) {
      return elems.some((elem) => {
          return isTag(elem) ? test(elem) || existsOne(test, getChildren(elem)) : false;
      });
  }
  function getSiblings(node) {
      const parent = getParent(node);
      return parent && getChildren(parent);
  }
  function hasAttrib(elem, name) {
      return getAttributeValue(elem, name) !== undefined;
  }
  function findOne(test, elems) {
      let elem = null;
      for (let i = 0, l = elems.length; i < l && !elem; i++) {
          const el = elems[i];
          if (test(el)) {
              elem = el;
          }
          else {
              const childs = getChildren(el);
              if (childs && childs.length > 0) {
                  elem = findOne(test, childs);
              }
          }
      }
      return elem;
  }
  function findAll(test, nodes) {
      let result = [];
      for (let i = 0, j = nodes.length; i < j; i++) {
          if (!isTag(nodes[i]))
              continue;
          if (test(nodes[i]))
              result.push(nodes[i]);
          const childs = getChildren(nodes[i]);
          if (childs)
              result = result.concat(findAll(test, childs));
      }
      return result;
  }
  export default {
      isTag,
      getAttributeValue,
      getName,
      getChildren,
      getParent,
      getText,
      removeSubsets,
      existsOne,
      getSiblings,
      hasAttrib,
      findOne,
      findAll
  };
  