[swift-evolution] Custom equality/hash for Sets

Dmitri Gribenko gribozavr at gmail.com
Fri Feb 19 04:14:21 CST 2016


On Fri, Feb 19, 2016 at 2:06 AM, Andrew Bennett via swift-evolution
<swift-evolution at swift.org> wrote:
> Wrapper Solution?
>
> I've had a go at a wrapper solution before and it seems to either need a
> unique type per sort, or a block stored per element (unstable).
>
> Similar overheads were discussed when an index needs to store a reference to
> the parent. There's some work to fix it that makes indices moveable, so
> instead of going index.successor() you use collection.next(index).
>
> https://github.com/apple/swift/blob/master/test/Prototypes/CollectionsMoveIndices.swift
>
> Potential solution:
>
> The collection interfaces could change like this:
>
> - struct Set<Element: Hashable> {
> - struct Set<Element> {
>     ...
> -   public init() { ... }
> +   public init<H: Hashable>(elementHasher: Element -> H) {
>       ...
>     }

How do you compare such sets?  That is, what does s1 == s2 mean, if
the two sets are constructed with a hashing closure?  We can't even
compare closures to find that they are the same.

Also, how would this affect algorithms on sets?  When handling a set,
you essentially wouldn't know the rules according to which it
operates, unless we expose this mapping function.

Dmitri

-- 
main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if
(j){printf("%d\n",i);}}} /*Dmitri Gribenko <gribozavr at gmail.com>*/


More information about the swift-evolution mailing list