Skip to content

Instantly share code, notes, and snippets.

@oisdk
Last active September 12, 2015 23:47
Show Gist options
  • Save oisdk/d31ad6a8624e44620608 to your computer and use it in GitHub Desktop.
Save oisdk/d31ad6a8624e44620608 to your computer and use it in GitHub Desktop.
public struct HalfOpenStartInterval<Bound : Comparable> : IntervalType, Equatable, CustomStringConvertible, CustomDebugStringConvertible {
public init(_ start: Bound, _ end: Bound) { (self.start, self.end) = (start, end) }
public let start, end: Bound
public var description: String {
return String(reflecting: start) + ">.." + String(reflecting: end)
}
public var debugDescription: String { return description }
@warn_unused_result
public func contains(x: Bound) -> Bool { return x > start && x <= end }
@warn_unused_result
public func clamp(intervalToClamp: HalfOpenStartInterval<Bound>) -> HalfOpenStartInterval<Bound> {
switch (intervalToClamp.start >= start, intervalToClamp.end <= end) {
case (true, true) : return intervalToClamp
case (false, false): return self
case (true, false) : return HalfOpenStartInterval(min(intervalToClamp.start, end), end)
case (false, true) : return HalfOpenStartInterval(start, max(intervalToClamp.end, start))
}
}
public var isEmpty: Bool { return start == end }
}
public func ==<B : Comparable>(lhs: HalfOpenStartInterval<B>, rhs: HalfOpenStartInterval<B>) -> Bool {
return lhs.start == rhs.start && lhs.end == rhs.end
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment