Skip to content

Instantly share code, notes, and snippets.

@oisdk
Created June 12, 2015 07:52
Show Gist options
  • Save oisdk/e07015401d4d3b228cbd to your computer and use it in GitHub Desktop.
Save oisdk/e07015401d4d3b228cbd to your computer and use it in GitHub Desktop.
extension CollectionType where Generator.Element: Comparable {
func searchWhenSorted(toFind: Generator.Element) -> Self.Index? {
return self.order.flatMap {
(order: ((Generator.Element, Generator.Element) -> Bool)) -> Index? in
for (index, element) in zip(self.indices, self) {
if element == toFind {
return index
} else if order(toFind, element) {
return nil
}
}
return nil
}
}
func searchWhenSorted(
toFind: Generator.Element,
isOrderedBefore: ((Generator.Element, Generator.Element) -> Bool)
) -> Index? {
for (index, element) in zip(self.indices, self) {
if element == toFind {
return index
} else if isOrderedBefore(toFind, element) {
return nil
}
}
return nil
}
}
extension SequenceType where Generator.Element: Comparable {
var order: ((Generator.Element, Generator.Element) -> Bool)? {
var g = self.generate()
var last = g.next()
for (var next = g.next();last != nil;last = next, next = g.next()) {
if next != last {
return next > last ?
{(a: Generator.Element, b: Generator.Element) -> Bool in a < b} :
{(a: Generator.Element, b: Generator.Element) -> Bool in a > b}
}
}
return nil
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment