Is it possible to write an iterator that does the following, using a struct and some functions?

 - Operates in a foreach loop
- Has BEGIN-like and END-like blocks or functions that are executed automatically, before and after the iterations - Initializes variables in the BEGIN block that are used in the other two. These variables are for internal use only, i.e. must not be accessible to the user of the foreach loop

I'd like to use the simplest solution while keeping the code clean. As a starting point, here's a contrived example using a struct with a range-style iterarator:

  import std.stdio;

  struct letters {
    string str;
    int pos = 0;
    char front() { return str[pos]; }
    void popFront() { pos ++; }
    bool empty() {
      if (pos == 0) writeln(`BEGIN`);
      else if (pos == str.length) writeln("\nEND");
      return pos == str.length; }}

  void main() {
    foreach (letter; letters(`hello`)) {
      write(letter, ' '); }
    writeln(); }

The obvious problems with this code include:

(1) The user can pass a second argument, which will set the initial value of pos. This must not be allowed. (The real code will need to initialize a half dozen internal-only variables, and do some additional work, before the looping starts.)

(2) Sticking the code for the BEGIN and END blocks into the empty() function is ugly.

Can this iterator be written using a range-style struct? Or is something more complicated needed, like an OO solution?

I should add that the final version of this will be put in a separate module, possibly in a library, so I can call it from many programs. Not sure if that might help simplify things.

Thanks for your guidance.

Reply via email to