Coding Kata: FizzBuzz in Declarative Swift
1 min readMay 12, 2024
// MARK: - Properties
class Counter {
var value: Int = 0 { didSet { callbacks.forEach { $0(value) } } }
private var callbacks: [(Int) -> ()] = []
}
//MARK: - Command
extension Counter {
enum Command {
case increasing
case decreasing
case adding(Adding); enum Adding {
case callback((Int) -> ())
}
}
fileprivate func alter(by cmd:Command) {
switch cmd {
case .increasing : value += 1
case .decreasing : value -= 1
case let .adding(.callback(cb)): callbacks = callbacks + [cb]
}
}
}
func alter(_ counter:Counter, by change:Counter.Command) { counter.alter(by: change) }
let fizzBuzzCounter = Counter()
alter(fizzBuzzCounter, by: .adding(.callback{ if ($0 % 3 == 0) && ($0 % 15 != 0){ print("Fizz" ) } }))
alter(fizzBuzzCounter, by: .adding(.callback{ if ($0 % 5 == 0) && ($0 % 15 != 0){ print("Buzz" ) } }))
alter(fizzBuzzCounter, by: .adding(.callback{ if ($0 % 15 == 0) { print("FizzBuzz") } }))
alter(fizzBuzzCounter, by: .adding(.callback{ if ($0 % 3 != 0) && ($0 % 5 != 0){ print("\($0)" ) } }))
(0..<100).forEach { _ in
alter(fizzBuzzCounter, by: .increasing)
}
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
...