なんだこれ?
- struct A {
- var f: () -> Int
- }
- extension A: Equatable {
- static func == (l: A, r: A) -> Bool { l.f() == r.f() }
- }
- extension A: AdditiveArithmetic {
- static let zero = A { 0 }
- static func + (l: A, r: A) -> A { A { l.f() + r.f() } }
- static func += (l: inout A, r: A) {
- let n = l.f()
- l.f = { n + r.f() }
- }
- static func - (l: A, r: A) -> A { A { l.f() - r.f() } }
- static func -= (l: inout A, r: A) {
- let n = l.f()
- l.f = { n - r.f() }
- }
- }
- extension A: ExpressibleByIntegerLiteral {
- init(integerLiteral value: Int) { f = { value } }
- }
- extension A: Numeric {
- init?<T: BinaryInteger>(exactly source: T) {
- guard let g = Int(exactly: source).map({ s in { s } }) else { return nil }
- f = g
- }
- var magnitude: Int.Magnitude { f().magnitude }
- static func * (l: A, r: A) -> A { A { l.f() * r.f() } }
- static func *= (l: inout A, r: A) {
- let n = l.f()
- l.f = { n * r.f() }
- }
- }