Skip to content

Instantly share code, notes, and snippets.

@khanlou
Last active February 14, 2018 17:29
Show Gist options
  • Select an option

  • Save khanlou/c33e1f3135a40981836ae131833a2b55 to your computer and use it in GitHub Desktop.

Select an option

Save khanlou/c33e1f3135a40981836ae131833a2b55 to your computer and use it in GitHub Desktop.
extension Sequence {
func uniqueElements(by elementsEqual: (Element, Element) -> Bool) -> [Element] {
var result: [Element] = []
for element in self {
if !result.contains(where: { resultElement in elementsEqual(element, resultElement) }) {
result.append(element)
}
}
return result
}
func uniqueElements<T: Hashable>(byProperty propertyAccessor: (Element) -> T) -> [Element] {
var seen: Set<T> = []
var result: [Element] = []
for element in self {
let property = propertyAccessor(element)
if !seen.contains(property) {
result.append(element)
seen.insert(property)
}
}
return result
}
}
extension Sequence where Element: Equatable {
func uniqueElements() -> [Element] {
return uniqueElements(by: ==)
}
}
extension Sequence where Element: Hashable {
func uniqueElements() -> [Element] {
var seen: Set<Element> = []
var result: [Element] = []
for element in self {
if !seen.contains(element) {
result.append(element)
seen.insert(element)
}
}
return result
}
}
[1, 2, 1, 2, 3].uniqueElements()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment