message: StructureElementSelectionManager.tryGetRange in both directions
diff: @@ -108,22 +108,7 @@ class StructureElementSelectionManager {
  }
  if (!e) return;
  - let predIdx = OrderedSet.findPredecessorIndex(e.indices, OrderedSet.min(xs.indices));
  - if (predIdx === 0) return;
  -
  - let fst;
  -
  - if (predIdx < OrderedSet.size(e.indices)) {
  - fst = OrderedSet.getAt(e.indices, predIdx)
  - if (fst > OrderedSet.min(xs.indices)) fst = OrderedSet.getAt(e.indices, predIdx - 1) + 1 as StructureElement.UnitIndex;
  - } else {
  - fst = OrderedSet.getAt(e.indices, predIdx - 1) + 1 as StructureElement.UnitIndex;
  - }
  -
  - return StructureElement.Loci(entry.selection.structure, [{
  - unit: e.unit,
  - indices: OrderedSet.ofRange(fst, OrderedSet.max(xs.indices))
  - }]);
  + return tryGetElementRange(entry.selection.structure, e, xs)
  }
  private prevHighlight: StructureElement.Loci | undefined = void 0;
  @@ -187,3 +172,33 @@ function remapSelectionEntry(e: SelectionEntry, s: Structure): SelectionEntry {
  selection: StructureElement.Loci.remap(e.selection, s)
  };
  }
  +
  +/**
  + * Assumes `ref` and `ext` belong to the same unit in the same structure
  + */
  +function tryGetElementRange(structure: Structure, ref: StructureElement.Loci['elements'][0], ext: StructureElement.Loci['elements'][0]) {
  +
  + const refMin = OrderedSet.min(ref.indices)
  + const refMax = OrderedSet.max(ref.indices)
  + const extMin = OrderedSet.min(ext.indices)
  + const extMax = OrderedSet.max(ext.indices)
  +
  + let min: number
  + let max: number
  +
  + if (refMax < extMin) {
  + min = refMax + 1
  + max = extMax
  + } else if (extMax < refMin) {
  + min = extMin
  + max = refMin - 1
  + } else {
  + // TODO handle range overlap cases
  + return
  + }
  +
  + return StructureElement.Loci(structure, [{
  + unit: ref.unit,
  + indices: OrderedSet.ofRange(min as StructureElement.UnitIndex, max as StructureElement.UnitIndex)
  + }]);
  +}
  \ No newline at end of file
  