   }
 }
 
+/// A type that represents a contiguous range of any comparable value,
+/// with non-empty ranges containing their lower bounds but not their
+/// upper bounds.
 public protocol HalfOpenRangeProtocol : RangeProtocol {}
 
 extension HalfOpenRangeProtocol {
+  /// Creates an instance equivalent to `other`.
   @inline(__always)
   public init<
     Other: HalfOpenRangeProtocol where Other.Bound == Bound

  }
}

public struct CountableRange<
  // WORKAROUND rdar://25214598 - should be just Bound : Strideable
  Bound : Comparable where Bound : _Strideable, Bound.Stride : Integer

  }
}

/// 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)
  }
