iterator.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  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. func newPtrIterator[T any](values []T) *iterator[*T] {
  16. return &iterator[*T]{common.Map(values, func(value T) *T { return &value })}
  17. }
  18. func (i *iterator[T]) Len() int32 {
  19. return int32(len(i.values))
  20. }
  21. func (i *iterator[T]) HasNext() bool {
  22. return len(i.values) > 0
  23. }
  24. func (i *iterator[T]) Next() T {
  25. if len(i.values) == 0 {
  26. return common.DefaultValue[T]()
  27. }
  28. nextValue := i.values[0]
  29. i.values = i.values[1:]
  30. return nextValue
  31. }
  32. type abstractIterator[T any] interface {
  33. Next() T
  34. HasNext() bool
  35. }
  36. func iteratorToArray[T any](iterator abstractIterator[T]) []T {
  37. if iterator == nil {
  38. return nil
  39. }
  40. var values []T
  41. for iterator.HasNext() {
  42. values = append(values, iterator.Next())
  43. }
  44. return values
  45. }