package cleanup

import "sync"

type Action *int

type Handler struct {
	lock    sync.Mutex
	actions map[Action]func()
}

func New() Handler {
	return Handler{
		actions: make(map[Action]func()),
	}
}

func (h *Handler) Add(fn func()) Action {
	p := Action(new(int))
	h.lock.Lock()
	defer h.lock.Unlock()
	h.actions[p] = fn

	return p
}

func (h *Handler) Remove(a Action) {
	h.lock.Lock()
	defer h.lock.Unlock()
	delete(h.actions, a)
}

func (h *Handler) Run() {
	list := []func(){}
	func() {
		h.lock.Lock()
		defer h.lock.Unlock()
		for _, fn := range h.actions {
			list = append(list, fn)
		}
	}()
	for _, fn := range list {
		fn()
	}
}
