<br><br><div class="gmail_quote">On Sat, May 30, 2009 at 10:32 PM, Cetin Sert <span dir="ltr">&lt;<a href="mailto:cetin.sert@gmail.com">cetin.sert@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<span style="font-family:courier new,monospace"><span style="font-family:arial,helvetica,sans-serif">Thank you for your reply, I&#39;d come up with the following:</span><br><br></span><div style="margin-left:40px"><div class="im">
<span style="font-family:courier new,monospace">timed :: Int → IO a → b → IO (Either b a)</span><br style="font-family:courier new,monospace">

<span style="font-family:courier new,monospace">timed max act def = do</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"></div><span style="font-family:courier new,monospace">  r ← new</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">  </span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  t ← forkIO $ do</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">    a ← act</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    r ≔ Right a</span><br style="font-family:courier new,monospace">


<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  s ← forkIO $ do</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    wait max</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">    e ← em r</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    case e of</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">      True  → do</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        kill t</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">        r ≔ Left def</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">      False → return ()</span><br style="font-family:courier new,monospace">


<br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">  takeMVar r</span><br></div><br><div class="gmail_quote">---------------------<br><br><div style="margin-left:40px"><span style="font-family:courier new,monospace">*Network.Port.Scan&gt; timed 500 (wait 50000 &gt;&gt; return 0) &#39;x&#39;</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">Left &#39;x&#39;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">*Network.Port.Scan&gt; timed 500000 (wait 50000 &gt;&gt; return 0) &#39;x&#39;</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">Right 0</span><br></div><br>---------------------<br>
<br>before reading your reply:<div class="im"><br><br><div style="font-family:courier new,monospace;margin-left:40px">timed timeout act fallback = do</div><div style="font-family:courier new,monospace;margin-left:40px">   res &lt;- newEmptyMVar</div>


<div style="font-family:courier new,monospace;margin-left:40px">   tid &lt;- forkIO $ act &gt;&gt;= writeMVar res</div><div style="font-family:courier new,monospace;margin-left:40px">   threadDelay timeout</div><div style="font-family:courier new,monospace;margin-left:40px">


   stillRunning &lt;- isEmptyMVar res</div>
<div style="font-family:courier new,monospace;margin-left:40px">   if stillRunning then killThread tid &gt;&gt; return fallback else takeMVar res</div><br></div>---------------------<br><br><div style="margin-left:40px">


<span style="font-family:courier new,monospace">*Network.Port.Scan&gt; timed2 500 (wait 50000 &gt;&gt; return 0) &#39;x&#39;</span><br style="font-family:courier new,monospace"><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">&lt;interactive&gt;:1:33:</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    No instance for (Num Char)</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">      arising from the literal `0&#39; at &lt;interactive&gt;:1:33</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    Possible fix: add an instance declaration for (Num Char)</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">    In the first argument of `return&#39;, namely `0&#39;</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">    In the second argument of `(&gt;&gt;)&#39;, namely `return 0&#39;</span><br style="font-family:courier new,monospace">


<span style="font-family:courier new,monospace">    In the second argument of `timed2&#39;, namely</span><br style="font-family:courier new,monospace"><span style="font-family:courier new,monospace">        `(wait 50000 &gt;&gt; return 0)&#39;</span><br>


</div></div></blockquote><div><br></div><div><br></div><div>Right, I forgot about the &quot;Either&quot; bit so you&#39;d have to make sure the action&#39;s result and the default has the same type (or modify it to return an Either).</div>
</div><br><br clear="all"><br>-- <br>Sebastian Sylvan<br>+44(0)7857-300802<br>UIN: 44640862<br>