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 2.5 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package future
  2. import (
  3. "context"
  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(ctx context.Context) error {
  42. select {
  43. case <-f.completeChan:
  44. return f.err
  45. case <-ctx.Done():
  46. return ErrContextCancelled
  47. }
  48. }
  49. func (f *SetValueFuture[T]) WaitValue(ctx context.Context) (T, error) {
  50. select {
  51. case <-f.completeChan:
  52. return f.value, f.err
  53. case <-ctx.Done():
  54. var ret T
  55. return ret, ErrContextCancelled
  56. }
  57. }
  58. type SetValueFuture2[T1 any, T2 any] struct {
  59. value1 T1
  60. value2 T2
  61. err error
  62. isCompleted bool
  63. completeChan chan any
  64. }
  65. func NewSetValue2[T1 any, T2 any]() *SetValueFuture2[T1, T2] {
  66. return &SetValueFuture2[T1, T2]{
  67. completeChan: make(chan any),
  68. }
  69. }
  70. func (f *SetValueFuture2[T1, T2]) SetComplete(val1 T1, val2 T2, err error) {
  71. f.value1 = val1
  72. f.value2 = val2
  73. f.err = err
  74. f.isCompleted = true
  75. close(f.completeChan)
  76. }
  77. func (f *SetValueFuture2[T1, T2]) SetValue(val1 T1, val2 T2) {
  78. f.value1 = val1
  79. f.value2 = val2
  80. f.isCompleted = true
  81. close(f.completeChan)
  82. }
  83. func (f *SetValueFuture2[T1, T2]) SetError(err error) {
  84. f.err = err
  85. f.isCompleted = true
  86. close(f.completeChan)
  87. }
  88. func (f *SetValueFuture2[T1, T2]) Error() error {
  89. return f.err
  90. }
  91. func (f *SetValueFuture2[T1, T2]) Value() (T1, T2) {
  92. return f.value1, f.value2
  93. }
  94. func (f *SetValueFuture2[T1, T2]) IsComplete() bool {
  95. return f.isCompleted
  96. }
  97. func (f *SetValueFuture2[T1, T2]) Wait() error {
  98. <-f.completeChan
  99. return f.err
  100. }
  101. func (f *SetValueFuture2[T1, T2]) WaitValue(ctx context.Context) (T1, T2, error) {
  102. select {
  103. case <-f.completeChan:
  104. return f.value1, f.value2, f.err
  105. case <-ctx.Done():
  106. var ret1 T1
  107. var ret2 T2
  108. return ret1, ret2, ErrContextCancelled
  109. }
  110. }