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:
amikai
2024-07-24 10:56:30 +08:00
parent 466380eec7
commit 6802fc5555
6 changed files with 109 additions and 23 deletions
+48
View File
@@ -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)
}
}
+7 -7
View File
@@ -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 -1
View File
@@ -5,4 +5,4 @@ require (
golang.org/x/net v0.27.0
)
go 1.23
go 1.18
+1 -3
View File
@@ -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)) {
+42
View File
@@ -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
View File
@@ -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)
}