// Copyright 2026 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 iter_test import ( "fmt" "iter" "slices" "strings" ) func ExampleSeq() { // A Seq is a function that passes each value of a sequence to // yield. Nothing requires the sequence to be finite: this one ends // only when yield reports that the consumer has stopped, which // happens when the range loop below breaks. var fib iter.Seq[int] = func(yield func(int) bool) { a, b := 0, 1 for yield(a) { a, b = b, a+b } } for n := range fib { if n > 50 { break } fmt.Print(n, " ") } fmt.Println() // Output: // 0 1 1 2 3 5 8 13 21 34 } func ExampleSeq2() { // A Seq2 passes a pair of values per element, here the two halves // of a key=value field. Ranging over an existing Seq, in this case // strings.SplitSeq, keeps the fields from being collected into a // slice first. var attrs iter.Seq2[string, string] = func(yield func(string, string) bool) { for field := range strings.SplitSeq("gopher=blue,size=large,tail", ",") { k, v, _ := strings.Cut(field, "=") if !yield(k, v) { return } } } for k, v := range attrs { fmt.Printf("%q %q\n", k, v) } // Output: // "gopher" "blue" // "size" "large" // "tail" "" } func ExamplePull() { // Merging two sorted sequences means advancing whichever one holds // the smaller value, so the two have to move independently. A range // loop cannot do that, since it drives a single sequence from start // to finish. Pull converts each sequence into a next function that // produces one value per call. next1, stop1 := iter.Pull(slices.Values([]int{1, 3, 5, 7})) defer stop1() next2, stop2 := iter.Pull(slices.Values([]int{2, 3, 6})) defer stop2() v1, ok1 := next1() v2, ok2 := next2() for ok1 || ok2 { if !ok2 || ok1 && v1 <= v2 { fmt.Print(v1, " ") v1, ok1 = next1() } else { fmt.Print(v2, " ") v2, ok2 = next2() } } fmt.Println() // Output: // 1 2 3 3 5 6 7 } func ExamplePull2() { // This caller reads only the first two pairs and leaves the rest of // the sequence unread. Because the sequence is not consumed to // completion, stop has to be called to let the iterator function // finish and return. next, stop := iter.Pull2(slices.All([]string{"hydrogen", "helium", "lithium"})) defer stop() for range 2 { i, element, ok := next() if !ok { break } fmt.Println(i, element) } // Output: // 0 hydrogen // 1 helium }