Explorar el Código

Add IterPages() method to v3 Pager interface

Jonathan D. Storm hace 6 meses
padre
commit
8bbb8dcd02
Se han modificado 2 ficheros con 44 adiciones y 0 borrados
  1. 18 0
      v3/depager.go
  2. 26 0
      v3/depager_test.go

+ 18 - 0
v3/depager.go

@@ -40,6 +40,9 @@ type Pager[T any] interface {
 	// Iter is intended to be used in a for-range loop
 	Iter() <-chan T
 
+	// IterPages iterates over whole pages rather than items
+	IterPages() <-chan Page[T]
+
 	// LastErr must return the first error encountered, if any
 	LastErr() error
 }
@@ -101,6 +104,21 @@ func (p *pager[T]) iteratePages() <-chan Page[T] {
 	return ch
 }
 
+func (p *pager[T]) IterPages() <-chan Page[T] {
+	ch := make(chan Page[T], p.n)
+	go func() {
+		defer close(ch)
+		for page := range p.iteratePages() {
+			ch <- page
+			if p.err != nil {
+				p.err = fmt.Errorf("pager: iterate pages: %s", p.err)
+				return
+			}
+		}
+	}()
+	return ch
+}
+
 func (p *pager[T]) Iter() <-chan T {
 	ch := make(chan T, p.n)
 	go func() {

+ 26 - 0
v3/depager_test.go

@@ -108,6 +108,32 @@ func TestClientReturnsNonemptyPage(t *testing.T) {
 	}
 }
 
+func TestClientReturnsNonemptyPage2(t *testing.T) {
+	itemCount := 3
+	client := NewNoopClient[any](itemCount, nil,
+		[]*Aggr[any]{{1, 2}, {3}},
+	)
+	pagePool := make(chan Page[any], 1)
+	for i := 0; i < cap(pagePool); i++ {
+		tmp := Aggr[any](make([]any, 0, 2))
+		pagePool <- &tmp
+	}
+	pager := NewPager(client, pagePool)
+	var elem int
+	var i int
+	for p := range pager.IterPages() {
+		elem = p.Elems()[0].(int)
+		i++
+		pagePool <- p
+	}
+	if err := pager.LastErr(); err != nil {
+		t.Errorf("unexpected error in pager: %v", err)
+	}
+	if elem != 3 {
+		t.Errorf("unexpected value: '%v'", elem)
+	}
+}
+
 func TestClientReturnsFewerPagesThanExpected(t *testing.T) {
 	pageSize := 1
 	itemCount := pageSize + 1