Michael,<br><br>The package Workflow has persistent timeouts (can wait for years and<br>restart on system failure if embedded in the workflow monad, <span class="Apple-style-span" style="font-style: italic;">although<br>it can run in the IO monad</span>, with no recovery). They are composable<br>

with any action in the STM monad with orElse:<br><br><div><br>   flag &lt;- getTimeoutFlag $  5*24*60 * 60    -- wait exactly 5 days. even<div>                                                              -- if the program restart<br>

   ap &lt;- step  .  atomically $  readSomewhere &gt;&gt; return False<br>                             `orElse`  waitUntilSTM flag  &gt;&gt; return True<br><br>   case ap of<br>                   False -&gt; print &quot;something received&quot;<br>

                   True  -&gt; print &quot;timeout&quot;<br><br></div><div><br></div><div><br>step&quot;  lift it from the IO to the workflow monad, and gives it<br>persistence and recovery.<br><br>without &quot;step&quot;, it runs in the IO monad (No recovery on system failure):<br>

<br>flag &lt;- transientTimeout $  5*24*60 * 60    -- wait 5 days, timeout</div><div>                                                             -- restarts in case of  failure<br>ap &lt;-  atomically $  readSomewhere &gt;&gt; return False<br>

                `orElse`  waitUntilSTM flag  &gt;&gt; return True<br>case ap of<br>                  False -&gt; print &quot;something received&quot;<br>                  True  -&gt; print &quot;timeout&quot;<br><br>------<br>

transientTimeout t= do<br>  flag &lt;- atomically $ newTVar False<br>  forkIO $ threadDelay(t * 1000000) &gt;&gt; atomically (writeTVar flag True)<br>              &gt;&gt; myThreadId &gt;&gt;= killThread<br>  return flag<br>

<br><br>2010/10/14 Michael Snoyman &lt;<a href="mailto:michael@snoyman.com">michael@snoyman.com</a>&gt;:<br>&gt; Hey all,<br>&gt;<br>&gt; Is there a library that supports fuzzy time deltas? For example, given<br>&gt; two UTCTimes (or something like that) it could produce:<br>

&gt;<br>&gt; 43 seconds<br>&gt; 13 minutes<br>&gt; 17 hours<br>&gt; 4 days<br>&gt; 8 months<br>&gt;<br>&gt; I want to use it for the news feature on Haskellers. It&#39;s not that<br>&gt; hard to write, just wondering if it&#39;s already been done.<br>

&gt;<br>&gt; Michael<br>&gt; _______________________________________________<br>&gt; Haskell-Cafe mailing list<br>&gt; <a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>&gt; <a href="http://www.haskell.org/mailman/listinfo/haskell-cafe">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>

&gt;<br><br></div></div>