reader.go 594 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package reader
  2. import (
  3. "context"
  4. "errors"
  5. )
  6. type Reader[T any] interface {
  7. Read(ctx context.Context, dst []T) (int, error)
  8. Close() error
  9. }
  10. var Done = errors.New("Done")
  11. type SliceReader[T any] struct {
  12. items []T
  13. pos int
  14. }
  15. func NewSliceReader[T any](items []T) *SliceReader[T] {
  16. return &SliceReader[T]{
  17. items: items,
  18. pos: 0,
  19. }
  20. }
  21. func (r *SliceReader[T]) Read(ctx context.Context, dst []T) (int, error) {
  22. if r.pos >= len(r.items) {
  23. return 0, Done
  24. }
  25. n := copy(dst, r.items[r.pos:])
  26. r.pos += n
  27. return n, nil
  28. }
  29. func (r *SliceReader[T]) Close() error {
  30. return nil
  31. }