http://d.puremagic.com/issues/show_bug.cgi?id=5550
--- Comment #1 from bearophile_h...@eml.cc 2012-03-26 15:40:12 PDT --- This is a basic implementation of enumerate() (it's only an InputRange, but probably a richer range too should be supported). The demo code in main() shows the task of processing the Sieve of Eratosthenes flags without and with an enumerate(). The version with enumerate() is shorter and simpler to understand than the version with zip. import std.stdio, std.algorithm, std.range, std.typecons, std.traits, std.array; struct Enumerate(R) { R r; int i; alias r this; @property Tuple!(typeof(this.i), typeof(R.init.front)) front() { return typeof(return)(i, this.r.front); } void popFront() { this.r.popFront(); this.i++; } } Enumerate!R enumerate(R)(R range, int start=0) if (isInputRange!R) { return Enumerate!R(range, start); } void main() { // not prime flags, from a Sieve of Eratosthenes. // 0 = prime number, 1 = not prime number. starts from index 2. auto flags = [0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1, 0, 1]; // not using enumerate iota(2, int.max).zip(flags).filter!q{!a[1]}().map!q{a[0]}().writeln(); iota(int.max).zip(flags).filter!q{!a[1]}().map!q{a[0] + 2}().writeln(); // using enumerate //flags.enumerate(2).filter!q{!a[1]}().map!q{a[0]}().writeln(); // error filter!q{!a[1]}(flags.enumerate(2)).map!q{a[0]}().writeln(); } Note: this produces a compilation error, I don't know why yet, maybe it's a bad interaction with alias this: flags.enumerate(2).filter!q{!a[1]}().map!q{a[0]}().writeln(); -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------