Пакет Itertools
Пакет itertools предоставляет класс Iter для выполнения полезных операций с итераторами. Он вдохновлён библиотекой itertools языка Python, итераторами Rust, а также модулями Enum и Stream языка Elixir.
Итератор
Класс Iter оборачивает итераторы, позволяя применять к ним дополнительные методы. Некоторые методы, такие как fold и collect, обрабатывают базовый итератор для получения результата. Другие методы, такие как map и filter, являются ленивыми. Это означает, что они возвращают другой итератор Iter, поэтому результирующие значения вычисляются по одному по мере необходимости. Ленивые методы возвращают типы Iter.
Например, следующий код создаёт Iter из значений массива, содержащего числа от 1 до 5, увеличивает каждое число на единицу, фильтрует нечётные числа и выводит оставшиеся.
let xs = Iter[I64]([1; 2; 3; 4; 5].values())
.map[I64]({(x) => x + 1 })
.filter({(x) => (x % 2) == 0 })
.map[None]({(x) => env.out.print(x.string()) })
Это приведет к итератору, который выведет числа 2, 4 и 6. Однако из-за ленивой природы методов map и filter фактически не происходит итерации, и ничего не будет выведено. Одним из решений было бы проитерировать полученный Iter следующим образом:
for x in xs do None end
Это запустит итерацию и выведет значения 2, 4 и 6. Именно здесь пригождается метод run, который выполняет итерацию без необходимости цикла. Итак, окончательный код будет следующим:
Iter[I64]([1; 2; 3; 4; 5].values())
.map[I64]({(x) => x + 1 })
.filter({(x) => (x % 2) == 0 })
.map[None]({(x) => env.out.print(x.string()) })
.run()
Вывод:
2 4 6
Типы
© 2016-2020, The Pony Developers
© 2014-2015, Causality Ltd.
Licensed under the BSD 2-Clause License.
https://stdlib.ponylang.io/itertools--index