Documentation
¶
Overview ¶
Package xiter provides a set of iterator helpers.
Example (Single_and_empty) ¶
package main
import (
"fmt"
"github.com/siderolabs/gen/xiter"
)
func main() {
it := xiter.Single(42)
fmt.Println("Found 42 in seq:")
fmt.Println(xiter.Find(func(v int) bool { return v == 42 }, it))
fmt.Println("Found 43 in seq:")
fmt.Println(xiter.Find(func(v int) bool { return v == 43 }, it))
it = xiter.Empty
fmt.Println("Found 42 in seq:")
fmt.Println(xiter.Find(func(v int) bool { return v == 42 }, it))
it2 := xiter.Single2(42, 2012)
fmt.Println("Found 42 and 2012 in seq2:")
fmt.Println(xiter.Find2(func(k, v int) bool { return k == 42 && v == 2012 }, it2))
fmt.Println("Found 43 and 2012 in seq2:")
fmt.Println(xiter.Find2(func(k, v int) bool { return k == 43 && v == 2012 }, it2))
it2 = xiter.Empty2
fmt.Println("Found 42 and 2012 in seq2:")
fmt.Println(xiter.Find2(func(k, v int) bool { return k == 42 && v == 2012 }, it2))
}
Output: Found 42 in seq: 42 true Found 43 in seq: 0 false Found 42 in seq: 0 false Found 42 and 2012 in seq2: 42 2012 true Found 43 and 2012 in seq2: 0 0 false Found 42 and 2012 in seq2: 0 0 false
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(func(n int) bool { return n%2 == 1 }, xiter.Values(slices.All(numbers)))
evenNumbers := xiter.Filter(func(n int) bool { return n%2 == 0 }, xiter.Values(slices.All(numbers)))
fmt.Println("Odd numbers:", xiter.Reduce(func(acc, _ int) int { acc++; return acc }, 0, oddNumbers))
fmt.Println("Even numbers:", xiter.Reduce(func(acc, _ int) int { acc++; return acc }, 0, evenNumbers))
// 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(
func(v int) string { return m[v] },
xiter.Concat(oddNumbers, evenNumbers),
) {
fmt.Print(v, ",")
}
fmt.Println()
// Convert strings to integers, preserve erros
slc := []string{"1", "2", "3", "NaN"}
for val, err := range xiter.ToSeq2(strconv.Atoi, xiter.Values(slices.All(slc))) {
if err != nil {
fmt.Print(err)
continue
}
fmt.Print(val, ",")
}
fmt.Println()
// Print the positions of prime numbers
primeNumbers := xiter.Filter2(func(_, n int) bool { return isPrime(n) }, slices.All(numbers))
fmt.Print("Prime number positions:")
for pos := range xiter.Keys(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 numbers with pos should be equal:", xiter.Equal2(
slices.All(numbers),
slices.All(numbers),
))
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(
func(a, b int) bool { return a == b },
xiter.ToSeq(func(_, v int) int { return v }, slices.All(numbers)),
xiter.ToSeq(func(_, v int) int { return v }, slices.Backward(reverseNumbers)),
))
fmt.Println("numbers and rev(reverseNumbers) with pos dropped are equal:", xiter.EqualFunc2(
func(_, a, _, b int) bool { return a == b },
slices.All(numbers),
slices.Backward(reverseNumbers),
))
fmt.Println("numbers and reverseNumbers are not equal:", !xiter.EqualFunc(
func(a, b int) bool { return a == b },
xiter.Values(slices.All(numbers)),
xiter.Values(slices.All(reverseNumbers)),
))
}
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 numbers with pos should be 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 Empty[V any](func(V) bool)
- func Empty2[V, V2 any](func(V, V2) bool)
- 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](f func(V1, V2) bool, x iter.Seq[V1], y iter.Seq[V2]) bool
- func EqualFunc2[K1, V1, K2, V2 any](f func(K1, V1, K2, V2) bool, x iter.Seq2[K1, V1], y iter.Seq2[K2, V2]) bool
- func Filter[V any](f func(V) bool, seq iter.Seq[V]) iter.Seq[V]
- func Filter2[K, V any](f func(K, V) bool, seq iter.Seq2[K, V]) iter.Seq2[K, V]
- func Find[V any](f func(V) bool, seq iter.Seq[V]) (V, bool)
- func Find2[K, V any](f func(K, V) bool, seq iter.Seq2[K, V]) (K, V, bool)
- func Keys[K, V any](seq iter.Seq2[K, V]) iter.Seq[K]
- func Map[In, Out any](f func(In) Out, seq iter.Seq[In]) iter.Seq[Out]
- func Map2[KIn, VIn, KOut, VOut any](f func(KIn, VIn) (KOut, VOut), seq iter.Seq2[KIn, VIn]) iter.Seq2[KOut, VOut]
- func Reduce[V, R any](f func(R, V) R, sum R, seq iter.Seq[V]) R
- func Reduce2[K, V, R any](f func(R, K, V) R, sum R, seq iter.Seq2[K, V]) R
- func Single[V any](v V) iter.Seq[V]
- func Single2[K, V any](k K, v V) iter.Seq2[K, V]
- func ToSeq[K, V, R any](fn func(K, V) R, seq iter.Seq2[K, V]) iter.Seq[R]
- func ToSeq2[V1, R1, R2 any](fn func(V1) (R1, R2), seq iter.Seq[V1]) 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.Reduce2(
func(acc int, k int64, v error) int {
if v != nil {
fmt.Println("Error:", v)
return acc
}
return acc + int(k)
},
0,
xiter.Map2(
func(k, v string) (int64, error) {
if v == "number" {
return strconv.ParseInt(k, 10, 64)
}
return 0, nil
},
xiter.Concat2(maps.All(numbersAndLetters), maps.All(numbersAndLetters2)),
),
)
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](f func(K1, V1, K2, V2) bool, x iter.Seq2[K1, V1], y iter.Seq2[K2, V2]) bool
EqualFunc2 reports whether the two sequences are equal according to the function f.
func Map2 ¶
func Map2[KIn, VIn, KOut, VOut any](f func(KIn, VIn) (KOut, VOut), seq iter.Seq2[KIn, VIn]) iter.Seq2[KOut, VOut]
Map2 returns an iterator over f applied to seq.
func Reduce ¶ added in v0.7.0
Reduce applies f to the elements in seq, starting with the initial value.
func Reduce2 ¶ added in v0.7.0
Reduce2 applies f to the elements in seq, starting with the initial value.
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.