11package reactify
22
3+ import java .util .concurrent .atomic .AtomicBoolean
4+
5+ import reactify .bind .{BindSet , Binding }
6+
7+ import scala .concurrent .Future
8+
39/**
410 * Dep is very much like a `Val`, but is also a `Channel`. The basic purpose is to represent a value dependent upon
511 * another variable. An example of this might be if you are representing a position `left` and you also wanted to
@@ -17,41 +23,43 @@ package reactify
1723 * if you change `width` to 50.0? Should `left` change to 75.0 (`submissive = false`) or should `right` change to 75.0
1824 * (`submissive = true`)?
1925 */
20- class Dep [T , V ](variable : Var [V ],
21- adjustment : => T ,
22- submissive : Boolean )
23- (implicit connector : DepConnector [T , V ]) extends StateChannel [T ] {
24- private val internal = Val [T ](connector.combine(variable, adjustment))
25-
26- override def attach (f : (T ) => Unit , priority : Double = Listener .Priority .Normal ): Listener [T ] = {
27- internal.attach(f, priority)
28- }
29-
30- override def detach (listener : Listener [T ]): Unit = internal.detach(listener)
31-
32- override def changes (listener : ChangeListener [T ]): Listener [T ] = internal.changes(listener)
33-
34- override protected [reactify] def fire (value : T ): Unit = {}
35-
36- override def set (value : => T ): Unit = set(value, submissive)
37-
38- override def observing : Set [Observable [_]] = internal.observing
39-
40- override def get : T = internal.get
41-
42- def set (value : => T , submissive : Boolean ): Unit = {
43- if (submissive) {
44- val adj : T = adjustment
45- variable := connector.extract(value, adj)
46- } else {
47- variable := connector.extract(value, adjustment)
48- }
49- }
50-
51- override def apply (): T = internal.apply()
52-
53- override def toString : String = s " Dep( $get) "
54- }
26+ // class Dep[T, V](variable: Var[V],
27+ // adjustment: => T,
28+ // submissive: Boolean)
29+ // (implicit connector: DepConnector[T, V]) extends StateChannel[T] {
30+ // override def distinct: Boolean = true
31+ //
32+ // override protected def value(): T = internal.get
33+ //
34+ // private val internal = Val[T](connector.combine(variable, adjustment))
35+ //
36+ // override def attach(f: (T) => Unit, priority: Double = Listener.Priority.Normal): Listener[T] = {
37+ // internal.attach(f, priority)
38+ // }
39+ //
40+ // override def detach(listener: Listener[T]): Unit = internal.detach(listener)
41+ //
42+ // override def changes(listener: ChangeListener[T]): Listener[T] = internal.changes(listener)
43+ //
44+ // override protected[reactify] def fire(value: T): Unit = {}
45+ //
46+ // override def set(value: => T): Unit = set(value, submissive)
47+ //
48+ // override def observing: Set[Observable[_]] = internal.observing
49+ //
50+ // def set(value: => T, submissive: Boolean): Unit = {
51+ // if (submissive) {
52+ // val adj: T = adjustment
53+ // variable := connector.extract(value, adj)
54+ // } else {
55+ // variable := connector.extract(value, adjustment)
56+ // }
57+ // }
58+ //
59+ // override def apply(): T = internal.apply()
60+ //
61+ // override def toString: String = s"Dep($get)"
62+ // }
5563
5664object Dep {
5765 /**
@@ -63,10 +71,73 @@ object Dep {
6371 *
6472 * @return dependency instance
6573 */
74+ // def apply[T, V](variable: Var[V],
75+ // adjustment: => T,
76+ // submissive: Boolean = false)
77+ // (implicit connector: DepConnector[T, V]): Dep[T, V] = {
78+ // new Dep[T, V](variable, adjustment, submissive)
79+ // }
80+
6681 def apply [T , V ](variable : Var [V ],
6782 adjustment : => T ,
6883 submissive : Boolean = false )
6984 (implicit connector : DepConnector [T , V ]): Dep [T , V ] = {
85+ // val v = Var[T](connector.combine(variable, adjustment))
86+ // v.bind(variable, BindSet.None)(
87+ // t2v = (t: T) => connector.extract(t, adjustment),
88+ // v2t = (v: V) => connector.combine(v, adjustment)
89+ // )
90+ // v
7091 new Dep [T , V ](variable, adjustment, submissive)
7192 }
72- }
93+ }
94+
95+ class Dep [T , V ](variable : Var [V ],
96+ adjustment : => T ,
97+ submissive : Boolean )
98+ (implicit connector : DepConnector [T , V ]) extends Var [T ](() => connector.combine(variable, adjustment)) {
99+ assert(! submissive, " Submissive is currently disabled until it can be more thoroughly tested." )
100+
101+ override def set (value : => T ): Unit = set(value, submissive)
102+
103+ private lazy val changing = new AtomicBoolean (false )
104+
105+ def set (value : => T , submissive : Boolean ): Unit = if (changing.compareAndSet(false , true )) {
106+ try {
107+ super .set(value)
108+ if (submissive) {
109+ val adj : T = adjustment
110+ variable := connector.extract(get, adj)
111+ } else {
112+ variable := connector.extract(get, adjustment)
113+ }
114+ } finally {
115+ changing.set(false )
116+ }
117+ }
118+
119+ variable.attach { v =>
120+ if (changing.compareAndSet(false , true )) {
121+ try {
122+ super .set(connector.combine(variable, adjustment))
123+ } finally {
124+ changing.set(false )
125+ }
126+ }
127+ }
128+ }
129+
130+ /*
131+ class Dep[T, V](variable: Var[V],
132+ adjustment: => T,
133+ submissive: Boolean)
134+ (implicit connector: DepConnector[T, V]) extends Val[T](() => connector.combine(variable, adjustment)) with StateChannel[T] {
135+ override def set(value: => T): Unit = {
136+ if (submissive) {
137+ val adj: T = adjustment
138+ variable := connector.extract(get, adj)
139+ } else {
140+ variable := connector.extract(get, adjustment)
141+ }
142+ }
143+ }*/
0 commit comments