selection method

(int, int)? selection(
  1. int anchor,
  2. int focus, {
  3. int? previousFocus,
})

Implementation

(int, int)? selection(int anchor, int focus, {int? previousFocus}) {
  if (excludedBlockIds.isEmpty) return (anchor, focus);
  final spans = ranges;
  if (spans.isEmpty) return null;
  if (anchor == focus) {
    if (contains(focus)) return (focus, focus);
    final forward = previousFocus != null && focus > previousFocus;
    final chosen = forward
        ? spans.where((r) => r.$1 > focus).firstOrNull?.$1 ?? spans.last.$2
        : spans.where((r) => r.$2 < focus).lastOrNull?.$2 ?? spans.first.$1;
    return (chosen, chosen);
  }
  final span =
      spans.where((r) => anchor >= r.$1 && anchor <= r.$2).firstOrNull ??
      spans
          .where(
            (r) =>
                previousFocus != null &&
                previousFocus >= r.$1 &&
                previousFocus <= r.$2,
          )
          .firstOrNull ??
      spans.first;
  return (anchor.clamp(span.$1, span.$2), focus.clamp(span.$1, span.$2));
}