| 
									
										
										
										
											2023-01-11 11:13:13 +00:00
										 |  |  | package iotools | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import "io" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // CloserFunc is a function signature which allows | 
					
						
							|  |  |  | // a function to implement the io.Closer type. | 
					
						
							|  |  |  | type CloserFunc func() error | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func (c CloserFunc) Close() error { | 
					
						
							|  |  |  | 	return c() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func CloserCallback(c io.Closer, cb func()) io.Closer { | 
					
						
							|  |  |  | 	return CloserFunc(func() error { | 
					
						
							|  |  |  | 		defer cb() | 
					
						
							|  |  |  | 		return c.Close() | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-02 09:34:52 +01:00
										 |  |  | func CloserAfterCallback(c io.Closer, cb func()) io.Closer { | 
					
						
							|  |  |  | 	return CloserFunc(func() (err error) { | 
					
						
							|  |  |  | 		defer func() { err = c.Close() }() | 
					
						
							|  |  |  | 		cb() | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-11 11:13:13 +00:00
										 |  |  | // CloseOnce wraps an io.Closer to ensure it only performs the close logic once. | 
					
						
							|  |  |  | func CloseOnce(c io.Closer) io.Closer { | 
					
						
							|  |  |  | 	return CloserFunc(func() error { | 
					
						
							|  |  |  | 		if c == nil { | 
					
						
							|  |  |  | 			// already run. | 
					
						
							|  |  |  | 			return nil | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Acquire. | 
					
						
							|  |  |  | 		cptr := c | 
					
						
							|  |  |  | 		c = nil | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// Call the closer. | 
					
						
							|  |  |  | 		return cptr.Close() | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } |