Skip to content

Instantly share code, notes, and snippets.

@khanlou
Last active November 25, 2019 17:55
Show Gist options
  • Save khanlou/104c5387ec966dd8e0b8416b591dc94f to your computer and use it in GitHub Desktop.
Save khanlou/104c5387ec966dd8e0b8416b591dc94f to your computer and use it in GitHub Desktop.
import Foundation
protocol OptionalType {
associatedtype Wrapped
var value: Wrapped? { get }
}
extension Optional: OptionalType {
var value: Wrapped? {
return self
}
}
enum NullOrdering {
case first, last
}
extension Sequence where Element: OptionalType {
func sorted(by isLessThan: (Element.Wrapped, Element.Wrapped) -> Bool, nulls nullOrdering: NullOrdering) -> [Element] {
return sorted(by: { (first, second) -> Bool in
guard let first = first.value else {
return nullOrdering == .first
}
guard let second = second.value else {
return nullOrdering == .last
}
return isLessThan(first, second)
})
}
}
extension Sequence where Element: OptionalType, Element.Wrapped: Comparable {
func sorted(nulls nullOrdering: NullOrdering) -> [Element] {
return self.sorted(by: <, nulls: nullOrdering)
}
}
var seq = AnySequence([2, nil, 1, 3, nil])
let a = seq.sorted(nulls: .last)
print(a)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment