1 module frpd.cell.settable_cell; 2 3 import std.algorithm; 4 import frpd.cell.cell : Cell, CellListener; 5 6 /** A cell managed/set in non-frp code. 7 The most basic entry point of data into the frp tree. 8 Simply use the `value` property to set (`settableCell.value = newValue`). 9 */ 10 class SettableCell(T) : Cell!T { 11 public { 12 /// Create with a starting value. 13 this(T v) { 14 currentValue = v; 15 } 16 /// Set current value 17 @property void value(T v) { 18 currentValue = v; 19 onValueReady; 20 } 21 /// Get current value. 22 override @property T value() { 23 return currentValue; 24 } 25 } 26 private { 27 T currentValue; 28 } 29 } 30 /** Create a settable cell. 31 Takes the starting value. 32 */ 33 SettableCell!T cell(T)(T v) { 34 return new SettableCell!T(v); 35 } 36 37 38 39 40 unittest { 41 { 42 SettableCell!int a = cell!int(1); 43 auto b = cell(2); 44 45 assert(a.value==1); 46 assert(b.value==2); 47 48 a.value = 3; 49 50 assert(a.value==3); 51 assert(b.value==2); 52 } 53 //---test push 54 { 55 class B : CellListener { 56 bool valueReady = false; 57 void onValueReady() { 58 valueReady = true; 59 } 60 void push() { 61 valueReady = false; 62 } 63 } 64 65 auto a = cell(1); 66 B b = new B; 67 a.listeners~=b; 68 69 a.value = 4; 70 assert(b.valueReady); 71 a.push; 72 assert(!b.valueReady); 73 } 74 } 75 76 77 78 79