         || (!self.isEmpty && other.contains(lowerBound))
   }
   
+  /// Returns `true` iff `self.contains(x)` is `false` for all values of `x`.
   public var isEmpty: Bool {
+    // Note: this default implementation is not suitable for a range
+    // that has an open lower bound.
     return !self.contains(self.lowerBound)
   }
   
+  /// Returns `self` clamped to `limits`.
+  ///
+  /// The bounds of the result, even if it is empty, are always
+  /// limited to the bounds of `limits`.
   @inline(__always)
   public func clamped(to limits: Self) -> Self {
     return Self(

}

extension RangeProtocol {

  @inline(__always)
  public init(_ other: Self) {
    self = other
  }
  
  @inline(__always)
  public func overlaps<
    Other: RangeProtocol where Other.Bound == Bound

  }
}

/// Ranges whose `Bound` is `Strideable` with `Integer` `Stride`
/// have all the capabilities of `RandomAccessCollection`s, where
/// elements of the collection are the values contained in the range.
extension HalfOpenRangeProtocol
  where Bound : _Strideable, Bound.Stride : Integer {
  // WORKAROUND rdar://25214598 - should be Bound : Strideable

  /// The number of values contained in the range. 
  public var count: Bound.Stride {
    return lowerBound.distance(to: upperBound)
  }
