34 lines
979 B
Swift
34 lines
979 B
Swift
|
|
precedencegroup CompareAssignPrecedence {
|
|
assignment: true
|
|
associativity: left
|
|
higherThan: ComparisonPrecedence
|
|
}
|
|
|
|
infix operator <-? : CompareAssignPrecedence
|
|
infix operator <-/ : CompareAssignPrecedence
|
|
|
|
extension Equatable {
|
|
/// Assign a new value to `lhs` if `newValue` differs from the previous value. Return `false` if they are equal.
|
|
/// - Returns: `true` if `lhs` was overwritten with another value
|
|
static func <-?(lhs: inout Self, newValue: Self) -> Bool {
|
|
if lhs != newValue {
|
|
lhs = newValue
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
/// Assign a new value to `lhs` if `newValue` differs from the previous value.
|
|
/// Return tuple with both values. Or `nil` if they are equal.
|
|
/// - Returns: `nil` if `previousValue == newValue`
|
|
static func <-/(lhs: inout Self, newValue: Self) -> (previousValue: Self, newValue: Self)? {
|
|
let previousValue = lhs
|
|
if previousValue != newValue {
|
|
lhs = newValue
|
|
return (previousValue, newValue)
|
|
}
|
|
return nil
|
|
}
|
|
}
|