bus := abxbus.NewEventBus("OrderBus", &abxbus.EventBusOptions{
EventConcurrency: abxbus.EventConcurrencyBusSerial,
EventHandlerConcurrency: abxbus.EventHandlerConcurrencySerial,
})
order := []string{}
bus.On("ParentEvent", "on_parent", func(event *abxbus.BaseEvent) (any, error) {
order = append(order, "parent_start")
// Detached top-level work: no parent link is recorded for the sibling.
bus.Emit(abxbus.NewBaseEvent("SiblingEvent", nil))
child := event.Emit(abxbus.NewBaseEvent("ChildEvent", nil))
if _, err := child.Now(); err != nil {
return nil, err
}
order = append(order, "parent_end")
return nil, nil
}, nil)
bus.On("ChildEvent", "on_child", func(event *abxbus.BaseEvent) (any, error) {
order = append(order, "child")
return nil, nil
}, nil)
bus.On("SiblingEvent", "on_sibling", func(event *abxbus.BaseEvent) (any, error) {
order = append(order, "sibling")
return nil, nil
}, nil)
parent := bus.Emit(abxbus.NewBaseEvent("ParentEvent", nil))
if _, err := parent.Now(); err != nil {
panic(err)
}
if ok := bus.WaitUntilIdle(nil); !ok {
panic("bus did not become idle")
}