it

package
v2.0.0-alpha.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 30, 2024 License: MIT Imports: 4 Imported by: 33

Documentation

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Chain

func Chain[V any](iterators ...iter.Seq[V]) iter.Seq[V]

Chain yields values from multiple iterators in sequence.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	numbers := slices.Collect(it.Chain(slices.Values([]int{1, 2}), slices.Values([]int{3, 4})))

	fmt.Println(numbers)
}
Output:

[1 2 3 4]

func Chain2

func Chain2[V, W any](iterators ...iter.Seq2[V, W]) iter.Seq2[V, W]

Chain2 yields values from multiple iterators in sequence.

Example
package main

import (
	"fmt"
	"maps"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	pairs := maps.Collect(it.Chain2(maps.All(map[string]int{"a": 1}), maps.All(map[string]int{"b": 2})))

	fmt.Println(len(pairs))
}
Output:

2

func Count

func Count[V ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ~int | ~int8 | ~int16 | ~int32 | ~int64]() iter.Seq[V]

Count yields all non-negative integers in ascending order.

Example
package main

import (
	"fmt"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	for i := range it.Count[int]() {
		if i >= 3 {
			break
		}

		fmt.Println(i)
	}

}
Output:

0
1
2

func Cycle

func Cycle[V any](delegate iter.Seq[V]) iter.Seq[V]

Cycle yields values from an iterator repeatedly.

Note: this is an infinite iterator.

Note: memory usage will grow until all values from the underlying iterator are stored in memory.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	numbers := slices.Collect(it.Take(it.Cycle(slices.Values([]int{1, 2})), 5))

	fmt.Println(numbers)
}
Output:

[1 2 1 2 1]

func Cycle2

func Cycle2[V, W any](delegate iter.Seq2[V, W]) iter.Seq2[V, W]

Cycle2 yields pairs of values from an iterator repeatedly.

Note: this is an infinite iterator.

Note: memory usage will grow until all values from the underlying iterator are stored in memory.

Example
package main

import (
	"fmt"
	"maps"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	numbers := maps.Collect(it.Take2(it.Cycle2(maps.All(map[int]string{1: "one"})), 5))

	fmt.Println(numbers)
}
Output:

map[1:one]

func Drop

func Drop[V any](delegate iter.Seq[V], count int) iter.Seq[V]

Drop yields all values from a delegate [Iterator] except the first `count` values.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	for value := range it.Drop(slices.Values([]int{1, 2, 3, 4, 5}), 2) {
		fmt.Println(value)
	}

}
Output:

3
4
5

func Drop2

func Drop2[V, W any](delegate iter.Seq2[V, W], count int) iter.Seq2[V, W]

Drop2 yields all pairs of values from a delegate [Iterator2] except the first `count` pairs.

Example
package main

import (
	"fmt"
	"maps"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	numbers := maps.Collect(it.Drop2(maps.All(map[int]string{1: "one", 2: "two", 3: "three"}), 1))

	fmt.Println(len(numbers))
}
Output:

2

func Enumerate

func Enumerate[V any](delegate iter.Seq[V]) iter.Seq2[int, V]

Enumerate yields pairs of indices and values from an iterator.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	for index, value := range it.Enumerate(slices.Values([]int{1, 2, 3})) {
		fmt.Println(index, value)
	}

}
Output:

0 1
1 2
2 3

func Exclude

func Exclude[V any](delegate iter.Seq[V], predicate func(V) bool) iter.Seq[V]

Exclude yields values from an iterator that do not satisfy a predicate.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
	"github.com/BooleanCat/go-functional/v2/it/filter"
)

func main() {
	for number := range it.Exclude(slices.Values([]int{1, 2, 3, 4, 5}), filter.IsEven) {
		fmt.Println(number)
	}

}
Output:

1
3
5

func Exclude2

func Exclude2[V, W any](delegate iter.Seq2[V, W], predicate func(V, W) bool) iter.Seq2[V, W]

Exclude2 yields values from an iterator that do not satisfy a predicate.

