Skip to content

Commit 557241e

Browse files
toadzkytimshadel
authored andcommitted
Adds support for registering middleware after construction and removing that middleware
1 parent dea0af4 commit 557241e

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

Reactor.xcodeproj/project.pbxproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
OBJ_15 /* Reactor.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Reactor.framework; sourceTree = BUILT_PRODUCTS_DIR; };
2929
OBJ_16 /* ReactorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; path = ReactorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3030
OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
31-
OBJ_9 /* Reactor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Reactor.swift; sourceTree = "<group>"; };
31+
OBJ_9 /* Reactor.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = Reactor.swift; sourceTree = "<group>"; tabWidth = 4; };
3232
/* End PBXFileReference section */
3333

3434
/* Begin PBXFrameworksBuildPhase section */

Sources/Reactor.swift

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ extension Middleware {
4141
}
4242

4343
public struct Middlewares<StateType: State> {
44+
let id: UInt64
4445
private(set) var middleware: AnyMiddleware
4546
}
4647

@@ -80,16 +81,33 @@ public struct Subscription<StateType: State> {
8081
}
8182
}
8283

84+
extension String {
85+
static func random(length: Int = 20) -> String {
86+
let base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
87+
return String((0..<length).map{ _ in base.randomElement()! })
88+
}
89+
}
90+
91+
class Counter {
92+
private var queue = DispatchQueue(label: String.random())
93+
private (set) var value: UInt64 = 0
8394

95+
func increment() -> UInt64 {
96+
queue.sync {
97+
value += 1
98+
return value
99+
}
100+
}
101+
}
84102

85103
// MARK: - Core
86104

87105
public class Core<StateType: State> {
88106

89107
private let jobQueue: DispatchQueue
90108
private var subscriptions = [Subscription<StateType>]()
91-
92-
private let middlewares: [Middlewares<StateType>]
109+
private var middlewareCounter = Counter()
110+
private var middlewares: [Middlewares<StateType>]
93111

94112
public private (set) var state: StateType {
95113
didSet {
@@ -101,7 +119,11 @@ public class Core<StateType: State> {
101119

102120
public init(state: StateType, middlewares: [AnyMiddleware] = []) {
103121
self.state = state
104-
self.middlewares = middlewares.map(Middlewares.init)
122+
var tempMiddlewares = [Middlewares<StateType>]()
123+
for m in middlewares {
124+
tempMiddlewares.append(Middlewares(id: middlewareCounter.increment(), middleware: m))
125+
}
126+
self.middlewares = tempMiddlewares
105127
let qos: DispatchQoS
106128
if #available(macOS 10.10, *) {
107129
qos = .userInitiated
@@ -145,5 +167,19 @@ public class Core<StateType: State> {
145167
command.execute(state: self.state, core: self)
146168
}
147169
}
170+
171+
public func observe(with middleware: AnyMiddleware) -> () -> () {
172+
let wrapper = Middlewares<StateType>(id: middlewareCounter.increment(), middleware: middleware)
173+
jobQueue.async {
174+
self.middlewares.append(wrapper)
175+
}
176+
return {
177+
self.jobQueue.sync {
178+
if let index = self.middlewares.firstIndex(where: { $0.id == wrapper.id }) {
179+
self.middlewares.remove(at: index)
180+
}
181+
}
182+
}
183+
}
148184

149185
}

0 commit comments

Comments
 (0)