apple / swift-algorithms

Commonly used sequence and collection algorithms for Swift
Apache License 2.0
5.9k stars 435 forks source link

`uniqued(on:)` is missing a `uniquingWith` overload. #188

Open JessyCatterwaul opened 2 years ago

JessyCatterwaul commented 2 years ago

With dictionaries, we have a uniquingKeysWith parameter. It would be helpful to have similar for uniqued.

This came up in a Stack Overflow Q/A. The following works but relies on arrays—we should have something better in Algorithms.

import struct OrderedCollections.OrderedDictionary

public extension Sequence {
  @inlinable func uniqued<Subject: Hashable>(
    on projection: (Element) throws -> Subject,
    uniquingWith combine: (Element, Element) throws -> Element
  ) rethrows -> [Element] {
    try OrderedDictionary(keyed(by: projection), uniquingKeysWith: combine)
      .values
      .elements
  }
}
public extension Sequence {
  @inlinable func keyed<Key: Hashable>(
    by key: (Element) throws -> Key
  ) rethrows -> [KeyValuePairs<Key, Element>.Element] {
    try map { (try key($0), $0) }
  }
}