diff --git a/bench_iteration123_test.go b/bench_iteration123_test.go deleted file mode 100644 index 956b723..0000000 --- a/bench_iteration123_test.go +++ /dev/null @@ -1,48 +0,0 @@ -//go:build go1.23 -// +build go1.23 - -package goquery - -import "testing" - -func BenchmarkEachIter123(b *testing.B) { - var tmp, n int - - b.StopTimer() - sel := DocW().Find("td") - b.StartTimer() - for i := 0; i < b.N; i++ { - for range sel.EachIter() { - tmp++ - } - if n == 0 { - n = tmp - } - } - if n != 59 { - b.Fatalf("want 59, got %d", n) - } -} - -func BenchmarkEachIterWithBreak123(b *testing.B) { - var tmp, n int - - b.StopTimer() - sel := DocW().Find("td") - b.StartTimer() - for i := 0; i < b.N; i++ { - tmp = 0 - for range sel.EachIter() { - tmp++ - if tmp >= 10 { - break - } - } - if n == 0 { - n = tmp - } - } - if n != 10 { - b.Fatalf("want 10, got %d", n) - } -} diff --git a/bench_iteration_test.go b/bench_iteration_test.go index 1ff9507..1def1a2 100644 --- a/bench_iteration_test.go +++ b/bench_iteration_test.go @@ -32,10 +32,9 @@ func BenchmarkEachIter(b *testing.B) { sel := DocW().Find("td") b.StartTimer() for i := 0; i < b.N; i++ { - sel.EachIter()(func(i int, s *Selection) bool { + for range sel.EachIter() { tmp++ - return true - }) + } if n == 0 { n = tmp } @@ -53,11 +52,12 @@ func BenchmarkEachIterWithBreak(b *testing.B) { b.StartTimer() for i := 0; i < b.N; i++ { tmp = 0 - sel.EachIter()(func(i int, s *Selection) bool { + for range sel.EachIter() { tmp++ - return tmp < 10 - }) - + if tmp >= 10 { + break + } + } if n == 0 { n = tmp } diff --git a/go.mod b/go.mod index 2fe9f3c..8fba30d 100644 --- a/go.mod +++ b/go.mod @@ -5,4 +5,4 @@ require ( golang.org/x/net v0.27.0 ) -go 1.18 +go 1.23 diff --git a/iteration.go b/iteration.go index 882be2d..1ca5245 100644 --- a/iteration.go +++ b/iteration.go @@ -1,5 +1,7 @@ package goquery +import "iter" + // Each iterates over a Selection object, executing a function for each // matched element. It returns the current Selection object. The function // f is called for each element in the selection with the index of the @@ -14,7 +16,7 @@ func (s *Selection) Each(f func(int, *Selection)) *Selection { // EachIter returns an iterator that yields the Selection object in order. // The implementation is similar to Each, but it returns an iterator instead. -func (s *Selection) EachIter() func(yield func(int, *Selection) bool) { +func (s *Selection) EachIter() iter.Seq2[int, *Selection] { return func(yield func(int, *Selection) bool) { for i, n := range s.Nodes { if !yield(i, newSingleSelection(n, s.document)) { diff --git a/iteration123_test.go b/iteration123_test.go deleted file mode 100644 index 23f4a2f..0000000 --- a/iteration123_test.go +++ /dev/null @@ -1,42 +0,0 @@ -//go:build go1.23 -// +build go1.23 - -package goquery - -import "testing" - -func TestEachIter123(t *testing.T) { - var cnt int - - sel := Doc().Find(".hero-unit .row-fluid") - - for i, s := range sel.EachIter() { - cnt++ - t.Logf("At index %v, node %v", i, s.Nodes[0].Data) - } - - sel = sel.Find("a") - - if cnt != 4 { - t.Errorf("Expected EachIter() to call function 4 times, got %v times.", cnt) - } - assertLength(t, sel.Nodes, 6) -} - -func TestEachIterWithBreak123(t *testing.T) { - var cnt int - - sel := Doc().Find(".hero-unit .row-fluid") - for i, s := range sel.EachIter() { - cnt++ - t.Logf("At index %v, node %v", i, s.Nodes[0].Data) - break - } - - sel = sel.Find("a") - - if cnt != 1 { - t.Errorf("Expected EachIter() to call function 1 time, got %v times.", cnt) - } - assertLength(t, sel.Nodes, 6) -} diff --git a/iteration_test.go b/iteration_test.go index b976fce..48cebb2 100644 --- a/iteration_test.go +++ b/iteration_test.go @@ -110,15 +110,16 @@ func TestEachIter(t *testing.T) { var cnt int sel := Doc().Find(".hero-unit .row-fluid") - sel.EachIter()(func(i int, n *Selection) bool { + + for i, s := range sel.EachIter() { cnt++ - t.Logf("At index %v, node %v", i, n.Nodes[0].Data) - return true - }) + t.Logf("At index %v, node %v", i, s.Nodes[0].Data) + } + sel = sel.Find("a") if cnt != 4 { - t.Errorf("Expected EachIter() to call function 4 time, got %v times.", cnt) + t.Errorf("Expected Each() to call function 4 times, got %v times.", cnt) } assertLength(t, sel.Nodes, 6) } @@ -127,15 +128,16 @@ func TestEachIterWithBreak(t *testing.T) { var cnt int sel := Doc().Find(".hero-unit .row-fluid") - sel.EachIter()(func(i int, n *Selection) bool { + for i, s := range sel.EachIter() { cnt++ - t.Logf("At index %v, node %v", i, n.Nodes[0].Data) - return false - }) + t.Logf("At index %v, node %v", i, s.Nodes[0].Data) + break + } + sel = sel.Find("a") if cnt != 1 { - t.Errorf("Expected EachIter() to call function 1 time, got %v times.", cnt) + t.Errorf("Expected Each() to call function 1 time, got %v times.", cnt) } assertLength(t, sel.Nodes, 6) }