code.vegaprotocol.io/vega@v0.79.0/libs/close/closer.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package close
    17  
    18  type Closer struct {
    19  	closeFns []func()
    20  }
    21  
    22  // Add adds a function to call during call to CloseAll.
    23  func (c *Closer) Add(closeFn func()) {
    24  	c.closeFns = append(c.closeFns, closeFn)
    25  }
    26  
    27  // CloseAll calls all close functions in reverse order.
    28  // Higher level-components should be closed first, but are usually instantiated
    29  // last (and, thus, added later to the closer), hence the reverse order.
    30  func (c *Closer) CloseAll() {
    31  	for i := len(c.closeFns) - 1; i >= 0; i-- {
    32  		c.closeFns[i]()
    33  	}
    34  
    35  	c.closeFns = []func(){}
    36  }
    37  
    38  func NewCloser() *Closer {
    39  	return &Closer{
    40  		closeFns: []func(){},
    41  	}
    42  }