Skip to content

Instantly share code, notes, and snippets.

@hisui
Created March 10, 2015 07:19
Show Gist options
  • Save hisui/f4aea3d1d6f5881eebd2 to your computer and use it in GitHub Desktop.
Save hisui/f4aea3d1d6f5881eebd2 to your computer and use it in GitHub Desktop.
Array#sortedGroupBy
struct Record {
let time: NSDate
let name: String
}
extension Array {
func sortedGroupBy(isOrderedBefore: (T, T) -> Bool) -> [[T]] {
let tmp = sorted(isOrderedBefore)
var out = [[T]]()
for (i, e) in enumerate(tmp) {
if i > 0 && !(
isOrderedBefore(tmp[i-1], e) ||
isOrderedBefore(e, tmp[i-1]))
{
out[out.count - 1].append(e)
}
else {
out.append([e])
}
}
return out
}
}
let records = [
Record(time: NSDate(timeIntervalSince1970: 1), name: "a"),
Record(time: NSDate(timeIntervalSince1970: 2), name: "b"),
Record(time: NSDate(timeIntervalSince1970: 1), name: "a"),
Record(time: NSDate(timeIntervalSince1970: 3), name: "d"),
Record(time: NSDate(timeIntervalSince1970: 3), name: "e"),
Record(time: NSDate(timeIntervalSince1970: 2), name: "f"),
]
func buildIndex(records: [Record]) -> [[[Record]]] {
return records
.sortedGroupBy { (a: Record, b: Record) in
a.time.compare(b.time) == .OrderedAscending
}
.map {
$0.sortedGroupBy { $0.name < $1.name }
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment