Documentation
¶
Overview ¶
Package xiter provides a set of iterator helpers.
Example (With_numbers) ¶
package main
import (
"fmt"
"slices"
"strconv"
"github.com/siderolabs/gen/xiter"
)
func main() {
numbers := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
oddNumbers := xiter.Filter(xiter.Values(slices.All(numbers)), func(n int) bool { return n%2 == 1 })
evenNumbers := xiter.Filter(xiter.Values(slices.All(numbers)), func(n int) bool { return n%2 == 0 })
fmt.Println("Odd numbers:", xiter.Fold(oddNumbers, 0, func(acc, _ int) int { acc++; return acc }))
fmt.Println("Even numbers:", xiter.Fold(evenNumbers, 0, func(acc, _ int) int { acc++; return acc }))
// Print all odd numbers followed by all even numbers
for v := range xiter.Concat(oddNumbers, evenNumbers) {
fmt.Print(v, ",")
}
fmt.Println()
// Print all odd numbers followed by all even numbers but with text this time
for v := range xiter.Map(
xiter.Concat(oddNumbers, evenNumbers),
func(v int) string { return m[v] },
) {
fmt.Print(v, ",")
}
fmt.Println()
// Convert strings to integers, preserve erros
slc := []string{"1", "2", "3", "NaN"}
for val, err := range xiter.ToSeq2(xiter.Values(slices.All(slc)), strconv.Atoi) {
if err != nil {
fmt.Print(err)
continue
}
fmt.Print(val, ",")
}
fmt.Println()
// Print the positions of prime numbers
primeNumbers := xiter.Filter2(slices.All(numbers), func(_, n int) bool { return isPrime(n) })
fmt.Print("Prime number positions:")
for pos := range xiter.IterKeys(primeNumbers) {
fmt.Print(pos, ",")
}
// Check if two slices are equal using various methods
reverseNumbers := []int{10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
fmt.Println("\nnumbers and rev(reverseNumbers) are equal:", xiter.Equal(
xiter.Values(slices.All(numbers)),
xiter.Values(slices.Backward(reverseNumbers)),
))
fmt.Println("numbers and rev(reverseNumbers) with pos are not equal:", !xiter.Equal2(
slices.All(numbers),
slices.Backward(reverseNumbers),
))
fmt.Println("numbers and reverseNumbers are not equal:", !xiter.Equal(
xiter.Values(slices.All(numbers)),
xiter.Values(slices.All(reverseNumbers)),
))
fmt.Println("numbers and rev(reverseNumbers) are equal:", xiter.EqualFunc(
xiter.ToSeq(slices.All(numbers), func(_, v int) int { return v }),
xiter.ToSeq(slices.Backward(reverseNumbers), func(_, v int) int { return v }),
func(a, b int) bool { return a == b },
))
fmt.Println("numbers and rev(reverseNumbers) with pos dropped are equal:", xiter.EqualFunc2(
slices.All(numbers),
slices.Backward(reverseNumbers),
func(_, a, _, b int) bool { return a == b },
))
fmt.Println("numbers and reverseNumbers are not equal:", !xiter.EqualFunc(
xiter.Values(slices.All(numbers)),
xiter.Values(slices.All(reverseNumbers)),
func(a, b int) bool { return a == b },
))
}
var m = map[int]string{
0: "zero",
1: "one",
2: "two",
3: "three",
4: "four",
5: "five",
6: "six",
7: "seven",
8: "eight",
9: "nine",
10: "ten",
}
func isPrime(n int) bool {
if n < 2 {
return false
}
for i := 2; i*i <= n; i++ {
if n%i == 0 {
return false
}
}
return true
}
Output: Odd numbers: 5 Even numbers: 6 1,3,5,7,9,0,2,4,6,8,10, one,three,five,seven,nine,zero,two,four,six,eight,ten, 1,2,3,strconv.Atoi: parsing "NaN": invalid syntax Prime number positions:2,3,5,7, numbers and rev(reverseNumbers) are equal: true numbers and rev(reverseNumbers) with pos are not equal: true numbers and reverseNumbers are not equal: true numbers and rev(reverseNumbers) are equal: true numbers and rev(reverseNumbers) with pos dropped are equal: true numbers and reverseNumbers are not equal: true
Index ¶
- func Concat[V any](seqs ...iter.Seq[V]) iter.Seq[V]
- func Concat2[K, V any](seqs ...iter.Seq2[K, V]) iter.Seq2[K, V]
- func Equal[V comparable](x, y iter.Seq[V]) bool
- func Equal2[K, V comparable](x, y iter.Seq2[K, V]) bool
- func EqualFunc[V1, V2 any](x iter.Seq[V1], y iter.Seq[V2], f func(V1, V2) bool) bool
- func EqualFunc2[K1, V1, K2, V2 any](x iter.Seq2[K1, V1], y iter.Seq2[K2, V2], f func(K1, V1, K2, V2) bool) bool
- func Filter[V any](seq iter.Seq[V], f func(V) bool) iter.Seq[V]
- func Filter2[K, V any](seq iter.Seq2[K, V], f func(K, V) bool) iter.Seq2[K, V]
- func Fold[V, R any](seq iter.Seq[V], initial R, f func(R, V) R) R
- func Fold2[K, V, R any](seq iter.Seq2[K, V], initial R, f func(R, K, V) R) R
- func IterKeys[K, V any](seq iter.Seq2[K, V]) iter.Seq[K]
- func Map[In, Out any](seq iter.Seq[In], f func(In) Out) iter.Seq[Out]
- func Map2[KIn, VIn, KOut, VOut any](seq iter.Seq2[KIn, VIn], f func(KIn, VIn) (KOut, VOut)) iter.Seq2[KOut, VOut]
- func ToSeq[K, V, R any](seq iter.Seq2[K, V], fn func(K, V) R) iter.Seq[R]
- func ToSeq2[V1, R1, R2 any](seq iter.Seq[V1], fn func(V1) (R1, R2)) iter.Seq2[R1, R2]
- func Values[K, V any](seq iter.Seq2[K, V]) iter.Seq[V]
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Concat2 ¶
Concat2 returns an iterator over the concatenation of the sequences.
Example ¶
package main
import (
"fmt"
"maps"
"strconv"
"github.com/siderolabs/gen/xiter"
)
func main() {
result := xiter.Fold2(
xiter.Map2(
xiter.Concat2(maps.All(numbersAndLetters), maps.All(numbersAndLetters2)),
func(k, v string) (int64, error) {
if v == "number" {
return strconv.ParseInt(k, 10, 64)
}
return 0, nil
},
),
0,
func(acc int, k int64, v error) int {
if v != nil {
fmt.Println("Error:", v)
return acc
}
return acc + int(k)
},
)
fmt.Println(result)
}
var (
numbersAndLetters = map[string]string{
"1": "number",
"2": "number",
"avx": "text",
"3": "number",
"4": "number",
"5": "number",
}
numbersAndLetters2 = map[string]string{
"6": "number",
"7": "number",
"vhx": "text",
"hhh": "text",
"dsss": "ddd",
}
)
Output: 28
func Equal ¶
func Equal[V comparable](x, y iter.Seq[V]) bool
Equal reports whether the two sequences are equal.
func Equal2 ¶
func Equal2[K, V comparable](x, y iter.Seq2[K, V]) bool
Equal2 reports whether the two sequences are equal.
func EqualFunc2 ¶
func EqualFunc2[K1, V1, K2, V2 any](x iter.Seq2[K1, V1], y iter.Seq2[K2, V2], f func(K1, V1, K2, V2) bool) bool
EqualFunc2 reports whether the two sequences are equal according to the function f.
func Map2 ¶
func Map2[KIn, VIn, KOut, VOut any](seq iter.Seq2[KIn, VIn], f func(KIn, VIn) (KOut, VOut)) iter.Seq2[KOut, VOut]
Map2 returns an iterator over f applied to seq.
func ToSeq ¶
ToSeq returns an iterator where each element is the result of applying fn to the elements in seq.
Types ¶
This section is empty.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package xbytes provides additional iterator functions for working with bytes slices.
|
Package xbytes provides additional iterator functions for working with bytes slices. |
|
Package xstrings provides additional iterator functions for working with strings.
|
Package xstrings provides additional iterator functions for working with strings. |
Click to show internal directories.
Click to hide internal directories.