iterator.go 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. package libbox
  2. import "github.com/sagernet/sing/common"
  3. type StringIterator interface {
  4. Len() int32
  5. HasNext() bool
  6. Next() string
  7. }
  8. var _ StringIterator = (*iterator[string])(nil)
  9. type iterator[T any] struct {
  10. values []T
  11. }
  12. func newIterator[T any](values []T) *iterator[T] {
  13. return &iterator[T]{values}
  14. }
  15. //go:noinline
  16. func newPtrIterator[T any](values []T) *iterator[*T] {
  17. return &iterator[*T]{common.Map(values, func(value T) *T { return &value })}
  18. }
  19. func (i *iterator[T]) Len() int32 {
  20. return int32(len(i.values))
  21. }
  22. func (i *iterator[T]) HasNext() bool {
  23. return len(i.values) > 0
  24. }
  25. func (i *iterator[T]) Next() T {
  26. if len(i.values) == 0 {
  27. return common.DefaultValue[T]()
  28. }
  29. nextValue := i.values[0]
  30. i.values = i.values[1:]
  31. return nextValue
  32. }
  33. type abstractIterator[T any] interface {
  34. Next() T
  35. HasNext() bool
  36. }
  37. func iteratorToArray[T any](iterator abstractIterator[T]) []T {
  38. if iterator == nil {
  39. return nil
  40. }
  41. var values []T
  42. for iterator.HasNext() {
  43. values = append(values, iterator.Next())
  44. }
  45. return values
  46. }