|
|
- package events
-
- import "context"
-
- // An EventCache buffers events for a Fireable
- // All events are cached. Filtering happens on Flush
- type EventCache struct {
- evsw Fireable
- events []eventInfo
- }
-
- // Create a new EventCache with an EventSwitch as backend
- func NewEventCache(evsw Fireable) *EventCache {
- return &EventCache{
- evsw: evsw,
- }
- }
-
- // a cached event
- type eventInfo struct {
- event string
- data EventData
- }
-
- // Cache an event to be fired upon finality.
- func (evc *EventCache) FireEvent(event string, data EventData) {
- // append to list (go will grow our backing array exponentially)
- evc.events = append(evc.events, eventInfo{event, data})
- }
-
- // Fire events by running evsw.FireEvent on all cached events. Blocks.
- // Clears cached events
- func (evc *EventCache) Flush(ctx context.Context) {
- for _, ei := range evc.events {
- evc.evsw.FireEvent(ctx, ei.event, ei.data)
- }
- // Clear the buffer, since we only add to it with append it's safe to just set it to nil and maybe safe an allocation
- evc.events = nil
- }
|