<div class="gmail_quote">On Wed, Jan 21, 2009 at 11:36 PM, Belka <span dir="ltr">&lt;<a href="mailto:lambda-belka@yandex.ru">lambda-belka@yandex.ru</a>&gt;</span> wrote:<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

Hi!<br>
<br>
Could somebody please share some experience on how to implement daemon start<br>
and stop directives. In theory I need something like this:<br>
1. &quot;my_daemon start&quot; - starts my app with an infinite loop of serving<br>
inside.<br>
2. &quot;my_daemon stop&quot; - puts in some TVar a value signalizing, that stop is<br>
given - infinite loop brakes.</blockquote><div><br></div><div>You can abstract this pattern:</div><div><br></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;">-- runs its argument in an infinite loop, and returns an action that stops the loop</span></div>
<div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;, monospace;">daemon :: IO () -&gt; IO (IO ())</span></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;">daemon action = do</span></div>
<div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;">&nbsp;&nbsp; &nbsp;stopvar &lt;- atomically $ newTVar False</span></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;">&nbsp;&nbsp; &nbsp;let run = do</span></div>
<div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;stop &lt;- atomically $ readTVar stopvar</span></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if stop then return () else (action &gt;&gt; run)</span></div>
<div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;">&nbsp;&nbsp; &nbsp;forkIO run</span></div><div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;">&nbsp;&nbsp; &nbsp;return (atomically $ writeTVar stopvar True)</span></div>
<div><span class="Apple-style-span" style="font-family: &#39;courier new&#39;; font-size: 12px;"><br></span></div><div><span class="Apple-style-span" style="font-size: 12px; "><span class="Apple-style-span" style="font-family: arial, helvetica, sans-serif;">TVars are overkill here, actually, an IORef would be just fine, I think.</span></span></div>
<div><span class="Apple-style-span" style="font-size: 12px;"><br></span></div><div><span class="Apple-style-span" style="font-size: 12px;">Luke</span></div></div>