package irc import ( "git.chromaticdragon.app/pyrex/minimal-irc-server/v2/src/transport" ) type Globals struct { Server *transport.Server Users *UsersSystem Notifications *NotificationsSystem } var globals *Globals = nil func InitializeGlobals(server *transport.Server) { globals = &Globals{ Server: server, Users: NewUsersSystem(), Notifications: NewNotificationsSystem(), } } func GetGlobals() *Globals { if globals == nil { panic("globals not initialized") } return globals } func (g *Globals) getHandlers() []Handler { return []Handler{ g.Users, g.Notifications, } } func Dispatch[T any](askPermission func(T) error, act func(T)) error { globals := GetGlobals() handlers := globals.getHandlers() for _, handler := range handlers { if h, ok := handler.(T); ok { err := askPermission(h) if err != nil { return err } } } for _, handler := range handlers { if h, ok := handler.(T); ok { act(h) } } return nil }