@ -91,7 +91,7 @@ func (q *subscribeState) pump(ctx context.Context) {
}
}
} else {
} else {
// Keep the cases in this select in sync with
// Keep the cases in this select in sync with
// Subscriber.dispatch below. The only differen t should be
// Subscriber.dispatch below. The only differen ce should be
// that this select doesn't deliver queued values to
// that this select doesn't deliver queued values to
// anyone, and unconditionally accepts new values.
// anyone, and unconditionally accepts new values.
select {
select {
@ -134,9 +134,10 @@ func (s *subscribeState) subscribeTypes() []reflect.Type {
return ret
return ret
}
}
func ( s * subscribeState ) addSubscriber ( t reflect . Type , sub subscriber ) {
func ( s * subscribeState ) addSubscriber ( sub subscriber ) {
s . outputsMu . Lock ( )
s . outputsMu . Lock ( )
defer s . outputsMu . Unlock ( )
defer s . outputsMu . Unlock ( )
t := sub . subscribeType ( )
if s . outputs [ t ] != nil {
if s . outputs [ t ] != nil {
panic ( fmt . Errorf ( "double subscription for event %s" , t ) )
panic ( fmt . Errorf ( "double subscription for event %s" , t ) )
}
}
@ -183,15 +184,10 @@ type Subscriber[T any] struct {
}
}
func newSubscriber [ T any ] ( r * subscribeState ) * Subscriber [ T ] {
func newSubscriber [ T any ] ( r * subscribeState ) * Subscriber [ T ] {
t := reflect . TypeFor [ T ] ( )
return & Subscriber [ T ] {
ret := & Subscriber [ T ] {
read : make ( chan T ) ,
read : make ( chan T ) ,
unregister : func ( ) { r . deleteSubscriber ( t) } ,
unregister : func ( ) { r . deleteSubscriber ( reflect . TypeFor [ T ] ( ) ) } ,
}
}
r . addSubscriber ( t , ret )
return ret
}
}
func newMonitor [ T any ] ( attach func ( fn func ( T ) ) ( cancel func ( ) ) ) * Subscriber [ T ] {
func newMonitor [ T any ] ( attach func ( fn func ( T ) ) ( cancel func ( ) ) ) * Subscriber [ T ] {