 
 //===----------------------------------------------------------------------===//
 //===--- RandomAccessIndexType --------------------------------------------===//
-/// This protocol is an implementation detail of `RandomAccessIndexType`; do
-/// not use it directly.
-///
-/// Its requirements are inherited by `RandomAccessIndexType` and thus must
-/// be satisfied by types conforming to that protocol.
-public protocol _RandomAccessIndexType : BidirectionalIndexType, Strideable {
+
+/// An *index* that can be offset by an arbitrary number of positions,
+/// and can measure the distance to any reachable value, in O(1).
+public protocol RandomAccessIndexType : BidirectionalIndexType, Strideable {
   /// Return the minimum number of applications of `successor` or
   /// `predecessor` required to reach `other` from `self`.
   ///


/// Do not use this operator directly; call advance(start, n) instead.
@transparent
public func ~> <T : _RandomAccessIndexType>(
  start:T, rest:(_Advance, (T.Distance))
) -> T {
  let n = rest.1


/// Do not use this operator directly; call advance(start, n, end) instead.
@transparent
public func ~> <T : RandomAccessIndexType>(
  start:T, rest:(_Advance, (T.Distance, T))
) -> T {
  let n = rest.1.0
