[Issue] Collection.distance() works not very well in some situations The question is that, whether the original Collection Protocol requires index from lower to higher (startIndex < endIndex).
If the original Collection Protocol requires index from lower to higher, than this infinity loop should not happen: > class MyCollectionA : Collection { > > var startIndex: Int { > return 1 > } > > var endIndex: Int { > return 100 > } > > func index(after i: Int) -> Int { > return i + 2 > } > > subscript(position: Int) -> Void { > return () > } > } > > > let a = MyCollectionA() > a.distance(from: 0, to: 100) // 50 > a.distance(from: 1, to: 100) // !! Infinity Loop > a.count // !! Infinity Loop if we assume the index is from lower to higher, the implementation of the distance(from:to:) should use "<" with "while" to count distance > > > > var start = start > var count: IndexDistance = 0 > while start < end { // instead of using != > count = count + 1 > formIndex(after: &start) > } > return count > } If the original Collection Protocol not requires index from to higher, than the code below should works, but unfortunately, the code in Collection.distance does not allow. > class MyCollectionB : Collection { > > var startIndex: Int { > return 100 > } > > var endIndex: Int { > return 0 > } > > func index(after i: Int) -> Int { > return i - 2 > } > > // start, end, index(after i: Int) -> indices: DefaultIndices > > subscript(position: Int) -> Void { > return () > } > } > > let b = MyCollectionB() > b.count // !! Fetal Error: Only BidirectionalCollections can have end come > before start
_______________________________________________ swift-corelibs-dev mailing list swift-corelibs-dev@swift.org https://lists.swift.org/mailman/listinfo/swift-corelibs-dev