// Copyright 2025 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package moreiters

import "iter"

// First returns the first value of seq and true.
// If seq is empty, it returns the zero value of T and false.
func First[T any](seq iter.Seq[T]) (z T, ok bool) {
	for t := range seq {
		return t, true
	}
	return z, false
}

// Contains reports whether x is an element of the sequence seq.
func Contains[T comparable](seq iter.Seq[T], x T) bool {
	for cand := range seq {
		if cand == x {
			return true
		}
	}
	return false
}

// Every reports whether every pred(t) for t in seq returns true,
// stopping at the first false element.
func Every[T any](seq iter.Seq[T], pred func(T) bool) bool {
	for t := range seq {
		if !pred(t) {
			return false
		}
	}
	return true
}

// Any reports whether any pred(t) for t in seq returns true.
func Any[T any](seq iter.Seq[T], pred func(T) bool) bool {
	for t := range seq {
		if pred(t) {
			return true
		}
	}
	return false
}

// Len returns the number of elements in the sequence (by iterating).
func Len[T any](seq iter.Seq[T]) (n int) {
	for range seq {
		n++
	}
	return
}

// Empty reports whether the sequence contains no elements.
func Empty[T any](seq iter.Seq[T]) bool {
	for range seq {
		return false
	}
	return true
}
