diff --git a/pkgs/future/future.go b/pkgs/future/future.go index 767447c..0f952b4 100644 --- a/pkgs/future/future.go +++ b/pkgs/future/future.go @@ -5,7 +5,11 @@ import ( "fmt" ) -var ErrCompleted = fmt.Errorf("context canceled") +var ErrConsumed = fmt.Errorf("future already consumed") + +var ErrNotComplete = fmt.Errorf("future not complete") + +var ErrCanceled = context.Canceled type Future interface { IsComplete() bool diff --git a/pkgs/future/ready.go b/pkgs/future/ready.go index 056ec2c..70594af 100644 --- a/pkgs/future/ready.go +++ b/pkgs/future/ready.go @@ -24,7 +24,7 @@ func (f *Ready) Wait(ctx context.Context) error { select { case v, ok := <-f.ch: if !ok { - return ErrCompleted + return ErrConsumed } return v diff --git a/pkgs/future/set_value_future.go b/pkgs/future/set_value_future.go index d59aa17..43d0d14 100644 --- a/pkgs/future/set_value_future.go +++ b/pkgs/future/set_value_future.go @@ -63,7 +63,7 @@ func (f *SetValueFuture[T]) Wait(ctx context.Context) (T, error) { case cv, ok := <-f.ch: if !ok { var ret T - return ret, cv.Err + return ret, ErrConsumed } return cv.Value, cv.Err @@ -73,6 +73,20 @@ func (f *SetValueFuture[T]) Wait(ctx context.Context) (T, error) { } } +func (f *SetValueFuture[T]) TryGetValue() (T, error) { + select { + case cv, ok := <-f.ch: + if !ok { + var ret T + return ret, ErrConsumed + } + return cv.Value, cv.Err + default: + var ret T + return ret, ErrNotComplete + } +} + type SetValueFuture2[T1 any, T2 any] struct { isCompleted bool ch chan ChanValue2[T1, T2] @@ -126,7 +140,7 @@ func (f *SetValueFuture2[T1, T2]) Wait(ctx context.Context) (T1, T2, error) { select { case cv, ok := <-f.ch: if !ok { - return cv.Value1, cv.Value2, cv.Err + return cv.Value1, cv.Value2, ErrConsumed } return cv.Value1, cv.Value2, cv.Err diff --git a/pkgs/future/set_void_future.go b/pkgs/future/set_void_future.go index d4fd0b0..2febe92 100644 --- a/pkgs/future/set_void_future.go +++ b/pkgs/future/set_void_future.go @@ -41,7 +41,7 @@ func (f *SetVoidFuture) Wait(ctx context.Context) error { select { case v, ok := <-f.ch: if !ok { - return ErrCompleted + return ErrConsumed } return v