33 lines
720 B
Go
33 lines
720 B
Go
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
|
|
}
|