返回 DeepSeek-Reasonix
fanout.go
根目录 / internal / event / fanout.go
1 package event
2
3 // FanOut dispatches each event to every registered sink in order.
4 // A nil sink in the list is silently skipped. Use it when you want one
5 // event stream to reach multiple consumers — e.g. the desktop tab UI and
6 // a bot-channel notifier.
7 type FanOut struct {
8 sinks []Sink
9 }
10
11 // NewFanOut returns a FanOut that delivers every Emit call to every sink
12 // in the given order. A zero-length list is valid (no-op).
13 func NewFanOut(sinks ...Sink) *FanOut {
14 return &FanOut{sinks: sinks}
15 }
16
17 // Emit forwards e to every registered sink. Nil sinks are skipped.
18 func (f *FanOut) Emit(e Event) {
19 for _, s := range f.sinks {
20 if s == nil {
21 continue
22 }
23 s.Emit(e)
24 }
25 }
26
27 // Len returns the number of registered sinks.
28 func (f *FanOut) Len() int { return len(f.sinks) }
29
29 lines GO