module frpd.stream.listener;

import std.algorithm;
import frpd.stream._add_listener : listenTo;
import frpd.stream.stream : Stream, StreamListener;

/**	Create a simple function listener for a stream.
	To be called with all events.
*/
template addListener(alias f){
	private {
		import std.traits : Parameters;
		alias F = typeof(f);
		alias Params = Parameters!F;
		static assert(Params.length==1, "Stream listener can only take argument.");
		alias Param = Params[0];
		
		class Listener : StreamListener!Param {
			//---values
			size_t eventsComming;
			
			//---metods
			void onEventsComming() {}
			void push(Param[] es) {
				es.each!(e=>f(e));
			}
		}
	}
	void addListener(Stream!Param s) {
		auto l = new Listener();
		l.listenTo(s);
	}
}


unittest {
	import frpd.stream.sink_stream : stream;
	
	auto s = stream!int;
	
	int lastEvent = 0;
	s.addListener!((int e){lastEvent=e;});
	
	s.put(1);
	assert(lastEvent==1);
	s.put(2);
	assert(lastEvent==2);
}