@@ -5,10 +5,12 @@ import reactify.{Listener, Observable, State, Transaction}
55class StateInstanceManager [T ](state : State [T ],
66 cache : Boolean ,
77 recursion : RecursionMode ,
8- transactional : Boolean ) {
8+ transactional : Boolean ,
9+ onUpdate : Boolean ) {
910 @ volatile private var previousValue : T = _
1011 @ volatile private var instance : StateInstance [T ] = StateInstance .empty[T ]
1112 @ volatile private [reactify] var observables : Set [Observable [_]] = Set .empty
13+ @ volatile private var updateTransaction : Option [Transaction ] = None
1214 private val threadLocal = new ThreadLocal [StateInstance [T ]] {
1315 override def initialValue (): StateInstance [T ] = StateInstance .uninitialized[T ]
1416 }
@@ -33,9 +35,29 @@ class StateInstanceManager[T](state: State[T],
3335 }
3436 }
3537
38+ def isDirty : Boolean = updateTransaction.nonEmpty
39+
40+ def update (): Boolean = synchronized {
41+ updateTransaction.exists { t =>
42+ t.commit()
43+ updateTransaction = None
44+ true
45+ }
46+ }
47+
3648 def updateInstance (force : Boolean = false ): Unit = synchronized {
3749 if (! force && transactional && Transaction .inTransaction) {
3850 Transaction .update(this , None )
51+ } else if (! force && onUpdate && ! instance.isEmpty) {
52+ val transaction = updateTransaction match {
53+ case Some (t) => t
54+ case None => {
55+ val t = new Transaction ()
56+ updateTransaction = Some (t)
57+ t
58+ }
59+ }
60+ transaction.update(this , None )
3961 } else {
4062 // Reset cache
4163 instance.reset()
@@ -76,6 +98,16 @@ class StateInstanceManager[T](state: State[T],
7698 def replaceInstance (f : () => T , force : Boolean = false ): Unit = synchronized {
7799 if (! force && transactional && Transaction .inTransaction) {
78100 Transaction .update(this , Some (f))
101+ } else if (! force && onUpdate && ! instance.isEmpty) {
102+ val transaction = updateTransaction match {
103+ case Some (t) => t
104+ case None => {
105+ val t = new Transaction ()
106+ updateTransaction = Some (t)
107+ t
108+ }
109+ }
110+ transaction.update(this , Some (f))
79111 } else {
80112 val previous = recursion match {
81113 case RecursionMode .Static => StateInstance .empty[T ]
0 commit comments