 //===----------------------------------------------------------------------===//
 //===--- BidirectionalIndexType -------------------------------------------===//
 
-/// This protocol is an implementation detail of `BidirectionalIndexType`; do
-/// not use it directly.
-public protocol _BidirectionalIndexType : ForwardIndexType {
+
+/// An *index* that can step backwards via application of its
+/// `predecessor()` method.
+public protocol BidirectionalIndexType : ForwardIndexType {
   /// Return the previous consecutive value in a discrete sequence.
   ///
   /// If `self` has a well-defined successor,

/// Replace `i` with its `predecessor()` and return the original
/// value of `i`.
@transparent
public postfix func -- <T : _BidirectionalIndexType> (inout i: T) -> T {
  let ret = i
  i._predecessorInPlace()
  return ret


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