diff --git a/NumberSystems/Sources/NumberSystems/Positional/Models/DecimalNumber.swift b/NumberSystems/Sources/NumberSystems/Positional/Models/DecimalNumber.swift new file mode 100644 index 0000000..aeffee3 --- /dev/null +++ b/NumberSystems/Sources/NumberSystems/Positional/Models/DecimalNumber.swift @@ -0,0 +1,27 @@ +public struct DecimalNumber: PositionalNumberSystemizable { + public enum Digit: Int { + case zero + case one, two , three, four, five + case six, seven, eight, nine, ten + } +} + +extension DecimalNumber.Digit: PositionalDigitSystemizable { + public static var placeholder: Self { .zero } + + public var predecessor: Self { + switch self { + case .ten : return .nine + case .nine : return .eight + case .eight: return .seven + case .seven: return .six + case .six : return .five + case .five : return .four + case .four : return .three + case .three: return .two + case .two : return .one + case .one : return .placeholder + default : Self.fatalPredecessionError() + } + } +} diff --git a/NumberSystems/Sources/NumberSystems/Positional/Protocols/PositionalDigitSystemizable.swift b/NumberSystems/Sources/NumberSystems/Positional/Protocols/PositionalDigitSystemizable.swift new file mode 100644 index 0000000..cb0f8a2 --- /dev/null +++ b/NumberSystems/Sources/NumberSystems/Positional/Protocols/PositionalDigitSystemizable.swift @@ -0,0 +1,28 @@ +public protocol PositionalDigitSystemizable: CaseIterable, RawRepresentable { + static var placeholder: Self { get } + + var predecessor: Self { get } +} + +extension PositionalDigitSystemizable { + public static func fatalPredecessionError() -> Never { + fatalError("Digit has no defined precedent") + } + + public var quantity: Quantity { + if self == Self.placeholder { return Quantity.none } + + let precedingQuantity = self.predecessor.quantity + return precedingQuantity.successor + } +} + +extension PositionalDigitSystemizable { + public var cardinality: Int { + self.rawValue + } + + public var quantityMatchesCardinality: Bool { + self.cardinality.represents(self.quantity) + } +} diff --git a/NumberSystems/Sources/NumberSystems/Positional/Protocols/PositionalNumberSystemizable.swift b/NumberSystems/Sources/NumberSystems/Positional/Protocols/PositionalNumberSystemizable.swift new file mode 100644 index 0000000..ef35e1a --- /dev/null +++ b/NumberSystems/Sources/NumberSystems/Positional/Protocols/PositionalNumberSystemizable.swift @@ -0,0 +1,3 @@ +protocol PositionalNumberSystemizable { + associatedtype Digit: PositionalDigitSystemizable +} diff --git a/NumberSystems/Tests/NumberSystemsTests/DecimalNumberTests.swift b/NumberSystems/Tests/NumberSystemsTests/DecimalNumberTests.swift new file mode 100644 index 0000000..12b1c68 --- /dev/null +++ b/NumberSystems/Tests/NumberSystemsTests/DecimalNumberTests.swift @@ -0,0 +1,8 @@ +import Testing +@testable import NumberSystems + +@Test func quantitiesOfDecimalDigits() async throws { + DecimalNumber.Digit.allCases.forEach { + #expect($0.quantityMatchesCardinality) + } +}