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