This commit is contained in:
16
pq/lib.go
16
pq/lib.go
@@ -24,6 +24,7 @@
|
||||
package pq
|
||||
|
||||
import (
|
||||
"iter"
|
||||
"sync"
|
||||
|
||||
"gogs.humancabbage.net/sam/priorityq"
|
||||
@@ -153,3 +154,18 @@ func (s *state[P, T]) TrySend(priority P, value T) error {
|
||||
s.canRecv.Broadcast()
|
||||
return nil
|
||||
}
|
||||
|
||||
// Iter returns an iterator that consumes values until the queue is closed.
|
||||
func (s *state[P, T]) Iter() iter.Seq[T] {
|
||||
return func(yield func(T) bool) {
|
||||
for {
|
||||
_, t, ok := s.Recv()
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
if !yield(t) {
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -147,6 +147,30 @@ func TestConcProducerConsumer(t *testing.T) {
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func TestIter(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := pq.Make[int, int](4)
|
||||
q.Send(4, 0)
|
||||
q.Send(3, 1)
|
||||
q.Send(2, 2)
|
||||
q.Send(1, 3)
|
||||
q.Close()
|
||||
i := 0
|
||||
for v := range q.Iter() {
|
||||
if v != i {
|
||||
t.Errorf("expected %d, got %d", i, v)
|
||||
}
|
||||
i++
|
||||
}
|
||||
|
||||
// to test yield() returning false
|
||||
q = pq.Make[int, int](4)
|
||||
q.Send(1, 3)
|
||||
for _ = range q.Iter() {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
func BenchmarkSend(b *testing.B) {
|
||||
q := pq.Make[int, int](b.N)
|
||||
// randomize priorities to get amortized cost per op
|
||||
|
Reference in New Issue
Block a user