Hi. I&#39;m writing GUI (gtk) program which purpose is take some data as user input, perform some evaluations, and produce some plots and coefficients.<br>Since some evaluations take significant time (about 10 seconds), I try to cache results. The problem is that dependency structure is quite complicated, something like this:<br>
<br>   a* -&gt; x, b*<br>   x -&gt; c<br>   x, b* -&gt; d<br><br>where<br>  α -&gt; β means that β depends on α<br>  values designated by <b>a</b>,<b>b</b>,<b>c</b>,<b>d</b> can be showed to user by request, and <b>x</b> is internal value<br>
  values designated by letters with asterisk (<b>a</b>*,<b>b</b>*) can be edited by user<br><br>Consider <b>x</b>. I have two values:<br>    xCache :: IORef X<br>    xUpToDate :: IORef Bool<br><br>Initial state is:<br>    xCache &lt;- newIORef undefined<br>
    xUpToDate &lt;- newIORef False<br><br>Since <b>x</b> is evaluated once, I do<br>    xCache `writeIORef` x<br>    xUpToDate `writeIORef` True<br><br>When user changes the value of <b>a </b>and saves it, all dependent on <b>a </b>values cache is expired:<br>
    xUpToDate `writeIORef` False<br>    (recursively do it with all cache depends on <b>x</b>)<br><br>When it comes to handling all <b>a,b,c,d,x </b>dependencies the code becomes a mess. I now have something like<br><br>    import Data.Functor<br>
    import Data.IORef<br>    import Control.Monad<br><br>    data Mutable a = Mutable { ref :: IORef a, onChange :: IO () }<br><br>    change :: Mutable a -&gt; a -&gt; IO ()<br>    change Mutable {..} a = ref `writeIORef` a &gt;&gt; onChange<br>
<br>    data Cache a b = Cache { fn :: a -&gt; b, arg :: IORef a, cached :: IORef b, upToDate :: IORef Bool }<br><br>    expire :: Cache a b -&gt; IO ()<br>    expire Cache {..} = upToDate `writeIORef` False<br><br>    update :: Cache a b -&gt; IO ()<br>
    update Cache {..} = do<br>       utd &lt;- readIORef upToDate<br>       unless utd $ writeIORef cached =&lt;&lt; fn &lt;$&gt; readIORef arg<br><br>    test = do<br>      aRef &lt;- newIORef undefined<br>      xRef &lt;- newIORef undefined<br>
      xCache &lt;- Cache (^2) aRef xRef &lt;$&gt; newIORef False<br>      let aMut = Mutable aRef (expire xCache)<br>      aMut `change` 1<br>      update xCache<br>      print =&lt;&lt; readIORef xRef -- 1<br>      aMut `change` 2<br>
      print =&lt;&lt; readIORef xRef -- still 1<br>      update xCache<br>      print =&lt;&lt; readIORef xRef -- now 4<br><br>I&#39;d like to know if there is some library that could help me.<br><br>(Sorry for my English)<br>
--<br>All the best,<br>Alexey<br>