Алгоритми діапазонів

Стандартні модулі std.range і std.algorithm забезпечують безліч чудових функцій, які можуть поєднуватись для реалізації складних операцій у доволі читабельний вигляд, основуючись на діапазонах в якості будівельних блоків.

Найбільша перевага цих алгоритмів у тому, що від вас вимагається лише визначити свій власний діапазон. Потім зможете насолоджуватися усіма перевагами стандартної бібліотеки.

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));

std.range

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);

Документація чекає вашого візиту!

Поглиблення

rdmd playground.d