5 // Ranger returns a Sender and a Receiver. The Receiver provides a
6 // Next method to retrieve values. The Sender provides a Send method
7 // to send values and a Close method to stop sending values. The Next
8 // method indicates when the Sender has been closed, and the Send
9 // method indicates when the Receiver has been freed.
11 // This is a convenient way to exit a goroutine sending values when
12 // the receiver stops reading them.
13 func Ranger[T any]() (*Sender[T], *Receiver[T]) {
16 s := &Sender[T]{values: c, done: d}
17 r := &Receiver[T]{values: c, done: d}
18 runtime.SetFinalizer(r, r.finalize)
22 // A sender is used to send values to a Receiver.
23 type Sender[T any] struct {
28 // Send sends a value to the receiver. It returns whether any more
29 // values may be sent; if it returns false the value was not sent.
30 func (s *Sender[T]) Send(v T) bool {
39 // Close tells the receiver that no more values will arrive.
40 // After Close is called, the Sender may no longer be used.
41 func (s *Sender[T]) Close() {
45 // A Receiver receives values from a Sender.
46 type Receiver[T any] struct {
51 // Next returns the next value from the channel. The bool result
52 // indicates whether the value is valid, or whether the Sender has
53 // been closed and no more values will be received.
54 func (r *Receiver[T]) Next() (T, bool) {
59 // finalize is a finalizer for the receiver.
60 func (r *Receiver[T]) finalize() {