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.6 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
2 years ago
2 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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. // 等待直到Complete或者ctx被取消。
  42. // 注:返回ErrContextCancelled不代表产生结果的过程没有执行过,甚至不代表Future没有Complete
  43. func (f *SetValueFuture[T]) Wait(ctx context.Context) error {
  44. select {
  45. case <-f.completeChan:
  46. return f.err
  47. case <-ctx.Done():
  48. return ErrContextCancelled
  49. }
  50. }
  51. func (f *SetValueFuture[T]) WaitValue(ctx context.Context) (T, error) {
  52. select {
  53. case <-f.completeChan:
  54. return f.value, f.err
  55. case <-ctx.Done():
  56. var ret T
  57. return ret, ErrContextCancelled
  58. }
  59. }
  60. type SetValueFuture2[T1 any, T2 any] struct {
  61. value1 T1
  62. value2 T2
  63. err error
  64. isCompleted bool
  65. completeChan chan any
  66. }
  67. func NewSetValue2[T1 any, T2 any]() *SetValueFuture2[T1, T2] {
  68. return &SetValueFuture2[T1, T2]{
  69. completeChan: make(chan any),
  70. }
  71. }
  72. func (f *SetValueFuture2[T1, T2]) SetComplete(val1 T1, val2 T2, err error) {
  73. f.value1 = val1
  74. f.value2 = val2
  75. f.err = err
  76. f.isCompleted = true
  77. close(f.completeChan)
  78. }
  79. func (f *SetValueFuture2[T1, T2]) SetValue(val1 T1, val2 T2) {
  80. f.value1 = val1
  81. f.value2 = val2
  82. f.isCompleted = true
  83. close(f.completeChan)
  84. }
  85. func (f *SetValueFuture2[T1, T2]) SetError(err error) {
  86. f.err = err
  87. f.isCompleted = true
  88. close(f.completeChan)
  89. }
  90. func (f *SetValueFuture2[T1, T2]) Error() error {
  91. return f.err
  92. }
  93. func (f *SetValueFuture2[T1, T2]) Value() (T1, T2) {
  94. return f.value1, f.value2
  95. }
  96. func (f *SetValueFuture2[T1, T2]) IsComplete() bool {
  97. return f.isCompleted
  98. }
  99. func (f *SetValueFuture2[T1, T2]) Wait() error {
  100. <-f.completeChan
  101. return f.err
  102. }
  103. func (f *SetValueFuture2[T1, T2]) WaitValue(ctx context.Context) (T1, T2, error) {
  104. select {
  105. case <-f.completeChan:
  106. return f.value1, f.value2, f.err
  107. case <-ctx.Done():
  108. var ret1 T1
  109. var ret2 T2
  110. return ret1, ret2, ErrContextCancelled
  111. }
  112. }