@@ -44,6 +44,8 @@ export interface Writable<T> extends Readable<T> {
44
44
/** Pair of subscriber and invalidator. */
45
45
type SubscribeInvalidateTuple < T > = [ Subscriber < T > , Invalidator < T > ] ;
46
46
47
+ const subscriber_queue = [ ] ;
48
+
47
49
/**
48
50
* Creates a `Readable` store that allows reading by subscription.
49
51
* @param value initial value
@@ -69,7 +71,15 @@ export function writable<T>(value: T, start: StartStopNotifier<T> = noop): Writa
69
71
value = new_value ;
70
72
if ( stop ) { // store is ready
71
73
subscribers . forEach ( ( s ) => s [ 1 ] ( ) ) ;
72
- subscribers . forEach ( ( s ) => s [ 0 ] ( value ) ) ;
74
+ const run_queue = ! subscriber_queue . length ;
75
+ subscribers . forEach ( s => subscriber_queue . push ( s , value ) ) ;
76
+ if ( run_queue ) {
77
+ let s ;
78
+ while ( s = subscriber_queue . shift ( ) ) {
79
+ const val = subscriber_queue . shift ( ) ;
80
+ s [ 0 ] ( val ) ;
81
+ }
82
+ }
73
83
}
74
84
}
75
85
}
@@ -128,10 +138,6 @@ export function derived<T, S extends Stores>(
128
138
129
139
const auto = fn . length < 2 ;
130
140
131
- const subscribers : Array < Subscriber < T > > = [ ] ;
132
- const invalidators : Array < Invalidator < T > > = [ ] ;
133
- let value : T = initial_value ;
134
-
135
141
const store = readable ( initial_value , ( set ) => {
136
142
let inited = false ;
137
143
const values : StoresValues < S > = [ ] as StoresValues < S > ;
@@ -147,11 +153,6 @@ export function derived<T, S extends Stores>(
147
153
const result = fn ( single ? values [ 0 ] : values , set ) ;
148
154
if ( auto ) {
149
155
set ( result as T ) ;
150
- const dirty = safe_not_equal ( value , result ) ;
151
- value = result as T ;
152
- if ( ! dirty ) {
153
- subscribers . forEach ( s => s ( value ) ) ;
154
- }
155
156
} else {
156
157
cleanup = is_function ( result ) ? result as Unsubscriber : noop ;
157
158
}
@@ -166,7 +167,6 @@ export function derived<T, S extends Stores>(
166
167
}
167
168
} ,
168
169
( ) => {
169
- run_all ( invalidators ) ;
170
170
pending |= ( 1 << i ) ;
171
171
} ) ,
172
172
) ;
@@ -182,18 +182,7 @@ export function derived<T, S extends Stores>(
182
182
183
183
return {
184
184
subscribe ( run : Subscriber < T > , invalidate : Invalidator < T > = noop ) : Unsubscriber {
185
- subscribers . push ( run ) ;
186
- invalidators . push ( invalidate ) ;
187
-
188
- const unsubscribe = store . subscribe ( run , invalidate ) ;
189
-
190
- return ( ) => {
191
- const index = invalidators . indexOf ( invalidate ) ;
192
- if ( index !== - 1 ) {
193
- invalidators . splice ( index , 1 ) ;
194
- }
195
- unsubscribe ( ) ;
196
- } ;
185
+ return store . subscribe ( run , invalidate ) ;
197
186
}
198
187
} ;
199
188
}
0 commit comments