Стандартні модулі std.range і std.algorithm забезпечують безліч чудових функцій, які можуть поєднуватись для реалізації складних операцій у доволі читабельний вигляд, основуючись на діапазонах в якості будівельних блоків.
Найбільша перевага цих алгоритмів у тому, що від вас вимагається лише визначити свій власний діапазон. Потім зможете насолоджуватися усіма перевагами стандартної бібліотеки.
filter
- лямбда, подана в якості параметра шаблону, генерує новий
діапазон з відфільтрованими елементами:
filter!"a > 20"(range);
filter!(a => a > 20)(range);
map
- генерує новий діапазон, використовуючи предикат, визначений як
параметр шаблону:
[1, 2, 3].map!(x => to!string(x));
each
- аналог функції foreach
для перебору діапазонів:
[1, 2, 3].each!(a => writeln(a));
take
- обмежує до N елементів:
theBigBigRange.take(10);
zip
- обходить паралельно два діапазони, повертаючи кортеж з обох
діапазонів під час ітерациії:
assert(zip([1,2], ["hello","world"]).front
== tuple(1, "hello"));
generate
- на основі функції створює діапазон,
який у свою чергу викликає ії під час кожної ітерації, наприклад:
alias RandomRange = generate!(x => uniform(1, 1000));
cycle
- повертає діапазон, який завжди повторюватиме заданий вхідний
діапазон.
auto c = cycle([1]);
// діапазон ніколи не буде порожнім!
assert(!c.empty);