62 lines
1.4 KiB
Swift
62 lines
1.4 KiB
Swift
//
|
|
// 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)
|
|
}
|