package main
import (
"fmt"
"math"
)
type IteratorWrapper[T any] struct {
iter []T
}
func From[T any](iterable []T) *IteratorWrapper[T] {
return &IteratorWrapper[T]{iter: iterable}
}
func (iw *IteratorWrapper[T]) MapTo[U any](f func(T) U) *IteratorWrapper[U] {
result := make([]U, len(iw.iter))
for i, x := range iw.iter {
result[i] = f(x)
}
return From(result)
}
func (iw *IteratorWrapper[T]) Filter(f func(T) bool) *IteratorWrapper[T] {
var result []T
for _, x := range iw.iter {
if f(x) {
result = append(result, x)
}
}
return From(result)
}
func (iw *IteratorWrapper[T]) Take(n int) *IteratorWrapper[T] {
if n > len(iw.iter) {
n = len(iw.iter)
}
return From(iw.iter[:n])
}
func (iw *IteratorWrapper[T]) Skip(n int) *IteratorWrapper[T] {
if n > len(iw.iter) {
n = len(iw.iter)
}
return From(iw.iter[n:])
}
func (iw *IteratorWrapper[T]) ToArray() []T {
return iw.iter
}
func (iw *IteratorWrapper[T]) First() (T, bool) {
if len(iw.iter) == 0 {
var zero T
return zero, false
}
return iw.iter[0], true
}
func (iw *IteratorWrapper[T]) Last() (T, bool) {
if len(iw.iter) == 0 {
var zero T
return zero, false
}
return iw.iter[len(iw.iter)-1], true
}
func (iw *IteratorWrapper[T]) Sum(f func(T) float64) float64 {
var total float64
for _, x := range iw.iter {
total += f(x)
}
return total
}
func (iw *IteratorWrapper[T]) Min(f func(T) float64) (float64, bool) {
if len(iw.iter) == 0 {
return 0, false
}
min := f(iw.iter[0])
for _, x := range iw.iter[1:] {
val := f(x)
if val < min {
min = val
}
}
return min, true
}
func (iw *IteratorWrapper[T]) Max(f func(T) float64) (float64, bool) {
if len(iw.iter) == 0 {
return 0, false
}
max := f(iw.iter[0])
for _, x := range iw.iter[1:] {
val := f(x)
if val > max {
max = val
}
}
return max, true
}
func main() {
numbers := []int{1, 2, 3, 4, 5}
result := From(numbers).
Map(func(x int) int { return x * 2 }).
Filter(func(x int) bool { return x > 5 }).
Take(3).
ToArray()
fmt.Println("Result:", result) // [6, 8, 10]
first, ok := From(numbers).First()
if ok {
fmt.Println("First:", first)
}
last, ok := From(numbers).Last()
if ok {
fmt.Println("Last:", last)
}
sum := From(numbers).Sum(func(x int) float64 { return float64(x) })
fmt.Println("Sum:", sum)
min, ok := From(numbers).Min(func(x int) float64 { return float64(x) })
if ok {
fmt.Println("Min:", min)
}
max, ok := From(numbers).Max(func(x int) float64 { return float64(x) })
if ok {
fmt.Println("Max:", max)
}
}
897700cookie-checkGo IteratorWrapper