reader.go 649 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  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 err := ctx.Err(); err != nil {
  23. return 0, err
  24. }
  25. if r.pos >= len(r.items) {
  26. return 0, Done
  27. }
  28. n := copy(dst, r.items[r.pos:])
  29. r.pos += n
  30. return n, nil
  31. }
  32. func (r *SliceReader[T]) Close() error {
  33. return nil
  34. }