Simple Reeducks 🦆🦆
An unceremonious, minimalist, and idiomatic Redux port
Reeducks 🦆🦆 is stupidly simple: It uses 3 things – Functions, Closures, and Queues.
It’s also classless ☭☭☭
Trivial Example
Run ./demo.sh: contains the following code
struct State {
var counter: Int }
enum Action {
case up(_ value: Int) // Inc by <value>
case down(_ value: Int) // Dec by <value>
// Inc by 10 after 1 sec :: Async ThunkAction
static let asyncUp: ThunkAction<State> = { _, dispatch in
DispatchQueue.global().asyncAfter(deadline: .now() + 1) { dispatch(Action.up(10)) }}
// Dec by 10 after 1 sec :: Async ThunkAction
static let asyncDown: ThunkAction<State> = { _, dispatch in
DispatchQueue.global().asyncAfter(deadline: .now() + 1) { dispatch(Action.down(10)) }}}
let reducer: Reducer<State> = { _state, action in
var state = _state
switch (action as? Action) {
case let .up(value)?:
state.counter += value
case let .down(value)?:
state.counter -= value
default: () }
return state }
let store = NewStore(
initial: State(counter: 0),
reducer: reducer,
middleware: ApplyMiddlewares(LoggerMiddleware, ThunkMiddleware))
_ = store.subscribe(.main) { state in
print("New State : \(state)")}
Why not ReSwift?
-
Complexity & Ceremony: Redux is stupidly simple, ReSwift adds unnecessary ceremony, with protocols and open classes.
-
Concurrency: ReSwift Raises a
FatalErrorfor concurrent modification. This should never happen whenGrand Central Dispatchexists.
Honest Opinion: Should you use Redux with Swift Apps?
Answer: Maybe?
I wrote about 10,000 lines of iOS / MacOS code with
Reeducks 🦆🦆, and although Unidirectional
Dataflow is very neat, it takes quite a bit of ceremony and
discipline to keep the Views and
ViewControllers stateless, especially with
TableViews that uses
NSFetchedResultsController.
Honestly I’d say its probably not worth it until the more declarative SwiftUI becomes the thing, and I will give Reeducks 🦆🦆 another shot.
Swift’s pattern match syntax also quite verbose compared
to say F#, which has its own Unidirectional
framework, and can be used to build both iOS and MacOS apps.