“use strict”; const domSymbolTree = require(“./internal-constants”).domSymbolTree;

// All these operate on and return impls, not wrappers!

exports.closest = (e, localName) => {

while (e) {
  if (e.localName === localName) {
    return e;
  }
  e = domSymbolTree.parent(e);
}

return null;

};

exports.childrenByHTMLLocalName = (parent, localName) => {

return domSymbolTree.childrenToArray(parent, { filter(node) {
  return node._localName === localName && node._namespaceURI === "http://www.w3.org/1999/xhtml";
} });

};

exports.descendantsByHTMLLocalName = (parent, localName) => {

return domSymbolTree.treeToArray(parent, { filter(node) {
  return node._localName === localName && node._namespaceURI === "http://www.w3.org/1999/xhtml" && node !== parent;
} });

};

exports.childrenByHTMLLocalNames = (parent, localNamesSet) => {

return domSymbolTree.childrenToArray(parent, { filter(node) {
  return localNamesSet.has(node._localName) && node._namespaceURI === "http://www.w3.org/1999/xhtml";
} });

};

exports.descendantsByHTMLLocalNames = (parent, localNamesSet) => {

return domSymbolTree.treeToArray(parent, { filter(node) {
  return localNamesSet.has(node._localName) &&
         node._namespaceURI === "http://www.w3.org/1999/xhtml" &&
         node !== parent;
} });

};

exports.firstChildWithHTMLLocalName = (parent, localName) => {

const iterator = domSymbolTree.childrenIterator(parent);
for (const child of iterator) {
  if (child._localName === localName && child._namespaceURI === "http://www.w3.org/1999/xhtml") {
    return child;
  }
}
return null;

};

exports.firstChildWithHTMLLocalNames = (parent, localNamesSet) => {

const iterator = domSymbolTree.childrenIterator(parent);
for (const child of iterator) {
  if (localNamesSet.has(child._localName) && child._namespaceURI === "http://www.w3.org/1999/xhtml") {
    return child;
  }
}
return null;

};

exports.firstDescendantWithHTMLLocalName = (parent, localName) => {

const iterator = domSymbolTree.treeIterator(parent);
for (const descendant of iterator) {
  if (descendant._localName === localName && descendant._namespaceURI === "http://www.w3.org/1999/xhtml") {
    return descendant;
  }
}
return null;

};