Skip to content

Instantly share code, notes, and snippets.

@davedelong
Created June 14, 2017 16:44
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save davedelong/54f9bf7cc44524ee0b0cd0d49146a342 to your computer and use it in GitHub Desktop.
Save davedelong/54f9bf7cc44524ee0b0cd0d49146a342 to your computer and use it in GitHub Desktop.
Grouping collections
public extension Collection {
func keyedBy<T>(_ keyer: (Iterator.Element) -> T?) -> Dictionary<T, Iterator.Element> {
var d = Dictionary<T, Iterator.Element>()
for item in self {
if let key = keyer(item) {
d[key] = item
}
}
return d
}
func keyedBy<T>(_ keyer: (Iterator.Element) -> Array<T>) -> Dictionary<T, Iterator.Element> {
var d = Dictionary<T, Iterator.Element>()
for item in self {
let keys = keyer(item)
for key in keys {
d[key] = item
}
}
return d
}
func groupedBy<T>(_ keyer: (Iterator.Element) -> T?) -> Dictionary<T, Array<Iterator.Element>> {
var d = Dictionary<T, Array<Iterator.Element>>()
for item in self {
if let key = keyer(item) {
var items = d[key] ?? []
items.append(item)
d[key] = items
}
}
return d
}
func intersperse(_ separator: Iterator.Element) -> Array<Iterator.Element> {
return intersperse { separator }
}
func intersperse(_ item: () -> Iterator.Element) -> Array<Iterator.Element> {
var everything = Array<Iterator.Element>()
for element in self {
everything.append(element)
everything.append(item())
}
everything.removeLast()
return everything
}
func divide(_ isInFirst: (Iterator.Element) -> Bool) -> (Array<Iterator.Element>, Array<Iterator.Element>) {
var first = Array<Iterator.Element>()
var second = Array<Iterator.Element>()
for item in self {
if isInFirst(item) {
first.append(item)
} else {
second.append(item)
}
}
return (first, second)
}
}
public extension Collection where Iterator.Element: Hashable {
func unique() -> Array<Iterator.Element> {
var uniqued = Array<Iterator.Element>()
var soFar = Set<Iterator.Element>()
for item in self {
if soFar.contains(item) == false {
uniqued.append(item)
soFar.insert(item)
}
}
return uniqued
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment