   /// A textual representation of `self`, suitable for debugging.
   public var debugDescription: String {
     return "RangeOfStrideable(\(String(reflecting: lowerBound))..<\(String(reflecting: upperBound)))"
+  }
+
+  public // ambiguity resolution between _RangeProtocol and Collection defaults
+  var isEmpty: Bool {
+    return lowerBound == upperBound
   }
 }
 

  /// The range's lower bound.
  ///
  /// Identical to `upperBound` in an empty range.
  public var lowerBound: Bound

  /// The range's upper bound.
  ///
  /// `upperBound` is not a valid argument to `subscript`, and is always
  /// reachable from `lowerBound` by zero or more applications of
  /// `successor()`.
  public var upperBound: Bound
  
  public var startIndex: Index {
    return lowerBound

  /// Construct a range with `lowerBound == start` and `upperBound ==
  /// end`.
  @inline(__always)
  public init(_uncheckedBounds bounds: (lower: Bound, upper: Bound)) {
    self.lowerBound = bounds.lower
    self.upperBound = bounds.upper
  }

  /// The range's lower bound.
  ///
  /// Identical to `upperBound` in an empty range.
  // FIXME: swift-3-indexing-model: rename to `start`.
  public let lowerBound: Bound

  /// The range's upper bound.
  ///
