1 module frpd.stream._add_listener;
2 
3 import std.algorithm;
4 import frpd.stream.stream : Stream, StreamListener;
5 
6 /**
7 	Add a StreamListener to a stream.
8 	To get informed of changes.
9 */
10 void addListener(T)(Stream!T stream, StreamListener!T listener) {
11 	stream.listeners~=listener;
12 }
13 /// ditto
14 void listenTo(T)(StreamListener!T listener, Stream!T stream) {
15 	addListener(stream, listener);
16 }
17 /**
18 	Remove a StreamListener from a stream.
19 */
20 void removeListener(T)(Stream!T stream, StreamListener!T listener) {
21 	stream.listeners = stream.listeners.remove(stream.listeners.countUntil(listener));
22 }
23 /// ditto
24 void unlistenTo(T)(StreamListener!T listener, Stream!T stream) {
25 	removeListener(stream, listener);
26 }
27 
28 
29 unittest {
30 	import frpd.stream.sink_stream : stream;
31 	class B : StreamListener!int {
32 		bool eventsComming = false;
33 		int last = 0;
34 		void onEventsComming() {
35 			eventsComming = true;
36 		}
37 		void push(int[] a) {
38 			last = a[$-1];
39 			eventsComming = false;
40 		}
41 	}
42 	{
43 		auto a = stream!int;
44 		auto b = new B;
45 		assert(!b.eventsComming);
46 		assert(b.last==0);
47 		a.addListener(b);
48 		a.bufferPut([1]);
49 		assert(b.eventsComming);
50 		assert(b.last==0);
51 		a.push;
52 		assert(!b.eventsComming);
53 		assert(b.last==1);
54 		a.put(2);
55 		assert(!b.eventsComming);
56 		assert(b.last==2);
57 		a.removeListener(b);
58 		a.bufferPut([3]);
59 		assert(!b.eventsComming);
60 		assert(b.last==2);
61 		a.push;
62 		assert(!b.eventsComming);
63 		assert(b.last==2);
64 	}
65 	{
66 		auto a = stream!int;
67 		auto b = new B;
68 		assert(!b.eventsComming);
69 		assert(b.last==0);
70 		b.listenTo(a);
71 		a.bufferPut([1]);
72 		assert(b.eventsComming);
73 		assert(b.last==0);
74 		a.push;
75 		assert(!b.eventsComming);
76 		assert(b.last==1);
77 		a.put(2);
78 		assert(!b.eventsComming);
79 		assert(b.last==2);
80 		b.unlistenTo(a);
81 		a.bufferPut([3]);
82 		assert(!b.eventsComming);
83 		assert(b.last==2);
84 		a.push;
85 		assert(!b.eventsComming);
86 		assert(b.last==2);
87 	}
88 }
89