package Ġcom . pr 0 gram m . app . util Ċ Ċ import Ġcom . pr 0 gram m . app . Logger Ċ Ċ class ĠState Transaction < V Ġ: ĠAny >( private Ġval Ġvalue Supplier : Ġ() Ġ-> ĠV , Ġprivate Ġval Ġapply Change : Ġ() Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLogger (" State Transaction ") ĊĠĠĠ Ġprivate Ġvar Ġtx Level Ġ= Ġ 0 ĊĊĠĠĠ Ġoperator Ġfun Ġ< T > Ġinvoke ( dispatch : ĠDispatch Ġ= ĠDispatch . CHANGED , Ġtx : Ġ() Ġ-> ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck MainThread () ĊĊĠĠĠĠĠĠĠ Ġval Ġprevious State Ġ= Ġvalue Supplier () ĊĊĠĠĠĠĠĠĠ Ġtx Level ++ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx () ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtx Level -- ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( dispatch Ġ=== ĠDispatch . NE VER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Not Ġdoing Ġstate Ġupdate , Ġcause Ġdispatch = NE VER " Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( dispatch Ġ=== ĠDispatch . ALWAYS Ġ|| Ġ(! isActive Ġ&& Ġprevious State Ġ!= Ġvalue Supplier ())) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ" Running Ġdeferred Ġstate Ġupdate Ġin Ġtransaction " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapply Change () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠisActive : ĠBoolean Ġget () Ġ= Ġtx Level Ġ> Ġ 0 ĊĊĠĠĠ Ġenum Ġclass ĠDispatch Ġ{ ĊĠĠĠĠĠĠĠ ĠAL WAYS , ĠCH ANG ED , ĠNE VER ĊĠĠĠ Ġ} Ċ } Ċ