Algorithmes de ranges

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.

std.algorithm

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

std.range

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

La documentation est la référence absolue pour découvrir d'autres fonctions

Pour aller plus loin

rdmd playground.d