nu-api/cursor.go

38 lines
554 B
Go
Raw Permalink Normal View History

2023-03-03 14:37:16 +01:00
package nuapi
import (
"context"
)
type Cursor[T any] struct {
ctx context.Context
cancelFunc context.CancelFunc
Chan <-chan *T
}
func (c *Cursor[T]) First() *T {
defer c.cancelFunc()
return <-c.Chan
}
func (c *Cursor[T]) Close() {
c.cancelFunc()
}
func (c *Cursor[T]) Next() (*T, bool) {
if c.ctx.Err() != nil {
return nil, false
}
value, ok := <-c.Chan
return value, ok
}
func (c *Cursor[T]) Slice() []T {
s := make([]T, 0)
for value, ok := c.Next(); ok; value, ok = c.Next() {
s = append(s, *value)
}
return s
}