code: function traverseSiblingsUntilRootOfBranch(element, callback, predicate) {
      // ---------------------------------------------- input arguments processing
  
      if (predicate == null) {
          predicate = function(element) {
              return element != null && element != document.body;
          };
      }
  
      // -------------------------------------------------------------- processing
  
      var currentElement = element;
      var results = [];
  
      /* eslint-disable no-loop-func */
      while (predicate(currentElement)) {
          var siblings = getSiblings(currentElement).siblings;
          results.push(ariaUtilsArray.map(siblings, function(sibling) {
              return callback(sibling, currentElement, element);
          }));
  
          currentElement = currentElement.parentElement;
      }
      /* eslint-enable no-loop-func */
  
      // ------------------------------------------------------------------ return
  
      return results;
  }
docs: Traverses siblings of the given element, and then does the same for its parent, until the limit (root) is reached. The limit is either the document's body or a custom one according to a given predicate.
  
  <p>
  The callback receives the following parameters:
  <ul>
  <li>sibling: the currently traversed element</li>
  <li>current element: the current reference for the siblings (kind of represents the current depth in the tree)</li>
  <li>element: the given starting point element</li>
  </ul>
  </p>
  
  @param {HTMLElement} element The starting point element
  @param {Function} callback Description the function to be called for each traversed element
  @param {Function} predicate Optional function that tells whether the current element is not yet the limit (root); defaults to a function checking that the element exists and is not the document's body element
  
  @return {Array} The collection of results for the traversal at each depth