|
- package sync2
-
- import (
- "reflect"
-
- "gitlink.org.cn/cloudream/common/utils/lo2"
- )
-
- type SelectCase int
-
- type SelectSet[T any, C any] struct {
- cases []reflect.SelectCase
- tags []T
- }
-
- func (s *SelectSet[T, C]) Add(tag T, ch <-chan C) SelectCase {
- s.cases = append(s.cases, reflect.SelectCase{Dir: reflect.SelectRecv, Chan: reflect.ValueOf(ch)})
- s.tags = append(s.tags, tag)
-
- return SelectCase(len(s.cases) - 1)
- }
-
- func (s *SelectSet[T, C]) AddDefault(tag T, ch <-chan C) SelectCase {
- s.cases = append(s.cases, reflect.SelectCase{Dir: reflect.SelectDefault, Chan: reflect.ValueOf(ch)})
- s.tags = append(s.tags, tag)
-
- return SelectCase(len(s.cases) - 1)
- }
-
- func (s *SelectSet[T, C]) Remove(caze SelectCase) {
- s.cases = lo2.RemoveAt(s.cases, int(caze))
- s.tags = lo2.RemoveAt(s.tags, int(caze))
- }
-
- func (s *SelectSet[T, C]) Select() (T, C, bool) {
- chosen, recv, ok := reflect.Select(s.cases)
- if !ok {
- var t T
- var c C
- return t, c, false
- }
-
- return s.tags[chosen], recv.Interface().(C), true
- }
-
- func (s *SelectSet[T, C]) Count() int {
- return len(s.cases)
- }
|