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