Martin's excellent insight into the nature of the problem got me thinking if we could do any better than extension Range where Element : IntegerType
. Here is one possibility:
public extension Range where Element : Comparable {
@warn_unused_result
public func intersect(other: Range) -> Range {
guard endIndex > other.startIndex else {
return endIndex..<endIndex
}
guard other.endIndex > startIndex else {
return startIndex..<startIndex
}
let s = other.startIndex > startIndex ? other.startIndex : startIndex
let e = other.endIndex < endIndex ? other.endIndex : endIndex
return s..<e
}
}
This at least passes Martin's range of string test:
let r1 = "fπ©π°oo".rangeOfString("π©π°")! // 1..<5
let r2 = "baπ¨π°r".rangeOfString("π¨π°")! // 2..<6
let r = r1.intersect(r2) // 2..<5
Milos
- 639
- 5
- 18
default