Skip to content

Commit

Permalink
Merge pull request ReactiveX#1075 from radex/rx-examples-calculator
Browse files Browse the repository at this point in the history
[RxExamples] Clean up the Calculator example
  • Loading branch information
kzaher authored Jan 20, 2017
2 parents 12e0ec1 + 7487e71 commit 0de7e7e
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 69 deletions.
51 changes: 11 additions & 40 deletions RxExample/RxExample/Examples/Calculator/CalculatorState.swift
Original file line number Diff line number Diff line change
Expand Up @@ -54,57 +54,28 @@ extension CalculatorState {

if previousNumber == nil {
return CalculatorState(previousNumber: currentNumber, action: .operation(o), currentNumber: nil, inScreen: currentNumber, replace: true)
}
else {
} else {
let previous = Double(previousNumber)!
let current = Double(inScreen)!

switch action {
case .operation(let op):
switch op {
case .addition:
let result = "\(previous + current)"
return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true)
case .subtraction:
let result = "\(previous - current)"
return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true)
case .multiplication:
let result = "\(previous * current)"
return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true)
case .division:
let result = "\(previous / current)"
return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true)
}
default:
if case let .operation(op) = action {
let result = "\(op.perform(previous, current))"
return CalculatorState(previousNumber: result, action: .operation(o), currentNumber: nil, inScreen: result, replace: true)
} else {
return CalculatorState(previousNumber: nil, action: .operation(o), currentNumber: currentNumber, inScreen: inScreen, replace: true)
}

}

}

func performEqual() -> CalculatorState {
let previous = Double(previousNumber ?? "0")
let previous = Double(previousNumber ?? "0")!
let current = Double(inScreen)!

switch action {
case .operation(let op):
switch op {
case .addition:
let result = "\(previous! + current)"
return CalculatorState(previousNumber: nil, action: .clear, currentNumber: result, inScreen: result, replace: true)
case .subtraction:
let result = "\(previous! - current)"
return CalculatorState(previousNumber: nil, action: .clear, currentNumber: result, inScreen: result, replace: true)
case .multiplication:
let result = "\(previous! * current)"
return CalculatorState(previousNumber: nil, action: .clear, currentNumber: result, inScreen: result, replace: true)
case .division:
let result = previous! / current
let resultText = result == Double.infinity ? "0" : "\(result)"
return CalculatorState(previousNumber: nil, action: .clear, currentNumber: resultText, inScreen: resultText, replace: true)
}
default:
if case let .operation(op) = action {
let result = op.perform(previous, current)
let resultText = (result == Double.infinity) ? "0" : "\(result)"
return CalculatorState(previousNumber: nil, action: .clear, currentNumber: resultText, inScreen: resultText, replace: true)
} else {
return CalculatorState(previousNumber: nil, action: .clear, currentNumber: currentNumber, inScreen: inScreen, replace: true)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import RxSwift
import RxCocoa
#endif


class CalculatorViewController: ViewController {

@IBOutlet weak var lastSignLabel: UILabel!
Expand Down Expand Up @@ -71,42 +70,27 @@ class CalculatorViewController: ViewController {

Observable.from(commands)
.merge()
.scan(CalculatorState.CLEAR_STATE) { a, x in
return a.tranformState(x)
.scan(CalculatorState.CLEAR_STATE) { previous, action in
previous.tranformState(action)
}
.debug("debugging")
.debug("calculator state")
.subscribe(onNext: { [weak self] calState in
self?.resultLabel.text = calState.inScreen
switch calState.action {
case .operation(let operation):
switch operation {
case .addition:
self?.lastSignLabel.text = "+"
case .subtraction:
self?.lastSignLabel.text = "-"
case .multiplication:
self?.lastSignLabel.text = "x"
case .division:
self?.lastSignLabel.text = "/"
}
default:
self?.resultLabel.text = self?.formatResult(calState.inScreen)

if case let .operation(operation) = calState.action {
self?.lastSignLabel.text = operation.sign
} else {
self?.lastSignLabel.text = ""
}
})
.addDisposableTo(disposeBag)
}

//swifts string api sucks

func prettyFormat(str: String) -> String {
if str.hasSuffix(".0") {
// return str[str.startIndex..<str.endIndex.pre]
func formatResult(_ result: String) -> String {
if result.hasSuffix(".0") {
return result.substring(to: result.index(result.endIndex, offsetBy: -2))
} else {
return result
}
return str
}
}





20 changes: 20 additions & 0 deletions RxExample/RxExample/Examples/Calculator/Operation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,23 @@ enum Operator {
case multiplication
case division
}

extension Operator {
var sign: String {
switch self {
case .addition: return "+"
case .subtraction: return "-"
case .multiplication: return "×"
case .division: return "/"
}
}

var perform: (Double, Double) -> Double {
switch self {
case .addition: return (+)
case .subtraction: return (-)
case .multiplication: return (*)
case .division: return (/)
}
}
}

0 comments on commit 0de7e7e

Please sign in to comment.