Skip to content

Commit f3d659f

Browse files
committed
tests: adds stage for level 0 hyperoperation of quantity instance
1 parent 8896a5c commit f3d659f

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
@@ -62,3 +62,19 @@ func predecessorOfQuantity(_ givenCount: Int) async throws {
6262
let precededQuantity = operativeQuantity.predecessor
6363
#expect(precededCount.represents(precededQuantity))
6464
}
65+
66+
@Test("Operatrum-agnostic charateristics of level 0 hyperoperation", arguments: [
67+
Quantity("" )!,
68+
Quantity("|" )!,
69+
Quantity("||")!
70+
])
71+
func hyperoperationAtLevel0(_ givenOperametrum: Quantity) async throws {
72+
let zero = 0.asQuantity
73+
let ten = 10.asQuantity
74+
75+
let eleven = ten.hyperoperatedUpon(atLevel: zero, by: givenOperametrum)
76+
let twelve = eleven.hyperoperatedUpon(atLevel: zero, by: givenOperametrum)
77+
78+
#expect(11.represents(eleven))
79+
#expect(12.represents(twelve))
80+
}

0 commit comments

Comments
 (0)