Skip to content

Commit 1dfce28

Browse files
committed
feature: adds support for Quantity hyperoperation at level 0
1 parent bf4edd6 commit 1dfce28

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
public protocol Hyperoperable: Equatable, Operable {
2+
mutating func hyperoperateUpon(
3+
atLevel givenLevel: Self,
4+
by givenOperametrum: Self
5+
)
6+
}
7+
8+
extension Hyperoperable {
9+
public func hyperoperatedUpon(
10+
atLevel givenLevel: Self,
11+
by givenOperametrum: Self
12+
) -> Self {
13+
var operatum = self
14+
operatum.hyperoperateUpon(atLevel: givenLevel, by: givenOperametrum)
15+
return operatum
16+
}
17+
}

NumberSystems/Sources/NumberSystems/Quantity.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ extension Quantity: Equatable {
3434
}
3535
}
3636

37-
extension Quantity: Operable {
37+
extension Quantity: Hyperoperable {
3838
public mutating func succeed() {
3939
let newElement = self.embodiment.first ?? Quantity.standardEmbodyingElement
4040
self.embodiment.append(newElement)
@@ -45,6 +45,15 @@ extension Quantity: Operable {
4545

4646
self.embodiment.removeLast()
4747
}
48+
49+
public mutating func hyperoperateUpon(
50+
atLevel givenLevel: Quantity,
51+
by givenOperametrum: Quantity
52+
) {
53+
if (givenLevel == Quantity.none) { return self.succeed() }
54+
55+
fatalError("Higher-level operations not yet defined")
56+
}
4857
}
4958

5059
extension String {

NumberSystems/Tests/NumberSystemsTests/QuantityTests.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,19 @@ func predecessorOfQuantity(_ givenCount: Int) async throws {
7373
let precededQuantity = operativeQuantity.predecessor
7474
#expect(precededCount.represents(precededQuantity))
7575
}
76+
77+
@Test("Operatrum-agnostic characteristics of level 0 hyperoperation", arguments: [
78+
Quantity("" )!,
79+
Quantity("|" )!,
80+
Quantity("||")!
81+
])
82+
func hyperoperationAtLevel0(_ givenOperametrum: Quantity) async throws {
83+
let zero = 0.asQuantity
84+
let ten = 10.asQuantity
85+
86+
let eleven = ten.hyperoperatedUpon(atLevel: zero, by: givenOperametrum)
87+
let twelve = eleven.hyperoperatedUpon(atLevel: zero, by: givenOperametrum)
88+
89+
#expect(11.represents(eleven))
90+
#expect(12.represents(twelve))
91+
}

0 commit comments

Comments
 (0)