Files
phishingclub/backend/vendor/github.com/enetx/iter/seq.go
Ronni Skansing 07c8adaf76 update vendor deps
Signed-off-by: Ronni Skansing <rskansing@gmail.com>
2025-11-06 23:31:08 +01:00

269 lines
5.3 KiB
Go

package iter
// Next extracts the first element from the sequence and returns the remaining sequence.
// Returns (value, remainingSeq, true) if an element exists, or (zero, nil, false) if empty.
// This is similar to Rust's Iterator::next() method.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5})
// val, rest, ok := iter.Next(s)
// // val = 1, ok = true
// // rest yields: 2, 3, 4, 5
//
// val2, rest2, ok2 := iter.Next(rest)
// // val2 = 2, ok2 = true
// // rest2 yields: 3, 4, 5
func Next[T any](s Seq[T]) (T, Seq[T], bool) {
var first T
found := false
consumed := false
s(func(v T) bool {
if !consumed {
first = v
found = true
consumed = true
return false
}
return true
})
if !found {
return first, nil, false
}
remaining := func(yield func(T) bool) {
skip := true
s(func(v T) bool {
if skip {
skip = false
return true
}
return yield(v)
})
}
return first, remaining, true
}
// First returns the first element from the sequence.
// Returns (value, true) if an element exists, or (zero, false) if empty.
// This is similar to Rust's Iterator::first() method.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5})
// value, ok := iter.First(s) // 1, true
func First[T any](s Seq[T]) (T, bool) {
var result T
found := false
s(func(v T) bool {
result = v
found = true
return false
})
return result, found
}
// Last returns the last element from the sequence.
// Returns (value, true) if an element exists, or (zero, false) if empty.
// This is similar to Rust's Iterator::last() method.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5})
// value, ok := iter.Last(s) // 5, true
func Last[T any](s Seq[T]) (T, bool) {
var result T
found := false
s(func(v T) bool {
result = v
found = true
return true
})
return result, found
}
// ForEach applies a function to each element in the sequence.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3})
// iter.ForEach(s, func(x int) { fmt.Println(x) })
func ForEach[T any](s Seq[T], fn func(T)) {
s(func(v T) bool { fn(v); return true })
}
// Count returns the number of elements in the sequence.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3})
// count := iter.Count(s) // 3
func Count[T any](s Seq[T]) int {
count := 0
s(func(T) bool {
count++
return true
})
return count
}
// Range applies a function to each element until it returns false.
// This is the same as the sequence's yield function.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5})
// iter.Range(s, func(x int) bool {
// fmt.Println(x)
// return x != 3 // Stop at 3
// })
func Range[T any](s Seq[T], fn func(T) bool) { s(fn) }
// Take returns the first n elements of the sequence.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5})
// iter.Take(s, 3) // yields: 1, 2, 3
func Take[T any](s Seq[T], n int) Seq[T] {
return func(yield func(T) bool) {
if n <= 0 {
return
}
count := 0
s(func(v T) bool {
if count >= n {
return false
}
count++
return yield(v)
})
}
}
// Skip skips the first n elements and returns the rest.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5})
// iter.Skip(s, 2) // yields: 3, 4, 5
func Skip[T any](s Seq[T], n int) Seq[T] {
return func(yield func(T) bool) {
if n <= 0 {
s(yield)
return
}
count := 0
s(func(v T) bool {
if count < n {
count++
return true
}
return yield(v)
})
}
}
// StepBy returns every nth element from the sequence.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5, 6})
// iter.StepBy(s, 2) // yields: 1, 3, 5
func StepBy[T any](s Seq[T], step int) Seq[T] {
return func(yield func(T) bool) {
if step <= 0 {
return
}
index := 0
s(func(v T) bool {
if index%step == 0 {
if !yield(v) {
return false
}
}
index++
return true
})
}
}
// TakeWhile yields elements while the predicate returns true.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5})
// iter.TakeWhile(s, func(x int) bool { return x < 4 }) // yields: 1, 2, 3
func TakeWhile[T any](s Seq[T], pred func(T) bool) Seq[T] {
return func(yield func(T) bool) {
s(func(v T) bool {
if !pred(v) {
return false
}
return yield(v)
})
}
}
// SkipWhile skips elements while the predicate returns true, then yields the rest.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5})
// iter.SkipWhile(s, func(x int) bool { return x < 3 }) // yields: 3, 4, 5
func SkipWhile[T any](s Seq[T], pred func(T) bool) Seq[T] {
return func(yield func(T) bool) {
skipping := true
s(func(v T) bool {
if skipping && pred(v) {
return true
}
skipping = false
return yield(v)
})
}
}
// Nth returns the nth element (0-indexed) from the sequence.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3, 4, 5})
// value, ok := iter.Nth(s, 2) // 3, true
func Nth[T any](s Seq[T], n int) (T, bool) {
var result T
found := false
index := 0
s(func(v T) bool {
if index == n {
result = v
found = true
return false
}
index++
return true
})
return result, found
}
// Contains checks if the sequence contains the given value.
//
// Example:
//
// s := iter.FromSlice([]int{1, 2, 3})
// has := iter.Contains(s, 2) // true
func Contains[T comparable](s Seq[T], x T) bool {
found := false
s(func(v T) bool {
if v == x {
found = true
return false
}
return true
})
return found
}