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