@@ -12,8 +12,7 @@ public class Store<StoreState: State, StoreController: Cancellable>: Publisher {
1212 didSet{
1313 queue. sync {
1414if state!= oldValue{
15- stateCurrentValueSubject. send ( state)
16- statePassthroughSubject. send ( state)
15+ stateSubject. send ( state)
1716}
1817}
1918}
@@ -22,15 +21,12 @@ public class Store<StoreState: State, StoreController: Cancellable>: Publisher {
2221
2322public init ( _ state: StoreState ,
2423 dispatcher: Dispatcher ,
25- storeController: StoreController ,
26- defaultPublisherMode: DefaultPublisherMode = . currentValue) {
24+ storeController: StoreController ) {
2725self . initialState= state
2826self . dispatcher= dispatcher
29- self . stateCurrentValueSubject= . init( state)
30- self . statePassthroughSubject= . init( )
27+ self . stateSubject= . init( state)
3128self . storeController= storeController
3229self . state= state
33- self . defaultPublisherMode= defaultPublisherMode
3430}
3531
3632 /**
@@ -57,8 +53,7 @@ public class Store<StoreState: State, StoreController: Cancellable>: Publisher {
5753}
5854
5955public func replayOnce( ) {
60- stateCurrentValueSubject. send ( state)
61- statePassthroughSubject. send ( state)
56+ stateSubject. send ( state)
6257
6358 dispatcher. stateWasReplayed ( state: state)
6459}
@@ -71,56 +66,85 @@ public class Store<StoreState: State, StoreController: Cancellable>: Publisher {
7166 publisher. receive ( subscriber: subscriber)
7267}
7368
74- public var publisher : StorePublisher {
75- switch defaultPublisherMode{
76- case . passthrough:
77- return passthroughPublisher
78-
79- case . currentValue:
80- return currentValuePublisher
81- }
82- }
83-
84- public var passthroughPublisher : StorePublisher {
85- . init( subject: statePassthroughSubject)
86- }
87-
88- public var currentValuePublisher : StorePublisher {
89- . init( subject: stateCurrentValueSubject)
69+ public var publisher : Publishers . StoreStatePublisher < StoreState > {
70+ . init( upstream: stateSubject)
9071}
9172
9273 /// Scope a task from the state and receive only new updated since subscription.
93- public func scope< T: Taskable & Equatable > ( _ transform: @escaping ( StoreState ) -> T ) -> AnyPublisher < T , Failure > {
94- passthroughPublisher
95- . map ( transform)
96- . removeDuplicates ( )
97- . eraseToAnyPublisher ( )
74+ public func scope< T: Taskable > ( _ transform: @escaping ( StoreState ) -> T ) -> Publishers . StoreScopePublisher < T > {
75+ Publishers . StoreScopePublisher ( upstream: stateSubject. map ( transform) ,
76+ initialValue: transform ( state) )
9877}
9978
100- private var stateCurrentValueSubject : CurrentValueSubject < StoreState , Never >
101- private var statePassthroughSubject : PassthroughSubject < StoreState , Never >
79+ private var stateSubject : CurrentValueSubject < StoreState , Never >
10280private let queue = DispatchQueue ( label: " atomic state " )
103- private let defaultPublisherMode : DefaultPublisherMode
10481}
10582
106- public extension Store {
107- enum DefaultPublisherMode {
108- case passthrough
109- case currentValue
83+ public extension Publishers {
84+ class StoreStatePublisher < StoreState: State > : Publisher {
85+ public typealias Upstream = any Subject < StoreState , Never >
86+ public typealias Output = StoreState
87+ public typealias Failure = Never
88+
89+ private let upstream : Upstream
90+
91+ internal init ( upstream: Upstream ) {
92+ self . upstream= upstream
93+ }
94+
95+ public func receive< S: Subscriber > ( subscriber: S ) where Failure== S . Failure , Output== S . Input {
96+ upstream. subscribe ( subscriber)
97+ }
11098}
11199
112- class StorePublisher : Publisher {
113- public typealias Output = StoreState
100+ struct StoreScopePublisher < StoreTask: Taskable > : Publisher {
101+ public typealias Upstream = any Publisher < StoreTask , Never >
102+ public typealias Output = StoreTask
114103public typealias Failure = Never
115104
116- private var subject : any Subject < StoreState , Never >
105+ private let upstream : Upstream
106+ private let initialValue : StoreTask
117107
118- internal init ( subject: any Subject < StoreState , Never > ) {
119- self . subject= subject
108+ internal init ( upstream: Upstream , initialValue: StoreTask ) {
109+ self . upstream= upstream
110+ self . initialValue= initialValue
120111}
121112
122113public func receive< S: Subscriber > ( subscriber: S ) where Failure== S . Failure , Output== S . Input {
123- subject. subscribe ( subscriber)
114+ upstream. subscribe ( Inner ( downstream: subscriber, initialValue: initialValue) )
115+ }
116+ }
117+ }
118+
119+ extension Publishers . StoreScopePublisher {
120+ private class Inner < Downstream: Subscriber > : Subscriber
121+ where Downstream. Input== Output , Downstream. Failure== Never , Output== StoreTask {
122+ public typealias Input = Output
123+ public typealias Failure = Never
124+
125+ let combineIdentifier = CombineIdentifier ( )
126+ private let downstream : Downstream
127+ private var lastValue : StoreTask
128+
129+ fileprivate init ( downstream: Downstream , initialValue: StoreTask ) {
130+ self . downstream= downstream
131+ self . lastValue= initialValue
132+ }
133+
134+ func receive( subscription: Subscription ) {
135+ downstream. receive ( subscription: subscription)
136+ }
137+
138+ func receive( _ input: Output ) -> Subscribers . Demand {
139+ if input== lastValue{
140+ return . none
141+ }
142+ self . lastValue= input
143+ return downstream. receive ( input)
144+ }
145+
146+ func receive( completion: Subscribers . Completion < Failure > ) {
147+ downstream. receive ( completion: completion)
124148}
125149}
126150}