Created
June 14, 2017 16:44
-
-
Save davedelong/54f9bf7cc44524ee0b0cd0d49146a342 to your computer and use it in GitHub Desktop.
Grouping collections
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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