mirror of
https://github.com/PuerkitoBio/goquery
synced 2026-04-22 23:37:04 +08:00
Re-orangize code for compitable
- We don't need to use the iter.Seq2 type; instead, we can use func(yield func(int, *Selection) bool). In fact, the underlying type of iter.Seq2 is func(yield func(int, *Selection) bool), so we don't need to upgrade the go.mod version. - For for-range testing in version 1.23, we can use build tags to compile only for versions above 1.23.
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
//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)
|
||||
}
|
||||
}
|
||||
@@ -32,9 +32,10 @@ func BenchmarkEachIter(b *testing.B) {
|
||||
sel := DocW().Find("td")
|
||||
b.StartTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
for range sel.EachIter() {
|
||||
sel.EachIter()(func(i int, s *Selection) bool {
|
||||
tmp++
|
||||
}
|
||||
return true
|
||||
})
|
||||
if n == 0 {
|
||||
n = tmp
|
||||
}
|
||||
@@ -52,12 +53,11 @@ func BenchmarkEachIterWithBreak(b *testing.B) {
|
||||
b.StartTimer()
|
||||
for i := 0; i < b.N; i++ {
|
||||
tmp = 0
|
||||
for range sel.EachIter() {
|
||||
sel.EachIter()(func(i int, s *Selection) bool {
|
||||
tmp++
|
||||
if tmp >= 10 {
|
||||
break
|
||||
}
|
||||
}
|
||||
return tmp < 10
|
||||
})
|
||||
|
||||
if n == 0 {
|
||||
n = tmp
|
||||
}
|
||||
|
||||
+1
-3
@@ -1,7 +1,5 @@
|
||||
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
|
||||
@@ -16,7 +14,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() iter.Seq2[int, *Selection] {
|
||||
func (s *Selection) EachIter() func(yield func(int, *Selection) bool) {
|
||||
return func(yield func(int, *Selection) bool) {
|
||||
for i, n := range s.Nodes {
|
||||
if !yield(i, newSingleSelection(n, s.document)) {
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
//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)
|
||||
}
|
||||
+10
-12
@@ -110,16 +110,15 @@ func TestEachIter(t *testing.T) {
|
||||
var cnt int
|
||||
|
||||
sel := Doc().Find(".hero-unit .row-fluid")
|
||||
|
||||
for i, s := range sel.EachIter() {
|
||||
sel.EachIter()(func(i int, n *Selection) bool {
|
||||
cnt++
|
||||
t.Logf("At index %v, node %v", i, s.Nodes[0].Data)
|
||||
}
|
||||
|
||||
t.Logf("At index %v, node %v", i, n.Nodes[0].Data)
|
||||
return true
|
||||
})
|
||||
sel = sel.Find("a")
|
||||
|
||||
if cnt != 4 {
|
||||
t.Errorf("Expected Each() to call function 4 times, got %v times.", cnt)
|
||||
t.Errorf("Expected EachIter() to call function 4 time, got %v times.", cnt)
|
||||
}
|
||||
assertLength(t, sel.Nodes, 6)
|
||||
}
|
||||
@@ -128,16 +127,15 @@ func TestEachIterWithBreak(t *testing.T) {
|
||||
var cnt int
|
||||
|
||||
sel := Doc().Find(".hero-unit .row-fluid")
|
||||
for i, s := range sel.EachIter() {
|
||||
sel.EachIter()(func(i int, n *Selection) bool {
|
||||
cnt++
|
||||
t.Logf("At index %v, node %v", i, s.Nodes[0].Data)
|
||||
break
|
||||
}
|
||||
|
||||
t.Logf("At index %v, node %v", i, n.Nodes[0].Data)
|
||||
return false
|
||||
})
|
||||
sel = sel.Find("a")
|
||||
|
||||
if cnt != 1 {
|
||||
t.Errorf("Expected Each() to call function 1 time, got %v times.", cnt)
|
||||
t.Errorf("Expected EachIter() to call function 1 time, got %v times.", cnt)
|
||||
}
|
||||
assertLength(t, sel.Nodes, 6)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user