bap-poc-phase-4/Sources/PMCalc/ViewModel.swift

73 lines
1.8 KiB
Swift

import Adwaita
import CMath
struct ViewModel {
private var numberBuffer: String = ""
private var number1: Double? = nil
private var number2: Double? = nil
private var op: Operator? = nil
@State
private(set) var display: String = ""
mutating func clear() {
numberBuffer = ""
number1 = nil
number2 = nil
op = nil
display = ""
}
mutating func addComma() {
guard !numberBuffer.isEmpty else { return }
numberBuffer.append(",")
display = numberBuffer
}
mutating func addNumber(_ number: UInt8) {
if numberBuffer.isEmpty { display = "" } // Reset display after new number is added to cleared buffer
numberBuffer.append(String(number))
display = numberBuffer
}
mutating func operation(_ op: Operator) {
guard !numberBuffer.isEmpty && number1 == nil else { return }
self.op = op
if number1 == nil { number1 = Double(numberBuffer) }
else { number2 = Double(numberBuffer) }
numberBuffer = ""
if op == .sqrt {
display = String(sqrt(number1!))
number1 = nil
self.op = nil
}
}
mutating func calculate() {
number2 = Double(numberBuffer)
numberBuffer = ""
var result: Double = 0.0
switch op {
case .add:
result = add_nums(number1!, number2!)
case .sub:
result = sub_nums(number1!, number2!)
case .mul:
result = mul_nums(number1!, number2!)
case .div:
result = div_nums(number1!, number2!)
case .pow:
result = pow(number1!, number2!)
case .sqrt, .none:
// do nothing
print("Attempting to apply Square Root to nothing!")
}
display = String(result)
}
}