package signaling
type callback func()
type Signaler struct {
callbacks map[*callback]struct{}
}
func (s *Signaler) Connect(f func()) func() {
if s.callbacks == nil {
s.callbacks = make(map[*callback]struct{})
}
cb := (*callback)(&f)
s.callbacks[cb] = struct{}{}
return func() {
delete(s.callbacks, cb)
}
}
func (s *Signaler) Signal() {
for cb := range s.callbacks {
(*cb)()
}
}
func (s *Signaler) Disconnect() {
for cb := range s.callbacks {
delete(s.callbacks, cb)
}
}
type DisconnectStack struct {
funcs []func()
}
func (d *DisconnectStack) Push(funcs ...func()) {
d.funcs = append(d.funcs, funcs...)
}
func (d *DisconnectStack) Connect(s *Signaler, f func()) {
d.Push(s.Connect(f))
}
func (d *DisconnectStack) Pop() {
if len(d.funcs) == 0 {
return
}
f := d.funcs[len(d.funcs)-1]
d.funcs[len(d.funcs)-1] = nil
d.funcs = d.funcs[:len(d.funcs)-1]
f()
}
func (d *DisconnectStack) Disconnect() {
for _, f := range d.funcs {
f()
}
d.funcs = nil
}