...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

FiberRange

特に意義はない.

import std.stdio;
import std.conv;
import std.range;
import core.thread;

class A
{
	int x, y;
	string toString()
	{
		return "(" ~ to!(string)(x) ~ "," ~ to!(string)(y) ~ ")";
	}
}

void fun(A a)
{
	// writeln
	
	a.x++;//1,0
	Fiber.yield();
	// writeln
	
	a.y++;//1,1
	Fiber.yield();
	// writeln
	
	a.x++;//2,1
	a.y++;//2,2
	// writeln
}

struct FiberRange(FiberT)
{
	private FiberT f;
	this(FiberT f)
	{
		this.f = f;
	}
	void popFront()
	{
		f.call();
	}
	FiberT front()
	{
		return f;
	}
	bool empty()
	{
		return f.state == Fiber.State.TERM;
	}
}
unittest
{
	static assert(isInputRange!(FiberRange!Fiber));
}

void main()
{
	A a = new A;
	auto f = new Fiber({fun(a);});
	auto fr = FiberRange!(Fiber)(f);
	foreach (e; fr)
	{
		writeln(a);
	}
	writeln(a);
}

追記

あ−.だいたい,foreach の e を使ってないじゃないか.