Documentation
¶
Overview ¶
Package seq2 provides a comprehensive set of utilities for working with key-value sequences in Go applications.
The goal of this package is to offer a rich set of functions for creating, transforming, and consuming iter.Seq2, enabling developers to work with collections of key-value pairs in a functional programming style. The package includes utilities for filtering, mapping, reducing, and sorting sequences, as well as combining and partitioning them.
The package is designed to reduce boilerplate code and improve readability by providing a consistent API for common sequence operations. It leverages Go's type safety and generics to ensure that operations on sequences are both flexible and safe. The Sequence struct is worth mentioning explicitly, allowing method chaining and fluent composition of sequence operations.
Index ¶
- func Append[K any, V any](seq iter.Seq2[K, V], key K, value V) iter.Seq2[K, V]
- func Collect[K comparable, V any](seq iter.Seq2[K, V]) map[K]V
- func Concat[K any, V any](sequences ...iter.Seq2[K, V]) iter.Seq2[K, V]
- func Contains[K comparable, V any](seq iter.Seq2[K, V], key K) bool
- func ContainsAll[K comparable, V any](seq iter.Seq2[K, V], keys ...K) bool
- func ContainsAllValues[K any, V comparable](seq iter.Seq2[K, V], values ...V) bool
- func ContainsPair[K comparable, V comparable](seq iter.Seq2[K, V], key K, value V) bool
- func ContainsValue[K any, V comparable](seq iter.Seq2[K, V], value V) bool
- func Count[K any, V any](seq iter.Seq2[K, V]) int
- func Cycle[K, V any](seq iter.Seq2[K, V], count int) iter.Seq2[K, V]
- func Distinct[K comparable, V comparable](seq iter.Seq2[K, V]) iter.Seq2[K, V]
- func DistinctKeys[K comparable, V any](seq iter.Seq2[K, V]) iter.Seq2[K, V]
- func Each[K any, V any](seq iter.Seq2[K, V], consumer Consumer[K, V]) iter.Seq2[K, V]
- func Empty[K, V any]() iter.Seq2[K, V]
- func Every[K, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) bool
- func Exists[K, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) bool
- func Filter[K any, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) iter.Seq2[K, V]
- func FilterByKey[K any, V any](seq iter.Seq2[K, V], predicate KeyPredicate[K]) iter.Seq2[K, V]
- func FilterByValue[K any, V any](seq iter.Seq2[K, V], predicate ValuePredicate[V]) iter.Seq2[K, V]
- func Find[K, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) (optional.Elem[K], optional.Elem[V])
- func FindAll[K, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) iter.Seq2[K, V]
- func FindByKey[K, V any](seq iter.Seq2[K, V], predicate KeyPredicate[K]) (optional.Elem[K], optional.Elem[V])
- func FindByValue[K, V any](seq iter.Seq2[K, V], predicate ValuePredicate[V]) (optional.Elem[K], optional.Elem[V])
- func FindLast[K, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) (optional.Elem[K], optional.Elem[V])
- func Flush[K any, V any](seq iter.Seq2[K, V])
- func FoldKeys[K any, V any](seq2 iter.Seq2[K, V], accumulator func(agg K, key K, value V) K) optional.Elem[K]
- func FoldKeysRight[K any, V any](seq2 iter.Seq2[K, V], accumulator func(agg K, key K, value V) K) optional.Elem[K]
- func FoldValues[K any, V any](seq2 iter.Seq2[K, V], accumulator func(agg V, key K, value V) V) optional.Elem[V]
- func FoldValuesRight[K any, V any](seq2 iter.Seq2[K, V], accumulator func(agg V, key K, value V) V) optional.Elem[V]
- func ForEach[K any, V any](seq iter.Seq2[K, V], consumer Consumer[K, V])
- func FromMap[Map ~map[K]V, K comparable, V any](m Map) iter.Seq2[K, V]
- func FromSlice[Slice ~[]E, E any](slice Slice) iter.Seq2[int, E]
- func Get[K comparable, V any](seq iter.Seq2[K, V], key K) optional.Elem[V]
- func IsEmpty[K, V any](seq iter.Seq2[K, V]) bool
- func IsNotEmpty[K, V any](seq iter.Seq2[K, V]) bool
- func Keys[K, V any](seq iter.Seq2[K, V]) iter.Seq[K]
- func Limit[K any, V any](seq iter.Seq2[K, V], n int) iter.Seq2[K, V]
- func Map[K, V, RV any](seq iter.Seq2[K, V], mapper Mapper[K, V, RV]) iter.Seq2[K, RV]
- func MapKeys[K, V, RK any](seq iter.Seq2[K, V], mapper KeyMapper[K, RK]) iter.Seq2[RK, V]
- func MapPairs[K, V, RK, RV any](seq iter.Seq2[K, V], mapper DoubleMapper[K, V, RK, RV]) iter.Seq2[RK, RV]
- func MapTo[K, V, RV any](seq iter.Seq2[K, V], mapper Mapper[K, V, RV]) iter.Seq[RV]
- func MapToValues[K, V, RV any](seq iter.Seq2[K, V], mapper ValueMapper[V, RV]) iter.Seq[RV]
- func MapValues[K, V, RV any](seq iter.Seq2[K, V], mapper ValueMapper[V, RV]) iter.Seq2[K, RV]
- func MaxKey[K types.Ordered, V any](seq2 iter.Seq2[K, V]) optional.Elem[K]
- func MaxValue[K any, V types.Ordered](seq2 iter.Seq2[K, V]) optional.Elem[V]
- func MinKey[K types.Ordered, V any](seq2 iter.Seq2[K, V]) optional.Elem[K]
- func MinValue[K any, V types.Ordered](seq2 iter.Seq2[K, V]) optional.Elem[V]
- func Narrow[K, V, RV any](seq iter.Seq2[K, V], mapper Mapper[K, V, RV]) iter.Seq[RV]
- func None[K, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) bool
- func NotContains[K comparable, V any](seq iter.Seq2[K, V], key K) bool
- func NotContainsPair[K comparable, V comparable](seq iter.Seq2[K, V], key K, value V) bool
- func NotContainsValue[K any, V comparable](seq iter.Seq2[K, V], value V) bool
- func Of[E any](elems ...E) iter.Seq2[int, E]
- func Offset[K any, V any](seq iter.Seq2[K, V], n int) iter.Seq2[K, V]
- func Pair[K, V any](k K, v V) iter.Seq2[K, V]
- func Prepend[K any, V any](seq iter.Seq2[K, V], key K, value V) iter.Seq2[K, V]
- func Reduce[K any, V any, R any](seq2 iter.Seq2[K, V], accumulator func(agg R, key K, value V) R, initial R) R
- func ReduceRight[K any, V any, R any](seq2 iter.Seq2[K, V], accumulator func(agg R, key K, value V) R, initial R) R
- func Repeat[K any, V any](key K, value V, count int) iter.Seq2[K, V]
- func Reverse[K, V any](seq iter.Seq2[K, V]) iter.Seq2[K, V]
- func Skip[K any, V any](seq iter.Seq2[K, V], n int) iter.Seq2[K, V]
- func SkipUntil[K any, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) iter.Seq2[K, V]
- func SkipWhile[K any, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) iter.Seq2[K, V]
- func Sort[K types.Ordered, V any](seq iter.Seq2[K, V]) iter.Seq2[K, V]
- func SortBy[K any, V any, R types.Ordered](seq iter.Seq2[K, V], mapper func(K, V) R) iter.Seq2[K, V]
- func SortComparingKeys[K any, V any](seq iter.Seq2[K, V], cmp func(K, K) int) iter.Seq2[K, V]
- func SortComparingValues[K any, V any](seq iter.Seq2[K, V], cmp func(V, V) int) iter.Seq2[K, V]
- func Split[K any, V any](seq iter.Seq2[K, V]) (iter.Seq[K], iter.Seq[V])
- func Take[K any, V any](seq iter.Seq2[K, V], n int) iter.Seq2[K, V]
- func TakeUntil[K any, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) iter.Seq2[K, V]
- func TakeWhile[K any, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) iter.Seq2[K, V]
- func Tap[K any, V any](seq iter.Seq2[K, V], consumer Consumer[K, V]) iter.Seq2[K, V]
- func Tick(d time.Duration) iter.Seq2[int, time.Time]
- func ToMap[Map ~map[K]V, K comparable, V any](seq iter.Seq2[K, V], m Map)
- func UnZip[K any, V any](seq iter.Seq2[K, V]) (iter.Seq[K], iter.Seq[V])
- func Union[K comparable, V comparable](seq1 iter.Seq2[K, V], seq2 iter.Seq2[K, V]) iter.Seq2[K, V]
- func UnionAll[K any, V any](seq1 iter.Seq2[K, V], seq2 iter.Seq2[K, V]) iter.Seq2[K, V]
- func Uniq[K comparable, V comparable](seq iter.Seq2[K, V]) iter.Seq2[K, V]
- func UniqBy[K any, V any, K2 comparable](seq iter.Seq2[K, V], mapper Mapper[K, V, K2]) iter.Seq2[K, V]
- func UniqByKeys[K any, V any, K2 comparable](seq iter.Seq2[K, V], mapper KeyMapper[K, K2]) iter.Seq2[K, V]
- func UniqByValues[K any, V any, V2 comparable](seq iter.Seq2[K, V], mapper ValueMapper[V, V2]) iter.Seq2[K, V]
- func UniqKeys[K comparable, V any](seq iter.Seq2[K, V]) iter.Seq2[K, V]
- func UniqValues[K any, V comparable](seq iter.Seq2[K, V]) iter.Seq2[K, V]
- func Values[K, V any](seq iter.Seq2[K, V]) iter.Seq[V]
- func Where[K any, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) iter.Seq2[K, V]
- func WithIndex[E any](seq iter.Seq[E]) iter.Seq2[int, E]
- func WithoutIndex[E any](indexed iter.Seq2[int, E]) iter.Seq[E]
- type Consumer
- type DoubleMapper
- type KeyMapper
- type KeyPredicate
- type Mapper
- type Predicate
- type Sequence
- func (s Sequence[K, V]) Append(key K, value V) Sequence[K, V]
- func (s Sequence[K, V]) Collect() map[K]V
- func (s Sequence[K, V]) Contains(key K) bool
- func (s Sequence[K, V]) ContainsPair(key K, value V) bool
- func (s Sequence[K, V]) ContainsValue(value V) bool
- func (s Sequence[K, V]) Count() int
- func (s Sequence[K, V]) Cycle(count int) Sequence[K, V]
- func (s Sequence[K, V]) Distinct() Sequence[K, V]
- func (s Sequence[K, V]) Each(consumer Consumer[K, V]) Sequence[K, V]
- func (s Sequence[K, V]) Every(predicate Predicate[K, V]) bool
- func (s Sequence[K, V]) Exists(predicate Predicate[K, V]) bool
- func (s Sequence[K, V]) Filter(predicate Predicate[K, V]) Sequence[K, V]
- func (s Sequence[K, V]) FilterByKey(predicate KeyPredicate[K]) Sequence[K, V]
- func (s Sequence[K, V]) FilterByValue(predicate ValuePredicate[V]) Sequence[K, V]
- func (s Sequence[K, V]) Find(predicate Predicate[K, V]) (optional.Elem[K], optional.Elem[V])
- func (s Sequence[K, V]) FindAll(predicate Predicate[K, V]) Sequence[K, V]
- func (s Sequence[K, V]) FindLast(predicate Predicate[K, V]) (optional.Elem[K], optional.Elem[V])
- func (s Sequence[K, V]) Flush()
- func (s Sequence[K, V]) FoldValues(accumulator func(agg V, key K, value V) V) optional.Elem[V]
- func (s Sequence[K, V]) FoldValuesRight(accumulator func(agg V, key K, value V) V) optional.Elem[V]
- func (s Sequence[K, V]) ForEach(consumer Consumer[K, V])
- func (s Sequence[K, V]) Get(key K) optional.Elem[V]
- func (s Sequence[K, V]) IsEmpty() bool
- func (s Sequence[K, V]) IsNotEmpty() bool
- func (s Sequence[K, V]) Keys() iter.Seq[K]
- func (s Sequence[K, V]) Limit(n int) Sequence[K, V]
- func (s Sequence[K, V]) None(predicate Predicate[K, V]) bool
- func (s Sequence[K, V]) NotContains(key K) bool
- func (s Sequence[K, V]) NotContainsPair(key K, value V) bool
- func (s Sequence[K, V]) NotContainsValue(value V) bool
- func (s Sequence[K, V]) Offset(n int) Sequence[K, V]
- func (s Sequence[K, V]) Prepend(key K, value V) Sequence[K, V]
- func (s Sequence[K, V]) Repeat(count int) Sequence[K, V]
- func (s Sequence[K, V]) Reverse() Sequence[K, V]
- func (s Sequence[K, V]) Skip(n int) Sequence[K, V]
- func (s Sequence[K, V]) SortComparingKeys(compare func(K, K) int) Sequence[K, V]
- func (s Sequence[K, V]) SortComparingValues(compare func(V, V) int) Sequence[K, V]
- func (s Sequence[K, V]) Take(n int) Sequence[K, V]
- func (s Sequence[K, V]) Tap(consumer Consumer[K, V]) Sequence[K, V]
- func (s Sequence[K, V]) ToMap(m map[K]V)
- func (s Sequence[K, V]) Union(other Sequence[K, V]) Sequence[K, V]
- func (s Sequence[K, V]) UnionAll(other Sequence[K, V]) Sequence[K, V]
- func (s Sequence[K, V]) Uniq() Sequence[K, V]
- func (s Sequence[K, V]) UniqKeys() Sequence[K, V]
- func (s Sequence[K, V]) UniqValues() Sequence[K, V]
- func (s Sequence[K, V]) Values() iter.Seq[V]
- func (s Sequence[K, V]) Where(predicate Predicate[K, V]) Sequence[K, V]
- type ValueMapper
- type ValuePredicate
Examples ¶
- Append
- AsSequence
- Collect
- Concat
- ConcatSequences
- Contains
- ContainsAll
- ContainsAllValues
- ContainsPair
- ContainsValue
- Count
- Cycle
- Distinct
- DistinctKeys
- Each
- Empty
- Every
- Exists
- Filter
- FilterByKey
- FilterByValue
- Find
- FindAll
- FindByKey
- FindByValue
- FindLast
- Flush
- FoldKeys
- FoldKeysRight
- FoldValues
- FoldValuesRight
- ForEach
- FromSlice
- Get
- IsEmpty
- IsNotEmpty
- Keys
- Limit
- Map
- MapKeys
- MapPairs
- MapTo
- MapToValues
- MapValues
- MaxKey
- MaxValue
- MinKey
- MinValue
- Narrow
- None
- NotContains
- NotContainsPair
- NotContainsValue
- Of
- Offset
- Pair
- Prepend
- Reduce
- ReduceRight
- Repeat
- Reverse
- Sequence.Append
- Sequence.Contains
- Sequence.ContainsPair
- Sequence.ContainsValue
- Sequence.Cycle
- Sequence.Every
- Sequence.Exists
- Sequence.Filter
- Sequence.FilterByKey
- Sequence.FilterByValue
- Sequence.Find
- Sequence.FoldValues
- Sequence.ForEach
- Sequence.Get
- Sequence.Keys
- Sequence.Prepend
- Sequence.Reverse
- Sequence.Skip
- Sequence.Take
- Sequence.Tap
- Sequence.Union
- Sequence.UnionAll
- Sequence.Uniq
- Sequence.Values
- Skip
- SkipUntil
- SkipWhile
- Sort
- SortBy
- SortComparingKeys
- SortComparingValues
- Split
- Take
- TakeUntil
- TakeWhile
- Tap
- Tick
- ToMap
- UnZip
- UnZip (AfterZip)
- Union
- UnionAll
- Uniq
- UniqBy
- UniqByKeys
- UniqByValues
- UniqKeys
- UniqValues
- Values
- Where
- WithIndex
- WithoutIndex
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Append ¶
Append appends element to the end of a sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2})
input = seq2.Sort(input)
// Append a new key-value pair to the sequence
appended := seq2.Append(input, "c", 3)
result := seq2.Collect(appended)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3]
func Collect ¶
func Collect[K comparable, V any](seq iter.Seq2[K, V]) map[K]V
Collect collects the elements of the given sequence into a map.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
result := seq2.Collect(input)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3]
func Concat ¶
Concat concatenates multiple sequences into a single sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
first := seq2.FromMap(map[string]int{"a": 1, "b": 2})
first = seq2.Sort(first)
second := seq2.FromMap(map[string]int{"c": 3, "d": 4})
second = seq2.Sort(second)
// Concatenate two sequences
combined := seq2.Concat(first, second)
result := seq2.Collect(combined)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3 d:4]
func Contains ¶
func Contains[K comparable, V any](seq iter.Seq2[K, V], key K) bool
Contains returns true if the key is in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
contains := seq2.Contains(input, "b")
fmt.Println(contains)
}
Output: true
func ContainsAll ¶
func ContainsAll[K comparable, V any](seq iter.Seq2[K, V], keys ...K) bool
ContainsAll returns true if all keys are in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
containsAll := seq2.ContainsAll(input, "a", "c", "d")
fmt.Println(containsAll)
}
Output: true
func ContainsAllValues ¶
func ContainsAllValues[K any, V comparable](seq iter.Seq2[K, V], values ...V) bool
ContainsAllValues returns true if all values are in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
containsAllValues := seq2.ContainsAllValues(input, 1, 3)
fmt.Println(containsAllValues)
}
Output: true
func ContainsPair ¶
func ContainsPair[K comparable, V comparable](seq iter.Seq2[K, V], key K, value V) bool
ContainsPair returns true if the key-value pair is in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
containsPair := seq2.ContainsPair(input, "b", 2)
fmt.Println(containsPair)
}
Output: true
func ContainsValue ¶
func ContainsValue[K any, V comparable](seq iter.Seq2[K, V], value V) bool
ContainsValue returns true if the value is in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
containsValue := seq2.ContainsValue(input, 3)
fmt.Println(containsValue)
}
Output: true
func Count ¶
Count returns the number of elements in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Count returns the number of elements in the sequence
count := seq2.Count(input)
fmt.Println(count)
}
Output: 3
func Cycle ¶
Cycle repeats the sequence count times.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2})
input = seq2.Sort(input)
// Repeat the sequence 2 times
cycled := seq2.Cycle(input, 2)
seq2.ForEach(cycled, func(k string, v int) {
fmt.Println(k, v)
})
}
Output: a 1 b 2 a 1 b 2
func Distinct ¶
func Distinct[K comparable, V comparable](seq iter.Seq2[K, V]) iter.Seq2[K, V]
Distinct returns a new sequence that contains only the unique elements of the given sequence. SQL-like alias for Uniq.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence with duplicate key-value pairs
input := seq2.Concat(
seq2.FromMap(map[string]int{"a": 1, "b": 2}),
seq2.FromMap(map[string]int{"a": 1, "c": 3}),
)
// Distinct is an alias for Uniq
unique := seq2.Distinct(input)
result := seq2.Collect(unique)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3]
func DistinctKeys ¶
DistinctKeys returns a new sequence that contains only the unique keys of the given sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence with duplicate keys
input := seq2.Concat(
seq2.FromMap(map[string]int{"a": 1, "b": 2}),
seq2.FromMap(map[string]int{"a": 3, "c": 4}),
)
// DistinctKeys is an alias for UniqKeys
unique := seq2.DistinctKeys(input)
result := seq2.Collect(unique)
fmt.Println(result)
}
Output: map[a:1 b:2 c:4]
func Each ¶
Each is an alias for Tap.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
tapped := seq2.Each(input, func(k string, v int) {
fmt.Printf("Each: %s -> %d\n", k, v)
})
seq2.Flush(tapped)
}
Output: Each: a -> 1 Each: b -> 2 Each: c -> 3
func Empty ¶
Empty returns an empty sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create an empty sequence
empty := seq2.Empty[any, any]()
seq2.ForEach(empty, func(any, any) {
fmt.Println("Should not be called")
})
}
func Every ¶
Every returns true if all elements satisfy the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 2, "b": 4, "c": 6, "d": 8})
input = seq2.Sort(input)
every := seq2.Every(input, func(k string, v int) bool {
return v%2 == 0
})
fmt.Println(every)
}
Output: true
func Exists ¶
Exists returns true if there is at least one element that satisfies the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
exists := seq2.Exists(input, func(k string, v int) bool {
return k > "c" && v > 3
})
fmt.Println(exists)
}
Output: true
func Filter ¶
Filter returns a new sequence that contains only the elements that satisfy the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
// Filter elements where the value is even
filtered := seq2.Filter(input, func(k string, v int) bool {
return v%2 == 0
})
result := seq2.Collect(filtered)
fmt.Println(result)
}
Output: map[b:2 d:4]
func FilterByKey ¶
FilterByKey returns a new sequence that contains only the elements that satisfy the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
// Filter elements by key
filtered := seq2.FilterByKey(input, func(k string) bool {
return k > "b"
})
result := seq2.Collect(filtered)
fmt.Println(result)
}
Output: map[c:3 d:4]
func FilterByValue ¶
FilterByValue returns a new sequence that contains only the elements that satisfy the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
// Filter elements by value
filtered := seq2.FilterByValue(input, func(v int) bool {
return v <= 2
})
result := seq2.Collect(filtered)
fmt.Println(result)
}
Output: map[a:1 b:2]
func Find ¶
func Find[K, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) (optional.Elem[K], optional.Elem[V])
Find returns the first element that satisfies the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
k, v := seq2.Find(input, func(k string, v int) bool {
return v > 2
})
fmt.Printf("Key: %s, Value: %d\n", k.MustGet(), v.MustGet())
}
Output: Key: c, Value: 3
func FindAll ¶
FindAll returns all elements that satisfy the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
found := seq2.FindAll(input, func(k string, v int) bool {
return v > 2
})
result := seq2.Collect(found)
fmt.Println(result)
}
Output: map[c:3 d:4]
func FindByKey ¶
func FindByKey[K, V any](seq iter.Seq2[K, V], predicate KeyPredicate[K]) (optional.Elem[K], optional.Elem[V])
FindByKey returns the first element that satisfies the predicate.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
k, v := seq2.FindByKey(input, func(k string) bool {
return strings.ToUpper(k) == "B"
})
fmt.Printf("Key: %s, Value: %d\n", k.MustGet(), v.MustGet())
}
Output: Key: b, Value: 2
func FindByValue ¶
func FindByValue[K, V any](seq iter.Seq2[K, V], predicate ValuePredicate[V]) (optional.Elem[K], optional.Elem[V])
FindByValue returns the first element that satisfies the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
k, v := seq2.FindByValue(input, func(v int) bool {
return v%4 == 0
})
fmt.Printf("Key: %s, Value: %d\n", k.MustGet(), v.MustGet())
}
Output: Key: d, Value: 4
func FindLast ¶
func FindLast[K, V any](seq iter.Seq2[K, V], predicate Predicate[K, V]) (optional.Elem[K], optional.Elem[V])
FindLast returns the last element that satisfies the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
k, v := seq2.FindLast(input, func(k string, v int) bool {
return v > 2
})
fmt.Printf("Key: %s, Value: %d\n", k.MustGet(), v.MustGet())
}
Output: Key: d, Value: 4
func Flush ¶
Flush consumes all elements of the input sequence.
Example ¶
package main
import (
"fmt"
"iter"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence that has side effects when consumed
sideEffects := iter.Seq2[string, int](func(yield func(string, int) bool) {
fmt.Println("First element consumed")
if !yield("a", 1) {
return
}
fmt.Println("Second element consumed")
if !yield("b", 2) {
return
}
fmt.Println("Third element consumed")
if !yield("c", 3) {
return
}
})
// Flush consumes all elements without doing anything with them
seq2.Flush(sideEffects)
}
Output: First element consumed Second element consumed Third element consumed
func FoldKeys ¶
func FoldKeys[K any, V any](seq2 iter.Seq2[K, V], accumulator func(agg K, key K, value V) K) optional.Elem[K]
FoldKeys applies a function against an accumulator and each element in the sequence (from left to right) to reduce it to a single value. Notice: first value will be omitted and the first key will be used as initial value.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// FoldKeys concatenates all keys starting with the first key
result := seq2.FoldKeys(input, func(agg string, key string, value int) string {
return agg + key
})
fmt.Println(result.MustGet())
}
Output: abc
func FoldKeysRight ¶
func FoldKeysRight[K any, V any](seq2 iter.Seq2[K, V], accumulator func(agg K, key K, value V) K) optional.Elem[K]
FoldKeysRight applies a function against an accumulator and each element in the sequence (from right to left) to reduce it to a single value. Notice: last value will be omitted and the last key will be used as initial value.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// FoldKeysRight concatenates all keys starting from the right
result := seq2.FoldKeysRight(input, func(agg string, key string, value int) string {
return agg + key
})
fmt.Println(result.MustGet())
}
Output: cba
func FoldValues ¶
func FoldValues[K any, V any](seq2 iter.Seq2[K, V], accumulator func(agg V, key K, value V) V) optional.Elem[V]
FoldValues applies a function against an accumulator and each element in the sequence (from left to right) to reduce it to a single value. Notice: first key will be omitted and the first value will be used as initial value.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// FoldValues to calculate the product of all values
product := seq2.FoldValues(input, func(agg int, key string, value int) int {
return agg * value
})
fmt.Println(product.MustGet())
}
Output: 6
func FoldValuesRight ¶
func FoldValuesRight[K any, V any](seq2 iter.Seq2[K, V], accumulator func(agg V, key K, value V) V) optional.Elem[V]
FoldValuesRight applies a function against an accumulator and each element in the sequence (from right to left) to reduce it to a single value. Notice: last key will be omitted and the last value will be used as initial value.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 3, "b": 5, "c": 10})
input = seq2.Sort(input)
// FoldValuesRight performs right-to-left division
result := seq2.FoldValuesRight(input, func(agg int, key string, value int) int {
return agg - value
})
fmt.Println(result.MustGet())
}
Output: 2
func ForEach ¶
ForEach applies consumer to each element of the input sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Of("a", "b", "c")
// ForEach consumes the sequence and applies the function
seq2.ForEach(input, func(k int, v string) {
fmt.Printf("%d: %s\n", k, v)
})
}
Output: 0: a 1: b 2: c
func FromMap ¶
func FromMap[Map ~map[K]V, K comparable, V any](m Map) iter.Seq2[K, V]
FromMap creates a new iter.Seq2 from the given map.
func FromSlice ¶
FromSlice creates a new sequence from the given slice with index as keys.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence from a slice
slice := []string{"a", "b", "c"}
sequence := seq2.FromSlice(slice)
result := seq2.Collect(sequence)
fmt.Println(result)
}
Output: map[0:a 1:b 2:c]
func Get ¶
Get returns the element at the specified key.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
value := seq2.Get(input, "c")
fmt.Println(value.MustGet())
}
Output: 3
func IsEmpty ¶
IsEmpty returns true if the sequence is empty.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
emptySeq := seq2.Empty[any, any]()
nonEmptySeq := seq2.Of("a")
fmt.Printf("Empty sequence: %v\n", seq2.IsEmpty(emptySeq))
fmt.Printf("Non-empty sequence: %v\n", seq2.IsEmpty(nonEmptySeq))
}
Output: Empty sequence: true Non-empty sequence: false
func IsNotEmpty ¶
IsNotEmpty returns true if the sequence is not empty.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
emptySeq := seq2.Empty[any, any]()
nonEmptySeq := seq2.Of("a")
fmt.Printf("Empty sequence: %v\n", seq2.IsNotEmpty(emptySeq))
fmt.Printf("Non-empty sequence: %v\n", seq2.IsNotEmpty(nonEmptySeq))
}
Output: Empty sequence: false Non-empty sequence: true
func Keys ¶
Keys returns a sequence of keys from a sequence of key-value pairs.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Of("a", "b", "c")
keys := seq2.Keys(input)
seq.ForEach(keys, func(k int) {
fmt.Print(k, " ")
})
}
Output: 0 1 2
func Limit ¶
Limit returns a new sequence that contains only the first n elements of the given sequence. SQL-like alias for Take.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
// Limit is an alias for Take
taken := seq2.Limit(input, 3)
result := seq2.Collect(taken)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3]
func Map ¶
Map applies a mapper function to each value of the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Map both key and value to produce a new value (keeps original keys)
mapped := seq2.Map(input, func(k string, v int) string {
return fmt.Sprintf("Value of %s is %d", k, v)
})
result := seq2.Collect(mapped)
fmt.Println(result)
}
Output: map[a:Value of a is 1 b:Value of b is 2 c:Value of c is 3]
func MapKeys ¶
MapKeys applies a mapper function to each key of the sequence.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Map keys to uppercase (keeps original values)
mapped := seq2.MapKeys(input, func(k string) string {
return strings.ToUpper(k)
})
result := seq2.Collect(mapped)
fmt.Println(result)
}
Output: map[A:1 B:2 C:3]
func MapPairs ¶
func MapPairs[K, V, RK, RV any](seq iter.Seq2[K, V], mapper DoubleMapper[K, V, RK, RV]) iter.Seq2[RK, RV]
MapPairs applies a mapper function to each element of the sequence.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Map keys to uppercase and multiply values by 10
mapped := seq2.MapPairs(input, func(k string, v int) (string, int) {
return strings.ToUpper(k), v * 10
})
result := seq2.Collect(mapped)
fmt.Println(result)
}
Output: map[A:10 B:20 C:30]
func MapTo ¶
MapTo applies a mapper function to each element of the sequence and returns a sequence of mapper results.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Map each key-value pair to a string
mapped := seq2.MapTo(input, func(k string, v int) string {
return fmt.Sprintf("%s=%d", k, v)
})
seq.ForEach(mapped, func(v string) {
fmt.Println(v)
})
}
Output: a=1 b=2 c=3
func MapToValues ¶
MapToValues applies a mapper function to each value of the sequence and returns a sequence of values only.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Of("a", "b", "c")
// Map values to strings and return as sequence of values
mapped := seq2.MapToValues(input, func(v string) string {
return fmt.Sprintf("Value: %s", v)
})
for v := range mapped {
fmt.Println(v)
}
}
Output: Value: a Value: b Value: c
func MapValues ¶
MapValues applies a mapper function to each value of the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Map values to their squares (keeps original keys)
mapped := seq2.MapValues(input, func(v int) int {
return v * v
})
result := seq2.Collect(mapped)
fmt.Println(result)
}
Output: map[a:1 b:4 c:9]
func MaxKey ¶
MaxKey returns the maximum key in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 5, "z": 10, "c": 3})
input = seq2.Sort(input)
// Find the maximum key (lexicographically)
maxK := seq2.MaxKey(input)
fmt.Println(maxK.MustGet())
}
Output: z
func MaxValue ¶
MaxValue returns the maximum value in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 5, "b": 10, "c": 3})
input = seq2.Sort(input)
// Find the maximum value
maxV := seq2.MaxValue(input)
fmt.Println(maxV.MustGet())
}
Output: 10
func MinKey ¶
MinKey returns the minimum key in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 5, "z": 10, "c": 3})
input = seq2.Sort(input)
// Find the minimum key (lexicographically)
minK := seq2.MinKey(input)
fmt.Println(minK.MustGet())
}
Output: a
func MinValue ¶
MinValue returns the minimum value in the .
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 5, "b": 10, "c": 3})
input = seq2.Sort(input)
// Find the minimum value
minV := seq2.MinValue(input)
fmt.Println(minV.MustGet())
}
Output: 3
func Narrow ¶
Narrow applies a mapper function to each element of the sequence and returns a sequence of mapper results. Alias for MapTo
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Narrow is an alias for MapTo
mapped := seq2.Narrow(input, func(k string, v int) string {
return fmt.Sprintf("%s=%d", k, v)
})
seq.ForEach(mapped, func(v string) {
fmt.Println(v)
})
}
Output: a=1 b=2 c=3
func None ¶
None returns true if no element satisfies the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
none := seq2.None(input, func(k string, v int) bool {
return v > 10
})
fmt.Println(none)
}
Output: true
func NotContains ¶
func NotContains[K comparable, V any](seq iter.Seq2[K, V], key K) bool
NotContains returns true if the key is not in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
notContains := seq2.NotContains(input, "x")
fmt.Println(notContains)
}
Output: true
func NotContainsPair ¶
func NotContainsPair[K comparable, V comparable](seq iter.Seq2[K, V], key K, value V) bool
NotContainsPair returns true if the key-value pair is not in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
notContainsPair := seq2.NotContainsPair(input, "b", 3)
fmt.Println(notContainsPair)
}
Output: true
func NotContainsValue ¶
func NotContainsValue[K any, V comparable](seq iter.Seq2[K, V], value V) bool
NotContainsValue returns true if the value is not in the sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
notContainsValue := seq2.NotContainsValue(input, 5)
fmt.Println(notContainsValue)
}
Output: true
func Of ¶
Of creates a new indexed sequence from the given elements.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence from individual elements
indexed := seq2.Of(1, 2, 3)
result := seq2.Collect(indexed)
fmt.Println(result)
}
Output: map[0:1 1:2 2:3]
func Offset ¶
Offset returns a new sequence that skips the first n elements of the given sequence. SQL-like alias for Skip.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Of(10, 20, 30, 40, 20)
// Skip the first 2 elements
skipped := seq2.Offset(input, 2)
result := seq2.Collect(skipped)
fmt.Println(result)
}
Output: map[2:30 3:40 4:20]
func Pair ¶
Pair returns a sequence with given key value.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence with a single key-value pair
single := seq2.Pair("key", 42)
seq2.ForEach(single, func(k string, v int) {
fmt.Println(k, ":", v)
})
}
Output: key : 42
func Prepend ¶
Prepend prepends element to the beginning of a sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"b": 2, "c": 3})
input = seq2.Sort(input)
// Prepend a new key-value pair to the sequence
prepended := seq2.Prepend(input, "a", 1)
result := seq2.Collect(prepended)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3]
func Reduce ¶
func Reduce[K any, V any, R any](seq2 iter.Seq2[K, V], accumulator func(agg R, key K, value V) R, initial R) R
Reduce applies a function against an accumulator and each element in the sequence (from left to right) to reduce it to a single value.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
type Reduced struct {
Key string
Value int
}
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Reduce to calculate the sum of all values
reduced := seq2.Reduce(input, func(agg Reduced, key string, value int) Reduced {
return Reduced{
Key: agg.Key + key,
Value: agg.Value + value,
}
}, Reduced{})
fmt.Println(reduced)
}
Output: {abc 6}
func ReduceRight ¶
func ReduceRight[K any, V any, R any](seq2 iter.Seq2[K, V], accumulator func(agg R, key K, value V) R, initial R) R
ReduceRight applies a function against an accumulator and each element in the sequence (from right to left) to reduce it to a single value.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
type Reduced struct {
Key string
Value int
}
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Reduce to calculate the sum of all values
reduced := seq2.ReduceRight(input, func(agg Reduced, key string, value int) Reduced {
return Reduced{
Key: agg.Key + key,
Value: agg.Value + value,
}
}, Reduced{})
fmt.Println(reduced)
}
Output: {cba 6}
func Repeat ¶
Repeat repeats the given pair `count` times.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence that repeats a key-value pair 3 times
repeated := seq2.Repeat("key", 42, 3)
seq2.ForEach(repeated, func(k string, v int) {
fmt.Println(k, ":", v)
})
}
Output: key : 42 key : 42 key : 42
func Reverse ¶
Reverse reverses the given sequence.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create an indexed sequence
sequence := seq2.Of("a", "b", "c")
// Reverse it
reversed := seq2.Reverse(sequence)
// Collect into pairs for ordered display
var pairs []string
seq2.ForEach(reversed, func(k int, v string) {
fmt.Println(k, ":", v)
})
fmt.Println(strings.Join(pairs, ", "))
}
Output: 2 : c 1 : b 0 : a
func Skip ¶
Skip returns a new sequence that skips the first n elements of the given sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Of(10, 20, 30, 40, 20)
// Skip the first 2 elements
skipped := seq2.Skip(input, 2)
result := seq2.Collect(skipped)
fmt.Println(result)
}
Output: map[2:30 3:40 4:20]
func SkipUntil ¶
SkipUntil returns a new sequence that skips elements from the given sequence until the predicate is satisfied.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Of(10, 20, 30, 40, 20)
// Skip elements until value of 30 is reached
skipped := seq2.SkipUntil(input, func(k int, v int) bool {
return v == 30
})
result := seq2.Collect(skipped)
fmt.Println(result)
}
Output: map[2:30 3:40 4:20]
func SkipWhile ¶
SkipWhile returns a new sequence that skips elements from the given sequence while the predicate is satisfied.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Of(10, 20, 30, 40, 20)
// Skip elements until the value is less than 30
skipped := seq2.SkipWhile(input, func(k int, v int) bool {
return v < 30
})
result := seq2.Collect(skipped)
fmt.Println(result)
}
Output: map[2:30 3:40 4:20]
func Sort ¶
Sort sorts the elements of a sequence by key in ascending order.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Pair("a", 1)
input = seq2.Append(input, "c", 3)
input = seq2.Append(input, "b", 2)
// Sort by keys (alphabetically)
sorted := seq2.Sort(input)
seq2.ForEach(sorted, func(k string, v int) {
fmt.Println(k, ":", v)
})
}
Output: a : 1 b : 2 c : 3
func SortBy ¶
func SortBy[K any, V any, R types.Ordered](seq iter.Seq2[K, V], mapper func(K, V) R) iter.Seq2[K, V]
SortBy sorts the elements of a sequence by result of the mapper.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Pair("a", 1)
input = seq2.Append(input, "c", 3)
input = seq2.Append(input, "b", 2)
// Sort by values
sorted := seq2.SortBy(input, func(k string, v int) int {
return v
})
seq2.ForEach(sorted, func(k string, v int) {
fmt.Println(k, ":", v)
})
}
Output: a : 1 b : 2 c : 3
func SortComparingKeys ¶
SortComparingKeys sorts the elements of a sequence by key in ascending order.
Example ¶
package main
import (
"cmp"
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Pair("a", 1)
input = seq2.Append(input, "c", 3)
input = seq2.Append(input, "b", 2)
// Sort by keys in reverse order
sorted := seq2.SortComparingKeys(input, func(a, b string) int {
return -cmp.Compare(a, b)
})
seq2.ForEach(sorted, func(k string, v int) {
fmt.Println(k, ":", v)
})
}
Output: c : 3 b : 2 a : 1
func SortComparingValues ¶
SortComparingValues sorts the elements of a sequence by value in ascending order.
Example ¶
package main
import (
"cmp"
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Unordered map with string keys
input := seq2.Pair("a", 1)
input = seq2.Append(input, "c", 3)
input = seq2.Append(input, "b", 2)
// Sort by values in descending order
sorted := seq2.SortComparingValues(input, func(a, b int) int {
return -cmp.Compare(a, b)
})
seq2.ForEach(sorted, func(k string, v int) {
fmt.Println(k, ":", v)
})
}
Output: c : 3 b : 2 a : 1
func Split ¶
Split splits a sequence of pairs into two sequences.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// Split is an alias for UnZip
keys, values := seq2.Split(input)
keySlice := make([]string, 0)
for k := range keys {
keySlice = append(keySlice, k)
}
fmt.Printf("Keys: %v\n", keySlice)
valueSlice := make([]int, 0)
for v := range values {
valueSlice = append(valueSlice, v)
}
fmt.Printf("Values: %v\n", valueSlice)
}
Output: Keys: [a b c] Values: [1 2 3]
func Take ¶
Take returns a new sequence that contains only the first n elements of the given sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
// Take the first 2 elements
taken := seq2.Take(input, 2)
result := seq2.Collect(taken)
fmt.Println(result)
}
Output: map[a:1 b:2]
func TakeUntil ¶
TakeUntil returns a new sequence that takes elements from the given sequence until the predicate is satisfied.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
// Take elements until value is greater than 2
taken := seq2.TakeUntil(input, func(k string, v int) bool {
return v > 2
})
result := seq2.Collect(taken)
fmt.Println(result)
}
Output: map[a:1 b:2]
func TakeWhile ¶
TakeWhile returns a new sequence that takes elements from the given sequence while the predicate is satisfied.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Of("a", "b", "c", "d")
// Take elements while value is less than 3
taken := seq2.TakeWhile(input, func(k int, v string) bool {
return v != "c"
})
result := seq2.Collect(taken)
fmt.Println(result)
}
Output: map[0:a 1:b]
func Tap ¶
Tap returns a sequence that applies the given consumer to each element of the input sequence and pass it further.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
// Ensure to have consistent output
input = seq2.Sort(input)
// Use Tap to print key-value pairs while passing them through
tapped := seq2.Tap(input, func(k string, v int) {
fmt.Printf("Processing: %s => %d\n", k, v)
})
seq2.Flush(tapped)
}
Output: Processing: a => 1 Processing: b => 2 Processing: c => 3
func Tick ¶
Tick returns a sequence that yields the tick number and the current time every duration.
Example ¶
package main
import (
"fmt"
"time"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
ticker := seq2.Tick(1 * time.Millisecond)
ticker = seq2.Take(ticker, 5)
seq2.ForEach(ticker, func(tick int, v time.Time) {
fmt.Printf("tick %d at %s \n", tick, v.Format("15:04:05.000"))
})
// Example Output:
// tick 1 at 00:00:00.000
// tick 2 at 00:00:00.001
// tick 3 at 00:00:00.002
// tick 4 at 00:00:00.003
// tick 5 at 00:00:00.004
}
func ToMap ¶
func ToMap[Map ~map[K]V, K comparable, V any](seq iter.Seq2[K, V], m Map)
ToMap collects the elements of the given sequence into a map.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
result := make(map[string]int, 3)
seq2.ToMap(input, result)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3]
func UnZip ¶
UnZip splits a sequence of pairs into two sequences.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
input = seq2.Sort(input)
// UnZip splits a sequence into keys and values sequences
keys, values := seq2.UnZip(input)
keySlice := make([]string, 0)
for k := range keys {
keySlice = append(keySlice, k)
}
fmt.Printf("Keys: %v\n", keySlice)
valueSlice := make([]int, 0)
for v := range values {
valueSlice = append(valueSlice, v)
}
fmt.Printf("Values: %v\n", valueSlice)
}
Output: Keys: [a b c] Values: [1 2 3]
Example (AfterZip) ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
nums := seq.Of(1, 2, 3)
letters := seq.Of("a", "b", "c")
zipped := seq.Zip(nums, letters)
unzipped1, unzipped2 := seq2.UnZip(zipped)
result1 := seq.Collect(unzipped1)
result2 := seq.Collect(unzipped2)
fmt.Println(result1)
fmt.Println(result2)
}
Output: [1 2 3] [a b c]
func Union ¶
func Union[K comparable, V comparable](seq1 iter.Seq2[K, V], seq2 iter.Seq2[K, V]) iter.Seq2[K, V]
Union returns a sequence that contains all distinct elements from both input sequences.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
first := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3})
first = seq2.Sort(first)
second := seq2.FromMap(map[string]int{"c": 3, "d": 4, "e": 5})
second = seq2.Sort(second)
// Union returns distinct elements from both sequences
combined := seq2.Union(first, second)
result := seq2.Collect(combined)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3 d:4 e:5]
func UnionAll ¶
UnionAll returns a sequence that contains all elements from both input sequences.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
first := seq2.FromMap(map[string]int{"a": 1, "b": 2})
first = seq2.Sort(first)
second := seq2.FromMap(map[string]int{"c": 3, "b": 2})
second = seq2.Sort(second)
// UnionAll is an alias for Concat
combined := seq2.UnionAll(first, second)
result := seq2.Collect(combined)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3]
func Uniq ¶
func Uniq[K comparable, V comparable](seq iter.Seq2[K, V]) iter.Seq2[K, V]
Uniq returns a new sequence that contains only the unique elements of the given sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence with duplicate key-value pairs
input := seq2.Concat(
seq2.FromMap(map[string]int{"a": 1, "b": 2}),
seq2.FromMap(map[string]int{"a": 1, "c": 3}),
)
// Get unique key-value pairs
unique := seq2.Uniq(input)
result := seq2.Collect(unique)
fmt.Println(result)
}
Output: map[a:1 b:2 c:3]
func UniqBy ¶
func UniqBy[K any, V any, K2 comparable](seq iter.Seq2[K, V], mapper Mapper[K, V, K2]) iter.Seq2[K, V]
UniqBy returns a new sequence that contains only the unique elements of the given sequence based on a key.
Example ¶
package main
import (
"fmt"
"strconv"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"apple": 1, "banana": 2, "apricot": 3, "berry": 4, "blueberry": 5})
input = seq2.Sort(input)
// Get unique entries based on first letter and value modulo 2
unique := seq2.UniqBy(input, func(k string, v int) string {
return string(k[0]) + strconv.Itoa(v%2)
})
result := seq2.Collect(unique)
fmt.Println(result)
}
Output: map[apple:1 banana:2 blueberry:5]
func UniqByKeys ¶
func UniqByKeys[K any, V any, K2 comparable](seq iter.Seq2[K, V], mapper KeyMapper[K, K2]) iter.Seq2[K, V]
UniqByKeys returns a new sequence that contains only the unique elements of the given sequence based on a key.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"Apple": 1, "apricot": 2, "Banana": 3, "berry": 4})
input = seq2.Sort(input)
// Get unique entries based on lowercase first letter of key
unique := seq2.UniqByKeys(input, func(k string) string {
return strings.ToLower(string(k[0]))
})
result := seq2.Collect(unique)
fmt.Println(result)
}
Output: map[Apple:1 Banana:3]
func UniqByValues ¶
func UniqByValues[K any, V any, V2 comparable](seq iter.Seq2[K, V], mapper ValueMapper[V, V2]) iter.Seq2[K, V]
UniqByValues returns a new sequence that contains only the unique elements of the given sequence based on a key.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 10, "b": 21, "c": 30, "d": 44})
input = seq2.Sort(input)
// Get unique entries based on value modulo 10
unique := seq2.UniqByValues(input, func(v int) int {
return v % 10
})
result := seq2.Collect(unique)
fmt.Println(result)
}
Output: map[a:10 b:21 d:44]
func UniqKeys ¶
UniqKeys returns a new sequence that contains only the unique keys of the given sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence with duplicate keys
input := seq2.Concat(
seq2.FromMap(map[string]int{"a": 1, "b": 2}),
seq2.FromMap(map[string]int{"a": 3, "c": 4}),
)
// Get entries with unique keys (first occurrence wins)
unique := seq2.UniqKeys(input)
result := seq2.Collect(unique)
fmt.Println(result)
}
Output: map[a:1 b:2 c:4]
func UniqValues ¶
UniqValues returns a new sequence that contains only the unique values of the given sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a sequence with duplicate values
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 1, "d": 3})
input = seq2.Sort(input)
// Get entries with unique values (first occurrence wins)
unique := seq2.UniqValues(input)
result := seq2.Collect(unique)
fmt.Println(result)
}
Output: map[a:1 b:2 d:3]
func Values ¶
Values returns a sequence of values from a sequence of key-value pairs.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.Of("a", "b", "c")
keys := seq2.Values(input)
seq.ForEach(keys, func(v string) {
fmt.Print(v, " ")
})
}
Output: a b c
func Where ¶
Where returns a new sequence that contains only the elements that satisfy the predicate. SQL-like alias for Filter
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
input := seq2.FromMap(map[string]int{"a": 1, "b": 2, "c": 3, "d": 4})
input = seq2.Sort(input)
// Where is an alias for Filter
filtered := seq2.Where(input, func(k string, v int) bool {
return v > 2
})
result := seq2.Collect(filtered)
fmt.Println(result)
}
Output: map[c:3 d:4]
func WithIndex ¶
WithIndex creates a new indexed sequence from the given sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create a iter.Seq of values
values := seq.Of("a", "b", "c")
// Add indexes
indexed := seq2.WithIndex(values)
result := seq2.Collect(indexed)
fmt.Println(result)
}
Output: map[0:a 1:b 2:c]
func WithoutIndex ¶
WithoutIndex creates a new sequence from the given indexed sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Create an indexed sequence
indexed := seq2.Of("a", "b", "c")
// Remove indexes
values := seq2.WithoutIndex(indexed)
result := seq.Collect(values)
fmt.Println(result)
}
Output: [a b c]
Types ¶
type DoubleMapper ¶
type DoubleMapper[K, V, RK, RV any] = func(K, V) (RK, RV)
DoubleMapper is a function that takes an element and returns a new sequence element.
type KeyMapper ¶
type KeyMapper[K, R any] = func(K) R
KeyMapper is a function that takes Key a new Key.
type KeyPredicate ¶
KeyPredicate is a function that is used to filter by key.
type Mapper ¶
type Mapper[K, V, R any] = func(K, V) R
Mapper is a function that takes an element and returns a new element.
type Sequence ¶
type Sequence[K comparable, V comparable] struct { // contains filtered or unexported fields }
Sequence is a wrapper around iter.Seq2 that provides fluent API for seq2 operations.
func AsSequence ¶
func AsSequence[K comparable, V comparable](seq iter.Seq2[K, V]) Sequence[K, V]
AsSequence wraps an iter.Seq2 to provide a fluent API.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
var result []string
sequence.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 0:a, 1:b, 2:c
func ConcatSequences ¶
func ConcatSequences[K comparable, V comparable](sequences ...Sequence[K, V]) Sequence[K, V]
ConcatSequences concatenates multiple sequences into a single sequence.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sq1 := seq2.AsSequence(seq2.Of("a", "b"))
sq2 := seq2.AsSequence(seq2.Of("c", "d"))
concatenated := seq2.ConcatSequences(sq1, sq2)
concatenated.ForEach(func(k int, v string) {
fmt.Println(k, v)
})
}
Output: 0 a 1 b 0 c 1 d
func (Sequence[K, V]) Append ¶
Append appends a key-value pair to the end of a sequence.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
appended := sequence.Append(3, "d")
var result []string
appended.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 0:a, 1:b, 2:c, 3:d
func (Sequence[K, V]) Collect ¶
func (s Sequence[K, V]) Collect() map[K]V
Collect collects the elements into a map.
func (Sequence[K, V]) Contains ¶
Contains returns true if the sequence contains the key.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
fmt.Println("Contains key 1:", sequence.Contains(1))
fmt.Println("Contains key 5:", sequence.Contains(5))
}
Output: Contains key 1: true Contains key 5: false
func (Sequence[K, V]) ContainsPair ¶
ContainsPair returns true if the sequence contains the key-value pair.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
fmt.Println("Contains pair 1:'b':", sequence.ContainsPair(1, "b"))
fmt.Println("Contains pair 1:'c':", sequence.ContainsPair(1, "c"))
}
Output: Contains pair 1:'b': true Contains pair 1:'c': false
func (Sequence[K, V]) ContainsValue ¶
ContainsValue returns true if the sequence contains the value.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
fmt.Println("Contains value 'b':", sequence.ContainsValue("b"))
fmt.Println("Contains value 'z':", sequence.ContainsValue("z"))
}
Output: Contains value 'b': true Contains value 'z': false
func (Sequence[K, V]) Cycle ¶
Cycle repeats the sequence the specified number of times.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b"))
cycled := sequence.Cycle(2)
var result []string
cycled.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 0:a, 1:b, 0:a, 1:b
func (Sequence[K, V]) Every ¶
Every returns true if all elements satisfy the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
allLowercase := sequence.Every(func(k int, v string) bool {
return v >= "a" && v <= "z"
})
allA := sequence.Every(func(k int, v string) bool {
return v == "a"
})
fmt.Println("All values lowercase:", allLowercase)
fmt.Println("All values 'a':", allA)
}
Output: All values lowercase: true All values 'a': false
func (Sequence[K, V]) Exists ¶
Exists returns true if any element satisfies the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
hasValueB := sequence.Exists(func(k int, v string) bool {
return v == "b"
})
fmt.Println("Has value 'b':", hasValueB)
}
Output: Has value 'b': true
func (Sequence[K, V]) Filter ¶
Filter returns a new sequence with elements that satisfy the predicate.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c", "d", "e"))
filtered := sequence.Filter(func(k int, v string) bool {
return k%2 == 0
})
var result []string
filtered.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 0:a, 2:c, 4:e
func (Sequence[K, V]) FilterByKey ¶
func (s Sequence[K, V]) FilterByKey(predicate KeyPredicate[K]) Sequence[K, V]
FilterByKey returns a new sequence with elements whose keys satisfy the predicate.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c", "d", "e"))
filtered := sequence.FilterByKey(func(k int) bool {
return k > 2
})
var result []string
filtered.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 3:d, 4:e
func (Sequence[K, V]) FilterByValue ¶
func (s Sequence[K, V]) FilterByValue(predicate ValuePredicate[V]) Sequence[K, V]
FilterByValue returns a new sequence with elements whose values satisfy the predicate.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c", "d", "e"))
filtered := sequence.FilterByValue(func(v string) bool {
return v > "c"
})
var result []string
filtered.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 3:d, 4:e
func (Sequence[K, V]) Find ¶
Find returns the first element that satisfies the predicate.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c", "d", "e"))
key, value := sequence.Find(func(k int, v string) bool {
return v == "c"
})
fmt.Printf("Key: %d, Value: %s\n", key.MustGet(), value.MustGet())
}
Output: Key: 2, Value: c
func (Sequence[K, V]) Flush ¶
func (s Sequence[K, V]) Flush()
Flush consumes all elements of the sequence.
func (Sequence[K, V]) FoldValues ¶
FoldValues folds values with the first value as initial.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
result := sequence.FoldValues(func(agg string, key int, value string) string {
return agg + value
})
fmt.Println("Concatenated:", result.MustGet())
}
Output: Concatenated: abc
func (Sequence[K, V]) FoldValuesRight ¶
FoldValuesRight folds values from right to left.
func (Sequence[K, V]) ForEach ¶
ForEach calls the consumer for each element.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
var result []string
sequence.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 0:a, 1:b, 2:c
func (Sequence[K, V]) Get ¶
Get returns the value associated with the key.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
existing := sequence.Get(1)
notExisting := sequence.Get(5)
fmt.Println("Value for key 1:", existing.MustGet())
fmt.Println("Has value for key 5:", notExisting.IsPresent())
}
Output: Value for key 1: b Has value for key 5: false
func (Sequence[K, V]) IsNotEmpty ¶
IsNotEmpty returns true if the sequence is not empty.
func (Sequence[K, V]) Keys ¶
Keys returns a sequence of keys.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
keys := sequence.Keys()
seq.ForEach(keys, func(k int) {
fmt.Println(k)
})
}
Output: 0 1 2
func (Sequence[K, V]) NotContains ¶
NotContains returns true if the sequence does not contain the key.
func (Sequence[K, V]) NotContainsPair ¶
NotContainsPair returns true if the sequence does not contain the key-value pair.
func (Sequence[K, V]) NotContainsValue ¶
NotContainsValue returns true if the sequence does not contain the value.
func (Sequence[K, V]) Prepend ¶
Prepend prepends a key-value pair to the beginning of a sequence.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("b", "c", "d"))
prepended := sequence.Prepend(-1, "a")
var result []string
prepended.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: -1:a, 0:b, 1:c, 2:d
func (Sequence[K, V]) Reverse ¶
Reverse returns a new sequence with elements in reverse order.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
reversed := sequence.Reverse()
var result []string
reversed.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 2:c, 1:b, 0:a
func (Sequence[K, V]) Skip ¶
Skip returns a new sequence that skips the first n elements.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c", "d", "e"))
skipped := sequence.Skip(2)
var result []string
skipped.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 2:c, 3:d, 4:e
func (Sequence[K, V]) SortComparingKeys ¶
SortComparingKeys sorts the sequence by keys using a custom comparator.
func (Sequence[K, V]) SortComparingValues ¶
SortComparingValues sorts the sequence by values using a custom comparator.
func (Sequence[K, V]) Take ¶
Take returns a new sequence with only the first n elements.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c", "d", "e"))
taken := sequence.Take(3)
var result []string
taken.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 0:a, 1:b, 2:c
func (Sequence[K, V]) Tap ¶
Tap calls the consumer for each element without changing the sequence.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
var result []string
sequence := seq2.AsSequence(seq2.Of("a", "b", "c")).
Tap(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
sequence.Flush()
fmt.Println(strings.Join(result, ", "))
}
Output: 0:a, 1:b, 2:c
func (Sequence[K, V]) ToMap ¶
func (s Sequence[K, V]) ToMap(m map[K]V)
ToMap converts the sequence to a map.
func (Sequence[K, V]) Union ¶
Union returns a new sequence that contains all distinct elements from both input sequences.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sq1 := seq2.AsSequence(seq2.Concat(seq2.Pair("a", 1), seq2.Pair("b", 2), seq2.Pair("c", 3)))
sq2 := seq2.AsSequence(seq2.Concat(seq2.Pair("a", 1), seq2.Pair("d", 4), seq2.Pair("e", 5)))
union := sq1.Union(sq2)
union.ForEach(func(k string, v int) {
fmt.Println(k, ":", v)
})
}
Output: a : 1 b : 2 c : 3 d : 4 e : 5
func (Sequence[K, V]) UnionAll ¶
UnionAll returns a new sequence that contains all elements from both input sequences.
Example ¶
package main
import (
"fmt"
"strings"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
seq1 := seq2.AsSequence(seq2.Of("a", "b", "c"))
seq2Inst := seq2.AsSequence(seq2.Of("c", "d", "e"))
unionAll := seq1.UnionAll(seq2Inst)
var result []string
unionAll.ForEach(func(k int, v string) {
result = append(result, fmt.Sprintf("%d:%s", k, v))
})
fmt.Println(strings.Join(result, ", "))
}
Output: 0:a, 1:b, 2:c, 0:c, 1:d, 2:e
func (Sequence[K, V]) Uniq ¶
Uniq returns a sequence with unique key-value pairs.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
// Using FromMap to create a sequence with duplicate values
sequence := seq2.AsSequence(seq2.Of("a", "a", "b", "b", "c"))
unique := sequence.UniqValues()
unique.ForEach(func(k int, v string) {
fmt.Println(k, ":", v)
})
}
Output: 0 : a 2 : b 4 : c
func (Sequence[K, V]) UniqValues ¶
UniqValues returns a sequence with unique values.
func (Sequence[K, V]) Values ¶
Values returns a sequence of values.
Example ¶
package main
import (
"fmt"
"github.com/go-softwarelab/common/pkg/seq"
"github.com/go-softwarelab/common/pkg/seq2"
)
func main() {
sequence := seq2.AsSequence(seq2.Of("a", "b", "c"))
values := sequence.Values()
seq.ForEach(values, func(v string) {
fmt.Println(v)
})
}
Output: a b c
type ValueMapper ¶
type ValueMapper[V, R any] = func(V) R
ValueMapper is a function that takes Value a new Value.
type ValuePredicate ¶
type ValuePredicate[E any] = ValueMapper[E, bool]
ValuePredicate is a function that is used to filter by value.