While researching in our archives for something else, I saw a post about getting both sub-sequences of a filter, something I've occasionally wondered about. I decided to try it, and use a Dictionary
return, and found out:
extension Sequence {
/// Categorizes the elements with the mappings from the given hash function,
/// keeping elements sharing a category in the same relative order in the
/// given type of value collections.
///
/// - Precondition: The sequence is finite.
///
/// - Parameter partitionType: A meta-type specifier for the collection
/// bundling elements sharing a category.
/// - Parameter hash: A hashing function, mapping an element to a category.
/// - Returns: A dictionary where each key is a result of `hash` from at
/// least one element and the corresponding value is all of the elements
/// that matched that key, still in their relative order from this
/// sequence.
///
/// - Complexity: ???
public func hashIntoPartitions<T: RangeReplaceableCollection, K: Hashable>(ofType partitionType: T.Type, along hash: (Element) throws -> K) rethrows -> [K: T] where T.Element == Element {
return try Dictionary(grouping: self, by: hash).mapValues { T($0) }
}
}
that we already added it! You don't need the method above if you don't care about customizing the Value
to be something besides Array
.