-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpager.go
50 lines (40 loc) · 867 Bytes
/
pager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package algorithms
type FetchPageFunc[T any] func(page *string, size int64) ([]T, *PageInfo, error)
type PageInfo struct {
HasNext bool
After *string
PageSize int64
}
type Pager[T any] struct {
pageInfo *PageInfo
err error
fetchPage FetchPageFunc[T]
}
type PageIter[T any] interface {
NextPage() ([]T, error)
}
func NewPager[T any](pageSize int64, fetchPage FetchPageFunc[T]) *Pager[T] {
p := &Pager[T]{
fetchPage: fetchPage,
}
p.pageInfo = &PageInfo{
HasNext: true,
After: nil,
PageSize: pageSize,
}
return p
}
func (p *Pager[T]) NextPage() ([]T, error) {
var list []T
if !p.pageInfo.HasNext {
return nil, nil
}
list, p.pageInfo, p.err = p.fetchPage(p.pageInfo.After, p.pageInfo.PageSize)
if p.err != nil {
return nil, p.err
}
return list, nil
}
func (p *Pager[T]) HasNext() bool {
return p.pageInfo.HasNext
}