package cleanup // Stack holds deferred cleanup functions and runs them in LIFO order. // Errors are collected; one cleanup failure does not stop later ones. type Stack struct { fns []func() error } // Add registers fn to run on Run(). func (s *Stack) Add(fn func() error) { s.fns = append(s.fns, fn) } // Run executes all registered functions in reverse order and returns // every error produced. func (s *Stack) Run() []error { var errs []error for i := len(s.fns) - 1; i >= 0; i-- { if err := s.fns[i](); err != nil { errs = append(errs, err) } } return errs }