> On May 9, 2016, at 9:48 PM, Joe Groff via swift-evolution > <[email protected]> wrote: > >> >> On May 9, 2016, at 6:23 PM, Brent Royal-Gordon via swift-evolution >> <[email protected]> wrote: >> >>> * Operations that depend on sorted-ness and use binary predicates should >>> not be available on all Collections; they're too easy to misuse, >>> they're hard to name well, and as Nicola Salmoria has noted, they >>> would not make any sense at all for a Set<T>. >>> >>> * They should be scoped to a kind of collection that bundles >>> the predicate with the elements, e.g. >>> >>> let x = Sorted([3, 4, 1, 5, 2], >) // stores a sorted copy of the >>> array >>> let y = Sorted(preSorted: 0..<100, <) // stores a copy of the range >>> >>> Maybe there should also be protocols for this; CountableRange<T> would >>> already already conform to the immutable version. We might want a >>> mutable form of the protocol for sorted collections with >>> insertion/removal methods. This whole area needs more design. >> >> I agree with both of these statements, but not with your conclusion. >> >> There are three classes of collections: >> >> 1) Those which are always sorted, like a SortedSet. >> 2) Those which may or may not be sorted, like an Array. >> 3) Those which are never sorted, like a Set. >> >> These APIs are useless on a #3, but #2 is still a valuable use case to >> support. In particular, it's quite common to use sorted `Array`s, and these >> APIs would help you do that. >> >> What I might consider doing is tying this to `RangeReplaceableCollection`. >> That protocol is applied only to types which allow insertion at arbitrary >> indices, which is a good, though not perfect, proxy for types which might >> allow you to manually maintain a sort order. `Array`, `ArraySlice`, >> `ContiguousArray`, and the mutable `String` views would get these methods, >> while `Set` and `Dictionary` would not. > > We could also introduce a new OrderedCollection protocol. (This would also be > useful in the future for supporting `case` pattern matching on collections. > It makes sense to pattern-match arrays and other ordered collections in order > by element, but you'd expect very different semantics pattern-matching an > unordered Set.) >
> -Joe Yet another alternative would be to drop Set and Dictionary down a level to a FiniteSequence protocol in between Sequence and Collection. Basically none of the index-based collection APIs (i.e. everything except `count` and `isEmpty`) make sense on sets and dictionaries. index(where:) was marginally useful with dictionaries, but now that Sequence is getting first(where:), née find(...), even that isn't necessary. Nate
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
