iterator.go 813 B

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