-
Notifications
You must be signed in to change notification settings - Fork 1
/
cycle.go
31 lines (24 loc) · 616 Bytes
/
cycle.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
package ranges
type cycleResult[T any] struct {
start ForwardRange[T]
current ForwardRange[T]
}
func (cr *cycleResult[T]) Empty() bool {
return cr.start.Empty()
}
func (cr *cycleResult[T]) Front() T {
return cr.current.Front()
}
func (cr *cycleResult[T]) PopFront() {
cr.current.PopFront()
if cr.current.Empty() {
cr.current = cr.start.Save()
}
}
func (cr *cycleResult[T]) Save() ForwardRange[T] {
return &cycleResult[T]{cr.start.Save(), cr.current.Save()}
}
// Cycle repeats a ForwardRange infinitely.
func Cycle[T any](r ForwardRange[T]) ForwardRange[T] {
return &cycleResult[T]{r.Save(), r}
}