github.com/kelleygo/clashcore@v1.0.2/common/observable/subscriber.go (about)

     1  package observable
     2  
     3  import (
     4  	"sync"
     5  )
     6  
     7  type Subscription[T any] <-chan T
     8  
     9  type Subscriber[T any] struct {
    10  	buffer chan T
    11  	once   sync.Once
    12  }
    13  
    14  func (s *Subscriber[T]) Emit(item T) {
    15  	s.buffer <- item
    16  }
    17  
    18  func (s *Subscriber[T]) Out() Subscription[T] {
    19  	return s.buffer
    20  }
    21  
    22  func (s *Subscriber[T]) Close() {
    23  	s.once.Do(func() {
    24  		close(s.buffer)
    25  	})
    26  }
    27  
    28  func newSubscriber[T any]() *Subscriber[T] {
    29  	sub := &Subscriber[T]{
    30  		buffer: make(chan T, 200),
    31  	}
    32  	return sub
    33  }