<div class="gmail_quote">On Wed, Jan 21, 2009 at 11:36 PM, Belka <span dir="ltr"><<a href="mailto:lambda-belka@yandex.ru">lambda-belka@yandex.ru</a>></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. "my_daemon start" - starts my app with an infinite loop of serving<br>
inside.<br>
2. "my_daemon stop" - 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: 'courier new'; 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: 'courier new', monospace;">daemon :: IO () -> IO (IO ())</span></div><div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px;">daemon action = do</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px;"> stopvar <- atomically $ newTVar False</span></div><div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px;"> let run = do</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px;"> stop <- atomically $ readTVar stopvar</span></div><div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px;"> if stop then return () else (action >> run)</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px;"> forkIO run</span></div><div><span class="Apple-style-span" style="font-family: 'courier new'; font-size: 12px;"> return (atomically $ writeTVar stopvar True)</span></div>
<div><span class="Apple-style-span" style="font-family: 'courier new'; 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>