On Thu, 27 Mar 2014 22:23:40 -0000, Anh Nhan <anhn...@outlook.com> wrote:

Hey guys,

I want to iterate over an array, while adding new entries, and have those in the iteration loop.

See here: https://gist.github.com/AnhNhan/9820226

The problem is that the foreach loop seemingly only iterates over the original array, not minding the newly added entries.

Does somebody have a solution or approach for the loop to pick up those new entries?

Wrap the array in an adapter class/struct which implements opApply for foreach...

import std.stdio;
import std.conv;

struct ForAdd(T)
{
  T[] data;

  this(T[] _data)  { data = _data; }

  void opOpAssign(string op : "~")(T rhs) { data ~= rhs; }

  int opApply(int delegate(ref T) dg)
  {
    int result = 0;

    for (int i = 0; i < data.length; i++)
    {
      result = dg(data[i]);
      if (result)
        break;
    }

    return result;
  }
}

int main(string[] args)
{
  string[] test;

  for(int i = 0; i < 5; i++)
    test ~= to!string(i);

  auto adder = ForAdd!string(test);
  foreach(string item; adder)
  {
    writefln("%s", item);
    if (item == "2")
      adder ~= "5";
    if (item == "4")
      adder ~= "6";
    if (item == "5")
      adder ~= "7";
  }

  return 0;
}

R

--
Using Opera's revolutionary email client: http://www.opera.com/mail/

Reply via email to