@@ -41,6 +41,7 @@ extension Middleware {
41
41
}
42
42
43
43
public struct Middlewares < StateType: State > {
44
+ let id : UInt64
44
45
private( set) var middleware : AnyMiddleware
45
46
}
46
47
@@ -80,16 +81,33 @@ public struct Subscription<StateType: State> {
80
81
}
81
82
}
82
83
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
83
94
95
+ func increment( ) -> UInt64 {
96
+ queue. sync {
97
+ value += 1
98
+ return value
99
+ }
100
+ }
101
+ }
84
102
85
103
// MARK: - Core
86
104
87
105
public class Core < StateType: State > {
88
106
89
107
private let jobQueue : DispatchQueue
90
108
private var subscriptions = [ Subscription < StateType > ] ( )
91
-
92
- private let middlewares : [ Middlewares < StateType > ]
109
+ private var middlewareCounter = Counter ( )
110
+ private var middlewares : [ Middlewares < StateType > ]
93
111
94
112
public private ( set) var state : StateType {
95
113
didSet {
@@ -101,7 +119,11 @@ public class Core<StateType: State> {
101
119
102
120
public init ( state: StateType , middlewares: [ AnyMiddleware ] = [ ] ) {
103
121
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
105
127
let qos : DispatchQoS
106
128
if #available( macOS 10 . 10 , * ) {
107
129
qos = . userInitiated
@@ -145,5 +167,19 @@ public class Core<StateType: State> {
145
167
command. execute ( state: self . state, core: self )
146
168
}
147
169
}
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
+ }
148
184
149
185
}
0 commit comments