1 module frpd.cell._add_listener;
2 
3 import std.algorithm;
4 import frpd.cell.cell : Cell, CellListener;
5 
6 /**
7 	Add a CellListener to a cell.
8 	To get informed of changes.
9 */
10 void addListener(T)(Cell!T cell, CellListener listener) {
11 	cell.listeners~=listener;
12 }
13 /// ditto
14 void listenTo(T)(CellListener listener, Cell!T cell) {
15 	addListener(cell, listener);
16 }
17 /**
18 	Remove a CellListener from a cell.
19 */
20 void removeListener(T)(Cell!T cell, CellListener listener) {
21 	cell.listeners = cell.listeners.remove(cell.listeners.countUntil(listener));
22 }
23 /// ditto
24 void unlistenTo(T)(CellListener listener, Cell!T cell) {
25 	removeListener(cell, listener);
26 }
27 
28 
29 unittest {
30 	import frpd.cell.settable_cell : cell;
31 	class B : CellListener {
32 		bool valueReady = false;
33 		void onValueReady() {
34 			valueReady = true;
35 		}
36 		void push() {
37 			valueReady = false;
38 		}
39 	}
40 	{
41 		auto a = cell(1);
42 		auto b = new B;
43 		assert(!b.valueReady);
44 		a.addListener(b);
45 		a.value = 2;
46 		assert(b.valueReady);
47 		b.valueReady = false;
48 		a.removeListener(b);
49 		a.value = 3;
50 		assert(!b.valueReady);
51 	}
52 	{
53 		auto a = cell(1);
54 		auto b = new B;
55 		assert(!b.valueReady);
56 		b.listenTo(a);
57 		a.value = 2;
58 		assert(b.valueReady);
59 		b.valueReady = false;
60 		b.unlistenTo(a);
61 		a.value = 3;
62 		assert(!b.valueReady);
63 	}
64 }
65