Les modules de la librairie standard std.range et std.algorithm fournissent une multitude de fonctions qui peuvent être composées pour former des opérations complexes de façon lisible, et ce en se basant sur les ranges.
Le grand avantage de ces algorithmes est qu'il suffit de définir votre propre range et vous pourrez directement profiter de toute la puissance de la librairie standard.
filter
— À partir d'un lambda en paramètre de modèle, génère une nouvelle range d'éléments qui retournent vrai quand passés au lambda:
filter!"a > 20"(range);
filter!(a => a > 20)(range);
map
— Génère une nouvelle range où le prédicat passé en paramètre de schéma est appliqué à tous les éléments:
[1,2,3].map!(x => to!string(x));
each
— Une alternative à foreach
pour appliquer une opération sur chaque élément d'une range:
[1,2,3].each!(a => writeln(a))
take
— retourne N éléments d'une range:
laTresTresGrandeRange.take(10);
zip
— itère sur deux ranges en parallèle et retourne un tuple des deux éléments pendant son itération:
assert(zip([1,2], ["coucou", "vous"]).front
== tuple(1, "hello"));
generate
— prend une fonction et crée une range qui appelle la fonction à chaque itération, par exemple:
alias RandomRange = generate!(x => uniform(1, 1000));
cycle
— retourne une range qui répète la range fournie en entrée à l'infinie:
auto c = cycle([1]);
// la range ne sera jamais vide!
assert(!c.empty);