package h2mux

// Signal describes an event that can be waited on for at least one signal.
// Signalling the event while it is in the signalled state is a noop.
// When the waiter wakes up, the signal is set to unsignalled.
// It is a way for any number of writers to inform a reader (without blocking)
// that an event has happened.
type Signal struct {
	c chan struct{}
}

// NewSignal creates a new Signal.
func NewSignal() Signal {
	return Signal{c: make(chan struct{}, 1)}
}

// Signal signals the event.
func (s Signal) Signal() {
	// This channel is buffered, so the nonblocking send will always succeed if the buffer is empty.
	select {
	case s.c <- struct{}{}:
	default:
	}
}

// Wait for the event to be signalled.
func (s Signal) Wait() {
	<-s.c
}

// WaitChannel returns a channel that is readable after Signal is called.
func (s Signal) WaitChannel() <-chan struct{} {
	return s.c
}