@@ -114,18 +114,15 @@ import ReactiveSwift
114114/// See also: ``ViewStore`` to understand how one observes changes to the state in a ``Store`` and
115115/// sends user actions.
116116public final class Store < State, Action> {
117- private( set) var state : State {
118- didSet {
119- statePipe. input. send ( value: state)
120- }
121- }
122- private let statePipe = Signal < State , Never > . pipe ( )
117+ @MutableProperty
118+ private( set) var state : State
123119 internal var producer : Effect < State , Never > {
124- Property < State > ( initial : self . state, then : self . statePipe . output . producer ) . producer
120+ self . $ state. producer
125121 }
126122
127123 private var isSending = false
128124 private let reducer : ( inout State , Action ) -> Effect < Action , Never >
125+ private var synchronousActionsToSend : [ Action ] = [ ]
129126 private var bufferedActions : [ Action ] = [ ]
130127 internal var effectDisposables : [ UUID : Disposable ] = [ : ]
131128 internal var parentDisposable : Disposable ?
@@ -373,41 +370,50 @@ public final class Store<State, Action> {
373370 }
374371
375372 func send( _ action: Action ) {
376- self . bufferedActions. append ( action)
377- guard !self . isSending else { return }
378-
379- self . isSending = true
380- var currentState = self . state
381- defer {
382- self . isSending = false
383- self . state = currentState
373+ if !self . isSending {
374+ self . synchronousActionsToSend. append ( action)
375+ } else {
376+ self . bufferedActions. append ( action)
377+ return
384378 }
385379
386- while !self . bufferedActions. isEmpty {
387- let action = self . bufferedActions. removeFirst ( )
388- let effect = self . reducer ( & currentState, action)
380+ while !self . synchronousActionsToSend. isEmpty || !self . bufferedActions. isEmpty {
381+ let action =
382+ !self . synchronousActionsToSend. isEmpty
383+ ? self . synchronousActionsToSend. removeFirst ( )
384+ : self . bufferedActions. removeFirst ( )
385+
386+ self . isSending = true
387+ let effect = self . reducer ( & self . state, action)
388+ self . isSending = false
389389
390390 var didComplete = false
391- let uuid = UUID ( )
391+ let effectID = UUID ( )
392392
393+ var isProcessingEffects = true
393394 let observer = Signal < Action , Never > . Observer (
394395 value: { [ weak self] action in
395- self ? . send ( action)
396+ if isProcessingEffects {
397+ self ? . synchronousActionsToSend. append ( action)
398+ } else {
399+ self ? . send ( action)
400+ }
396401 } ,
402+ failed: . none,
397403 completed: { [ weak self] in
398404 didComplete = true
399- self ? . effectDisposables. removeValue ( forKey: uuid ) ? . dispose ( )
405+ self ? . effectDisposables. removeValue ( forKey: effectID ) ? . dispose ( )
400406 } ,
401407 interrupted: { [ weak self] in
402408 didComplete = true
403- self ? . effectDisposables. removeValue ( forKey: uuid ) ? . dispose ( )
409+ self ? . effectDisposables. removeValue ( forKey: effectID ) ? . dispose ( )
404410 }
405411 )
406-
407412 let effectDisposable = effect. start ( observer)
413+ isProcessingEffects = false
408414
409415 if !didComplete {
410- self . effectDisposables [ uuid ] = effectDisposable
416+ self . effectDisposables [ effectID ] = effectDisposable
411417 } else {
412418 effectDisposable. dispose ( )
413419 }
0 commit comments