Стандартні модулі 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);