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;
}