Last active
November 2, 2016 11:50
-
-
Save odrobnik/61c58a4bda53c463ccfb12421295c28f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
// value types which are convertible to and from a Double raw value | |
protocol RawValueConvertible | |
{ | |
init(_ rawValue: Double) | |
var rawValue: Double { get set } | |
} | |
func enumerateRawValues<T: RawValueConvertible>(from: T, to: T, unitDivisor: T, block: (_ value: T)->()) | |
{ | |
let start = from.rawValue | |
let divisor = abs(unitDivisor.rawValue) | |
let actualStart = divisor * ceil(start / divisor) | |
var value = T(actualStart) | |
repeat | |
{ | |
block(value) | |
value = T(value.rawValue + divisor) | |
} | |
while value < to | |
} | |
func round<T: RawValueConvertible>(_ value: T) -> T | |
{ | |
let newValue = round(value.rawValue) | |
return T(newValue) | |
} | |
// MARK: - Equatable | |
func == <T: RawValueConvertible>(left: T, right: T) -> Bool | |
{ | |
let leftVal = round(left.rawValue*10.0) | |
let rightVal = round(right.rawValue*10.0) | |
return leftVal == rightVal | |
} | |
// MARK: - Comparable | |
func < <T: RawValueConvertible>(left: T, right: T) -> Bool | |
{ | |
let leftVal = round(left.rawValue*10.0) | |
let rightVal = round(right.rawValue*10.0) | |
return leftVal < rightVal | |
} | |
func <= <T: RawValueConvertible>(left: T, right: T) -> Bool | |
{ | |
let leftVal = round(left.rawValue*10.0) | |
let rightVal = round(right.rawValue*10.0) | |
return leftVal <= rightVal | |
} | |
func > <T: RawValueConvertible>(left: T, right: T) -> Bool | |
{ | |
let leftVal = round(left.rawValue*10.0) | |
let rightVal = round(right.rawValue*10.0) | |
return leftVal > rightVal | |
} | |
func >= <T: RawValueConvertible>(left: T, right: T) -> Bool | |
{ | |
let leftVal = round(left.rawValue*10.0) | |
let rightVal = round(right.rawValue*10.0) | |
return leftVal >= rightVal | |
} | |
func min<T: RawValueConvertible>(_ left: T, _ right: T) -> T | |
{ | |
let value = min(left.rawValue, right.rawValue) | |
return T(value) | |
} | |
func max<T: RawValueConvertible>(_ left: T, _ right: T) -> T | |
{ | |
let value = max(left.rawValue, right.rawValue) | |
return T(value) | |
} | |
func -= <T: RawValueConvertible>(lhs: inout T, rhs: T) | |
{ | |
let newValue = lhs.rawValue - rhs.rawValue | |
lhs = T(newValue) | |
} | |
func += <T: RawValueConvertible>(lhs: inout T, rhs: T) | |
{ | |
let newValue = lhs.rawValue + rhs.rawValue | |
lhs = T(newValue) | |
} | |
func - <T: RawValueConvertible>(lhs: T, rhs: T) -> T | |
{ | |
let newValue = lhs.rawValue - rhs.rawValue | |
return T(newValue) | |
} | |
func / <T: RawValueConvertible>(lhs: T, rhs: T) -> Int | |
{ | |
return Int(round(lhs.rawValue / rhs.rawValue)) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment