Die Standardmodule std.range und std.algorithm bieten eine Vielfalt an großartigen Funktionen, die, basierend auf Ranges als Grundbausteinen, zu komplexen Operationen zusammengefügt werden konnen, und dies auf eine lesbare Art und Weise.
Das Großartige an diesen Algorithmen ist die Anwendbarkeit auf eigens definerte Ranges, sodass direkt vom Reichtum der Standardbibliothek profitiert werden kann.
filter
- Generiert eine neue Range aus gefilterten Elementen, wobei
die Filterbedingung als Lambdafunktion angegeben werden kann:
filter!"a > 20"(range);
filter!(a => a > 20)(range);
map
- Generiert eine neue Range unter Benutzung des als Template-Parameter
definierten Prädikats:
[1, 2, 3].map!(x => to!string(x));
each
- Alternative Variante von foreach
für Ranges:
[1, 2, 3].each!(a => writeln(a));
take
- Begrenzt die Range auf N Elemente:
theBigBigRange.take(10);
zip
- Iteriert parallel über zwei Ranges und bindet die Elemente
zu Tupeln:
assert(zip([1,2], ["hello","world"]).front
== tuple(1, "hello"));
generate
- Erzeugt eine Range basierend auf einer Funktion,
die bei jedem Iterationsschritt aufgerufen wird, z.B.:
alias RandomRange = generate!(x => uniform(1, 1000));
cycle
- Erzeugt eine Range, welche die gegebene Eingangs-Range
für immer wiederholt:
auto c = cycle([1]);
// Range wird nie leer werden!
assert(!c.empty);