31 lines
		
	
	
		
			606 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			31 lines
		
	
	
		
			606 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use std::fmt;
 | |
| 
 | |
| #[derive(Default)]
 | |
| pub struct Exit {
 | |
|     exited: bool,
 | |
|     exits: Vec<Box<dyn FnOnce() + Send + Sync>>,
 | |
| }
 | |
| 
 | |
| impl Exit {
 | |
|     pub fn register_exit(&mut self, exit: Box<dyn FnOnce() + Send + Sync>) {
 | |
|         if self.exited {
 | |
|             exit();
 | |
|         } else {
 | |
|             self.exits.push(exit);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     pub fn exit(&mut self) {
 | |
|         self.exited = true;
 | |
|         for exit in self.exits.drain(..) {
 | |
|             exit();
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| impl fmt::Debug for Exit {
 | |
|     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
 | |
|         write!(f, "{} exits", self.exits.len())
 | |
|     }
 | |
| }
 |