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 }