// // AnyEquatable.swift // VDS // // Created by Matt Bruce on 9/15/22. // import Foundation public protocol AnyEquatable { func isEqual(_ equatable: Self) -> Bool } extension AnyEquatable { public func isEqual(_ anyEquatable: any AnyEquatable) -> Bool { guard let equatable = anyEquatable as? Self else { return false } return isEqual(equatable) } } func == (lhs: (any AnyEquatable)?, rhs: (any AnyEquatable)?) -> Bool { switch (lhs, rhs) { case (.some(let lhs), .some(let rhs)): return lhs.isEqual(rhs) case (.none, .none): return true default: return false } } func != (lhs: (any AnyEquatable)?, rhs: (any AnyEquatable)?) -> Bool { return !(lhs == rhs) } func == (lhs: [any AnyEquatable]?, rhs: [any AnyEquatable]?) -> Bool { switch (lhs, rhs) { case (.some(let lhs), .some(let rhs)): return lhs == rhs case (.none, .none): return true default: return false } } func != (lhs: [any AnyEquatable]?, rhs: [any AnyEquatable]?) -> Bool { return !(lhs == rhs) } func == (lhs: [any AnyEquatable], rhs: [any AnyEquatable]) -> Bool { return lhs.elementsEqual(rhs, by: { (lhsElement, rhsElement) -> Bool in return lhsElement == rhsElement }) } func != (lhs: [any AnyEquatable], rhs: [any AnyEquatable]) -> Bool { return !(lhs == rhs) }