package future import ( "time" ) type SetValueFuture[T any] struct { value T err error isCompleted bool completeChan chan any } func NewSetValue[T any]() *SetValueFuture[T] { return &SetValueFuture[T]{ completeChan: make(chan any), } } func (f *SetValueFuture[T]) SetComplete(val T, err error) { f.value = val f.err = err f.isCompleted = true close(f.completeChan) } func (f *SetValueFuture[T]) SetValue(val T) { f.value = val f.isCompleted = true close(f.completeChan) } func (f *SetValueFuture[T]) SetError(err error) { f.err = err f.isCompleted = true close(f.completeChan) } func (f *SetValueFuture[T]) Error() error { return f.err } func (f *SetValueFuture[T]) Value() T { return f.value } func (f *SetValueFuture[T]) IsComplete() bool { return f.isCompleted } func (f *SetValueFuture[T]) Wait() error { <-f.completeChan return f.err } func (f *SetValueFuture[T]) WaitTimeout(timeout time.Duration) error { select { case <-f.completeChan: return f.err case <-time.After(timeout): return ErrWaitTimeout } } func (f *SetValueFuture[T]) WaitValue() (T, error) { <-f.completeChan return f.value, f.err } func (f *SetValueFuture[T]) WaitValueTimeout(timeout time.Duration) (T, error) { select { case <-f.completeChan: return f.value, f.err case <-time.After(timeout): var ret T return ret, ErrWaitTimeout } }