...ing logging 4.0

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

mapしたのをchainできないのでappenderを使う

import std.stdio, std.array, std.range, std.algorithm;

int f(int e)
{
	return e * -1;
}

void main()
{
	int[] r = [-1,-2,-3,4,5,6];
	{
		int[] a = [1,2,3], b = [4,5,6];
		auto m = map!(f)(a);
		//auto x = chain(m,b); // chainがrangeのmを受け取ってくれない
	}
	{
		int[] a = [1,2,3], b = [4,5,6];
		auto m = map!(f)(a);
		auto x = appender!(int[])(); //コンストラクタはrangeを受け取ってくれない
		x.put(m);                    //putならrangeを受け取ってくれる
		x.put(b);
		assert(x.data == r);
	}
}

びっみょー!
可能かどうか考えていないけどコンストラクタがrangeを受け取ってくれたら x.put(m); なんていらないのに.
せめて put を void put(Range)(Range range); じゃなくて void put(Ranges...)(Ranges ranges); にしておくとか.
std.rangeとstd.arrayとstd.algorithm周り・・・というかrange周りはまだ作り込みが甘いのかな.