You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

set_value_future.go 1.4 kB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package future
  2. import (
  3. "time"
  4. )
  5. type SetValueFuture[T any] struct {
  6. value T
  7. err error
  8. isCompleted bool
  9. completeChan chan any
  10. }
  11. func NewSetValue[T any]() *SetValueFuture[T] {
  12. return &SetValueFuture[T]{
  13. completeChan: make(chan any),
  14. }
  15. }
  16. func (f *SetValueFuture[T]) SetComplete(val T, err error) {
  17. f.value = val
  18. f.err = err
  19. f.isCompleted = true
  20. close(f.completeChan)
  21. }
  22. func (f *SetValueFuture[T]) SetValue(val T) {
  23. f.value = val
  24. f.isCompleted = true
  25. close(f.completeChan)
  26. }
  27. func (f *SetValueFuture[T]) SetError(err error) {
  28. f.err = err
  29. f.isCompleted = true
  30. close(f.completeChan)
  31. }
  32. func (f *SetValueFuture[T]) Error() error {
  33. return f.err
  34. }
  35. func (f *SetValueFuture[T]) Value() T {
  36. return f.value
  37. }
  38. func (f *SetValueFuture[T]) IsComplete() bool {
  39. return f.isCompleted
  40. }
  41. func (f *SetValueFuture[T]) Wait() error {
  42. <-f.completeChan
  43. return f.err
  44. }
  45. func (f *SetValueFuture[T]) WaitTimeout(timeout time.Duration) error {
  46. select {
  47. case <-f.completeChan:
  48. return f.err
  49. case <-time.After(timeout):
  50. return ErrWaitTimeout
  51. }
  52. }
  53. func (f *SetValueFuture[T]) WaitValue() (T, error) {
  54. <-f.completeChan
  55. return f.value, f.err
  56. }
  57. func (f *SetValueFuture[T]) WaitValueTimeout(timeout time.Duration) (T, error) {
  58. select {
  59. case <-f.completeChan:
  60. return f.value, f.err
  61. case <-time.After(timeout):
  62. var ret T
  63. return ret, ErrWaitTimeout
  64. }
  65. }

公共库

Contributors (1)