Example
package main

import (
	"fmt"
	"maps"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	isOne := func(n int, _ string) bool { return n == 1 }
	numbers := map[int]string{1: "one", 3: "three"}

	for key, value := range it.Exclude2(maps.All(numbers), isOne) {
		fmt.Println(key, value)
	}

}
Output:

3 three

func Exhausted

func Exhausted[V any]() iter.Seq[V]

Exhausted is an iterator that yields no values.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	fmt.Println(len(slices.Collect(it.Exhausted[int]())))
}
Output:

0

func Exhausted2

func Exhausted2[V, W any]() iter.Seq2[V, W]

Exhausted2 is an iterator that yields no values.

Example
package main

import (
	"fmt"
	"maps"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	fmt.Println(len(maps.Collect(it.Exhausted2[int, string]())))
}
Output:

0

func Filter

func Filter[V any](delegate iter.Seq[V], predicate func(V) bool) iter.Seq[V]

Filter yields values from an iterator that satisfy a predicate.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
	"github.com/BooleanCat/go-functional/v2/it/filter"
)

func main() {
	for number := range it.Filter(slices.Values([]int{1, 2, 3, 4, 5}), filter.IsEven) {
		fmt.Println(number)
	}

}
Output:

2
4

func Filter2

func Filter2[V, W any](delegate iter.Seq2[V, W], predicate func(V, W) bool) iter.Seq2[V, W]

Filter2 yields values from an iterator that satisfy a predicate.

Example
package main

import (
	"fmt"
	"maps"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	isOne := func(n int, _ string) bool { return n == 1 }
	numbers := map[int]string{1: "one", 2: "two", 3: "three"}

	for key, value := range it.Filter2(maps.All(numbers), isOne) {
		fmt.Println(key, value)
	}

}
Output:

1 one

func ForEach

func ForEach[V any](iter iter.Seq[V], fn func(V))

ForEach consumes an iterator and applies a function to each value yielded.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	it.ForEach(slices.Values([]int{1, 2, 3}), func(number int) {
		fmt.Println(number)
	})
}
Output:

1
2
3

func ForEach2

func ForEach2[V, W any](iter iter.Seq2[V, W], fn func(V, W))

ForEach2 consumes an iterator and applies a function to each pair of values.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	it.ForEach2(it.Enumerate(slices.Values([]int{1, 2, 3})), func(index int, number int) {
		fmt.Println(index, number)
	})
}
Output:

0 1
1 2
2 3

func FromChannel

func FromChannel[V any](channel <-chan V) iter.Seq[V]

FromChannel yields values from a channel.

In order to avoid a deadlock, the channel must be closed before attempting to called `stop` on a pull-style iterator.

Example
package main

import (
	"fmt"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	items := make(chan int)

	go func() {
		defer close(items)
		items <- 1
		items <- 2
	}()

	for number := range it.FromChannel(items) {
		fmt.Println(number)
	}

}
Output:

1
2

func Map

func Map[V, W any](delegate iter.Seq[V], transform func(V) W) iter.Seq[W]

Map yields values from an iterator that have been transformed by a function.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	double := func(n int) int { return n * 2 }

	for number := range it.Map(slices.Values([]int{1, 2, 3}), double) {
		fmt.Println(number)
	}

}
Output:

2
4
6

func Map2

func Map2[V, W, X, Y any](delegate iter.Seq2[V, W], transform func(V, W) (X, Y)) iter.Seq2[X, Y]

Map2 yields pairs of values from an iterator that have been transformed by a function.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	doubleBoth := func(n, m int) (int, int) { return n * 2, m * 2 }

	for left, right := range it.Map2(it.Zip(slices.Values([]int{1, 2, 3}), slices.Values([]int{2, 3, 4})), doubleBoth) {
		fmt.Println(left, right)
	}

}
Output:

2 4
4 6
6 8

func Reduce

func Reduce[V any, R any](iter iter.Seq[V], fn func(R, V) R, initial R) R

