Source file
src/slices/iter.go
1
2
3
4
5 package slices
6
7 import (
8 "cmp"
9 "iter"
10 )
11
12
13
14 func All[Slice ~[]E, E any](s Slice) iter.Seq2[int, E] {
15 return func(yield func(int, E) bool) {
16 for i, v := range s {
17 if !yield(i, v) {
18 return
19 }
20 }
21 }
22 }
23
24
25
26 func Backward[Slice ~[]E, E any](s Slice) iter.Seq2[int, E] {
27 return func(yield func(int, E) bool) {
28 for i := len(s) - 1; i >= 0; i-- {
29 if !yield(i, s[i]) {
30 return
31 }
32 }
33 }
34 }
35
36
37
38 func Values[Slice ~[]E, E any](s Slice) iter.Seq[E] {
39 return func(yield func(E) bool) {
40 for _, v := range s {
41 if !yield(v) {
42 return
43 }
44 }
45 }
46 }
47
48
49
50 func AppendSeq[Slice ~[]E, E any](s Slice, seq iter.Seq[E]) Slice {
51 for v := range seq {
52 s = append(s, v)
53 }
54 return s
55 }
56
57
58 func Collect[E any](seq iter.Seq[E]) []E {
59 return AppendSeq([]E(nil), seq)
60 }
61
62
63
64 func Sorted[E cmp.Ordered](seq iter.Seq[E]) []E {
65 s := Collect(seq)
66 Sort(s)
67 return s
68 }
69
70
71
72 func SortedFunc[E any](seq iter.Seq[E], cmp func(E, E) int) []E {
73 s := Collect(seq)
74 SortFunc(s, cmp)
75 return s
76 }
77
78
79
80
81
82 func SortedStableFunc[E any](seq iter.Seq[E], cmp func(E, E) int) []E {
83 s := Collect(seq)
84 SortStableFunc(s, cmp)
85 return s
86 }
87
88
89
90
91
92
93 func Chunk[Slice ~[]E, E any](s Slice, n int) iter.Seq[Slice] {
94 if n < 1 {
95 panic("cannot be less than 1")
96 }
97
98 return func(yield func(Slice) bool) {
99 for i := 0; i < len(s); i += n {
100
101 end := min(n, len(s[i:]))
102
103
104
105 if !yield(s[i : i+end : i+end]) {
106 return
107 }
108 }
109 }
110 }
111
View as plain text