eventbus interface changes
@@ -22,19 +22,45 @@ type Emitter interface {
Emit(evt interface{})
}
+// Subscription represents a subscription to one or multiple event types.
+type Subscription interface {
+ io.Closer
+
+ // Out returns the channel from which to consume events.
+ Out() <-chan interface{}
+}
+
// Bus is an interface for a type-based event delivery system.
type Bus interface {
- // Subscribe creates a new subscription.
+ // Subscribe creates a new Subscription.
//
- // Failing to drain the channel may cause publishers to block. CancelFunc must return after
- // last send to the channel.
+ // eventType can be either a pointer to a single event type, or a slice of pointers to
+ // subscribe to multiple event types at once, under a single subscription (and channel).
//
- // Example:
- // ch := make(chan EventT, 10)
- // defer close(ch)
- // cancel, err := eventbus.Subscribe(ch)
- // defer cancel()
- Subscribe(typedChan interface{}, opts ...SubscriptionOpt) (CancelFunc, error)
+ // Failing to drain the channel may cause publishers to block.
+ //
+ // Simple example
+ //
+ // sub, err := eventbus.Subscribe(new(EventType))
+ // defer sub.Close()
+ // for e := range sub.Out() {
+ // event := e.(EventType) // guaranteed safe
+ // [...]
+ // }
+ //
+ // Multi-type example
+ //
+ // sub, err := eventbus.Subscribe([]interface{}{new(EventA), new(EventB)})
+ // defer sub.Close()
+ // for e := range sub.Out() {
+ // select e.(type):
+ // case EventA:
+ // [...]
+ // case EventB:
+ // [...]
+ // }
+ // }
+ Subscribe(eventType interface{}, opts ...SubscriptionOpt) (Subscription, error)
// Emitter creates a new event emitter.
//
