schwa/approximateequality
For numeric types this uses ``isApproximatelyEqual`` from [Swift Numerics](https://www.swift.org/blog/numerics/).
``ApproximateEquality`` protocol
For numeric types this uses `isApproximatelyEqual` from Swift Numerics.
``DeriveApproximateEquality`` macro.
Annotate your types with `DeriveApproximateEquality to automatically conform to ApproximateEquality` and derive an implementation.
`DeriveApproximateEquality` Example
import ApproximateEquality
import ApproximateEqualityMacros
import CoreGraphics
@DeriveApproximateEquality
public struct MyType {
var x: Double
var y: CGPoint
@ApproximateEqualityIgnored
var z: Double
var w: Float
}
let thing1 = MyType(x: 10, y: CGPoint(x: 20, y: 0), z: 30, w: 0)
let thing2 = MyType(x: 10, y: CGPoint(x: 20, y: 0), z: 40, w: 0)
let error = 0.000_001
let thing3 = MyType(x: 10 + error, y: CGPoint(x: 20, y: 0), z: 40, w: 0)
print(thing1.isApproximatelyEqual(to: thing2, absoluteTolerance: 0.0001)) // true
print(thing1.isApproximatelyEqual(to: thing3, absoluteTolerance: 0.0001)) // true
print(thing1.isApproximatelyEqual(to: thing3, absoluteTolerance: 0.000_000_1)) // falseExpanding the `@DeriveApproximateEquality` macro generates an extension:
extension MyType: ApproximateEquality {
public func isApproximatelyEqual(to other: Self, absoluteTolerance: Double.Magnitude) -> Bool {
x.isApproximatelyEqual(to: other.x, absoluteTolerance: Double.Magnitude(absoluteTolerance))
&& y.isApproximatelyEqual(to: other.y, absoluteTolerance: CGPoint.Magnitude(absoluteTolerance))
&& w.isApproximatelyEqual(to: other.w, absoluteTolerance: Float.Magnitude(absoluteTolerance))
}
}Note that the property prefixed with `@ApproximateEqualityIgnored` is used in the implementation.
License
MIT.
Portions of thise code are from the Apple-Numerics (<https://github.com/apple/swift-numerics>) project and are licensed under the Apache License
TODO
- [ ]: Test against more complex types.
- [X]: Pass through absolute tolerance, norm etc.
- [X]: Handle the casting to
Doublein `DeriveApproximateEquality`
Package Metadata
Repository: schwa/approximateequality
Default branch: main
README: README.md