anchor.diff:    int get nameStartOffset => _data.nameStartOffset;
     int get nameEndOffset => _data.nameEndOffset;
   
  -  bool overlapsOffset(int offset) => _offsetRange.includes(offset);
  -  bool overlapsOffsetRange(OffsetRange range) => _offsetRange.overlaps(range);
  +  OffsetRange get offsetRange => _offsetRange;
   
     html.LIElement get element => _element;
     html.AnchorElement get anchor => _anchor;
  
positive.code:   bool centeredLower(OffsetRange another) => bottom > another.bottom;
  
    bool includes(int offset) => offset >= top && offset <= bottom;
    bool overlaps(OffsetRange another) =>
        !(bottom < another.top || top > another.bottom);
  
    String toString() => "($top, $bottom)";
  
negative.code:     Iterable<OutlineItem> searchSequence =
          atBottom ? _outlineItems.reversed : _outlineItems;
      for (OutlineItem item in searchSequence) {
        // Unlike [_itemAtCodeOffset], this function is called when the user
        // scrolls the cursor with the mouse or moves it with the arrow keys.
        // In that case, there is always a prior position with a prior item
        // already selected in the outline. So not finding anything and doing
        // nothing is fine.
        if (item.offsetRange.intersects(codeOffsetRange)) return item;
      }
      return null;
    }
  