@@ -63,17 +63,16 @@ export function readable<T>(value?: T, start?: StartStopNotifier<T>): Readable<T
63
63
*/
64
64
export function writable < T > ( value ?: T , start : StartStopNotifier < T > = noop ) : Writable < T > {
65
65
let stop : Unsubscriber ;
66
- const subscribers : Array < SubscribeInvalidateTuple < T > > = [ ] ;
66
+ const subscribers : Set < SubscribeInvalidateTuple < T > > = new Set ( ) ;
67
67
68
68
function set ( new_value : T ) : void {
69
69
if ( safe_not_equal ( value , new_value ) ) {
70
70
value = new_value ;
71
71
if ( stop ) { // store is ready
72
72
const run_queue = ! subscriber_queue . length ;
73
- for ( let i = 0 ; i < subscribers . length ; i += 1 ) {
74
- const s = subscribers [ i ] ;
75
- s [ 1 ] ( ) ;
76
- subscriber_queue . push ( s , value ) ;
73
+ for ( const subscriber of subscribers ) {
74
+ subscriber [ 1 ] ( ) ;
75
+ subscriber_queue . push ( subscriber , value ) ;
77
76
}
78
77
if ( run_queue ) {
79
78
for ( let i = 0 ; i < subscriber_queue . length ; i += 2 ) {
@@ -91,18 +90,17 @@ export function writable<T>(value?: T, start: StartStopNotifier<T> = noop): Writ
91
90
92
91
function subscribe ( run : Subscriber < T > , invalidate : Invalidator < T > = noop ) : Unsubscriber {
93
92
const subscriber : SubscribeInvalidateTuple < T > = [ run , invalidate ] ;
94
- subscribers . push ( subscriber ) ;
95
- if ( subscribers . length === 1 ) {
93
+ subscribers . add ( subscriber ) ;
94
+ if ( subscribers . size === 1 ) {
96
95
stop = start ( set ) || noop ;
97
96
}
98
97
run ( value ) ;
99
98
100
99
return ( ) => {
101
- const index = subscribers . indexOf ( subscriber ) ;
102
- if ( index !== - 1 ) {
103
- subscribers . splice ( index , 1 ) ;
100
+ if ( subscribers . has ( subscriber ) ) {
101
+ subscribers . delete ( subscriber ) ;
104
102
}
105
- if ( subscribers . length === 0 ) {
103
+ if ( subscribers . size === 0 ) {
106
104
stop ( ) ;
107
105
stop = null ;
108
106
}
0 commit comments