_buildSelectorFromSortedLists()

in packages/miew/src/ComplexVisual.js [686:742]


  _buildSelectorFromSortedLists(atoms, residues, chains) {
    const complex = this._complex;

    function optimizeList(list) {
      const result = [];
      let k = 0;
      let first = NaN;
      let last = NaN;
      for (let i = 0, n = list.length; i < n; ++i) {
        const value = list[i];
        if (value === last + 1) {
          last = value;
        } else {
          if (!Number.isNaN(first)) {
            result[k++] = new selectors.Range(first, last);
          }
          first = last = value;
        }
      }
      if (!Number.isNaN(first)) {
        result[k] = new selectors.Range(first, last);
      }
      return result;
    }

    let expression = null;
    if (chains.length === complex._chains.length) {
      expression = selectors.all();
    } else {
      let selector;
      if (chains.length > 0) {
        selector = selectors.chain(chains);
        expression = expression ? selectors.or(expression, selector) : selector;// NOSONAR
      }
      if (Object.keys(residues).length > 0) {
        for (const ch in residues) {
          if (residues.hasOwnProperty(ch)) {
            selector = selectors.and(
              selectors.chain(ch),
              selectors.residx(optimizeList(residues[ch])),
            );
            expression = expression ? selectors.or(expression, selector) : selector;
          }
        }
      }
      if (atoms.length > 0) {
        selector = selectors.serial(optimizeList(atoms));
        expression = expression ? selectors.or(expression, selector) : selector;
      }

      if (!expression) {
        expression = selectors.none();
      }
    }

    return expression;
  }