Summary: Deprecate std.range.lockstep
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: Phobos

--- Comment #0 from 2012-05-27 14:20:51 PDT ---
I suggest to deprecate std.range.lockstep because with the recent improvements
in tuple unpacking, is able to replace its the main purpose, this
now works:

import std.stdio, std.range;
void main() {
    foreach (a, b; zip([1,2], ["red", "blue"]))
        writeln(a, " ", b);

lockstep() is also able to iterate with an index variable, zip() is not able to
do it:

import std.stdio, std.range;
void main() {
    foreach (i, a, b; lockstep([1,2], ["red", "blue"]))
        writeln(i, " ", a, " ", b);

But from my experience the need of an indexing variable on a zipped iteraton is
not so common, and the there are other solutions, like:

import std.stdio, std.range;
void main() {
    foreach (i, a, b; lockstep(iota([1,2].length), [1,2], ["red", "blue"]))
        writeln(i, " ", a, " ", b);

A better solution (hopefully not too much slower) is to use enumerate(zip()),
as in Python and Haskell, see Issue 5550 :

import std.stdio, std.algorithm, std.range, std.typecons, std.traits,

struct Enumerate(R) {
    R r;
    int i;

    @property bool empty() {
        return this.r.empty;

    @property Tuple!(typeof(this.i), typeof(R.init.front)) front() {
        return typeof(return)(i, this.r.front);

    void popFront() {

Enumerate!R enumerate(R)(R range, int start=0) if (isInputRange!R) {
    return Enumerate!R(range, start);

void main() {
    foreach (i, a, b; enumerate(zip([1,2], ["red", "blue"])))
        writeln(i, " ", a, " ", b);

Or even use countFrom (similar to Python itertools.count()), see Issue 7839 :

import std.stdio, std.range;

struct CountFrom(T) {
    T n;
    this(T n_) { this.n = n_; }
    const bool empty = false;
    @property T front() { return n; }
    void popFront() { /* n++; */ n += 1; }

CountFrom!T countFrom(T)(T start) { return CountFrom!T(start); }
CountFrom!T countFrom(T)() { return CountFrom!T(cast(T)0); }

void main() {
    foreach (i, a, b; zip(countFrom!size_t(), [1,2], ["red", "blue"]))
        writeln(i, " ", a, " ", b);

(For Phobos there are much more commonly useful functions, like amap/afilter
that mean array(map()) and array(filter()) that are useful everywhere and
shorten/simplify the code).

Configure issuemail:
------- You are receiving this mail because: -------

Reply via email to