Reduce consumes an iterator and applies a function to each value yielded, accumulating a single result.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
	"github.com/BooleanCat/go-functional/v2/it/op"
)

func main() {
	fmt.Println(it.Reduce(slices.Values([]int{1, 2, 3}), op.Add, 0))
}
Output:

6

func Reduce2

func Reduce2[V, W any, R any](iter iter.Seq2[V, W], fn func(R, V, W) R, initial R) R

Reduce2 consumes an iterator and applies a function to each pair of values, accumulating a single result.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	fmt.Println(it.Reduce2(it.Enumerate(slices.Values([]int{1, 2, 3})), func(i, a, b int) int {
		return i + 1
	}, 0))

}
Output:

3

func Repeat

func Repeat[V any](value V) iter.Seq[V]

Repeat yields the same value indefinitely.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	numbers := slices.Collect(it.Take(it.Repeat(42), 2))

	fmt.Println(numbers)
}
Output:

[42 42]

func Repeat2

func Repeat2[V, W any](value1 V, value2 W) iter.Seq2[V, W]

Repeat2 yields the same two values indefinitely.

Example
package main

import (
	"fmt"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	numbers := it.Take2(it.Repeat2(42, "Life"), 2)

	for v, w := range numbers {
		fmt.Println(v, w)
	}

}
Output:

42 Life
42 Life

func Take

func Take[V any](delegate iter.Seq[V], limit int) iter.Seq[V]

Take yields the first `limit` values from a delegate [Iterator].

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	for number := range it.Take(slices.Values([]int{1, 2, 3, 4, 5}), 3) {
		fmt.Println(number)
	}

}
Output:

1
2
3

func Take2

func Take2[V, W any](delegate iter.Seq2[V, W], limit int) iter.Seq2[V, W]

Take2 yields the first `limit` pairs of values from a delegate [Iterator2].

Example
package main

import (
	"fmt"
	"maps"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	numbers := maps.Collect(it.Take2(maps.All(map[int]string{1: "one", 2: "two", 3: "three"}), 2))

	fmt.Println(len(numbers))
}
Output:

2

func ToChannel

func ToChannel[V any](seq iter.Seq[V]) <-chan V

ToChannel sends yielded values to a channel.

The channel is closed when the iterator is exhausted. Beware of leaked go routines when using this function with an infinite iterator.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	channel := it.ToChannel(slices.Values([]int{1, 2, 3}))

	for number := range channel {
		fmt.Println(number)
	}

}
Output:

1
2
3

func Unzip

func Unzip[V, W any](delegate iter.Seq2[V, W]) (iter.Seq[V], iter.Seq[W])

Unzip returns two [Iterator]s from a single [Iterator2].

Each returned [Iterator] yields the left and right values from the original [Iterator2], respectively.

It is safe to concurrently pull from the returned [Iterator]s.

Both returned [Iterator]s must be stopped, the underlying [Iterator2] is stopped when both are stopped. It is safe to stop one of the returned [Iterator]s immediately and continue pulling from the other.

Example
package main

import (
	"fmt"
	"maps"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	keys, values := it.Unzip(maps.All(map[int]string{1: "one", 2: "two"}))

	for key := range keys {
		fmt.Println(key)
	}

	for value := range values {
		fmt.Println(value)
	}
}

func Zip

func Zip[V, W any](left iter.Seq[V], right iter.Seq[W]) iter.Seq2[V, W]

Zip yields pairs of values from two iterators.

Example
package main

import (
	"fmt"
	"slices"

	"github.com/BooleanCat/go-functional/v2/it"
)

func main() {
	for left, right := range it.Zip(slices.Values([]int{1, 2, 3}), slices.Values([]string{"one", "two", "three"})) {
		fmt.Println(left, right)
	}

}
Output:

1 one
2 two
3 three

Types

This section is empty.

Directories

Path Synopsis
This package contains functions intended for use with [iter.Filter].
This package contains functions intended for use with [iter.Filter].

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL