謎's キッチン

謎のひとりごと。Amazon欲しい物リストはこちら: https://www.amazon.co.jp/hz/wishlist/ls/CCPOV7C6JTD2

内部イテレータを外部イテレータにする

yield無くてもthreadあれば楽勝…と思ってたが、仕様の壁だらけ。foo++のオペレーターオーバーロードの挙動が酷い。
それと関数の戻り値にautoが使えないのが色々ときついなぁ。そういえば実装の予定がされているstatic foreachってスコープありだっけ? 無しだっけ?
#それとpause/resumeって確かJavaだと非推奨扱いになってたと思うけど何でだっけか。スレッドのモニタに問題起こる? それとも単純にモニタ使えってこと?

import std.stdio, std.thread;

class Iterator(T, U){//スレッドアンセーフなのでよろ
  private T value;
  private bool end = false;
  private Thread th;
  this(U obj){
    th = new Thread(delegate int(){
      foreach(i;obj){
        value = i;
        th.pause;
      }
      end = true;
      return 0;
    });
    th.start;
  }
  T opStar(){
    return value;
  }
//  Iterator!(T, U) opPostInc(){//戻り値が使用されないし遅延してもくれない…
  Iterator!(T, U) opAdd(int i){ assert(i==1);
    th.resume;
    Thread.getThis().yield;
    if(end) return null;
    return this;
  }
}

/*itertype*/Object createItarator(T)(T t){
  foreach(i;t){
    alias Iterator!(typeof(i), T) itertype;
    return new itertype(t);
  }
}


void main(){
  int[] foo=[1,2,3,4,5];
  auto iter = cast(Iterator!(int,int[]))createItarator(foo);
  for(;iter;/*iter++*/iter=iter+1)
    writefln(*iter);
}