package util import "io" // Cycler stores a value and an accompanying io.Closer. When the value is set, // the closer associated with the previous value is closed. type Cycler[T any] struct { value T closer io.Closer } // Value returns the cycler's value. func (this *Cycler[T]) Value () T { return this.value } // Set sets the value and associated closer, closing the previous one. func (this *Cycler[T]) Set (value T, closer io.Closer) (err error) { if this.closer != nil { err = this.closer.Close() } this.value = value this.closer = closer return err } // Close closes the associated closer early. func (this *Cycler[T]) Close () error { err := this.closer.Close() this.closer = nil return err }