anilist/cursor.go
2022-02-06 10:39:04 +01:00

32 lines
500 B
Go

package anilist
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]) Next() (*T, bool) {
if c.ctx.Err() == nil {
value, ok := <-c.Chan
return value, ok
}
return nil, false
}
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
}