2018-08-02 23:07:05 +03:00
|
|
|
{-# Language OverloadedStrings #-}
|
2018-08-02 21:39:08 +03:00
|
|
|
module Devel.Main where
|
|
|
|
|
|
|
|
import Main (defaultMain)
|
|
|
|
import Control.Concurrent
|
|
|
|
import Control.Monad (void)
|
|
|
|
import Data.IORef (IORef, newIORef, readIORef, writeIORef)
|
|
|
|
import Foreign.Store (Store(..), lookupStore, readStore, storeAction, withStore)
|
|
|
|
import GHC.Word (Word32)
|
2018-08-02 23:07:05 +03:00
|
|
|
import Dhall (input, auto)
|
2018-08-02 21:39:08 +03:00
|
|
|
|
|
|
|
update :: IO ()
|
|
|
|
update = do
|
|
|
|
lookupStore tidStoreNum >>= maybe setupNew restart
|
|
|
|
where
|
|
|
|
doneStore :: Store (MVar ())
|
|
|
|
doneStore = Store 0
|
|
|
|
setupNew :: IO ()
|
|
|
|
setupNew = do
|
|
|
|
done <- storeAction doneStore newEmptyMVar
|
|
|
|
tid <- start done
|
|
|
|
void $ storeAction (Store tidStoreNum) (newIORef tid)
|
|
|
|
restart tidStore = modifyStoredIORef tidStore $ \tid -> do
|
|
|
|
killThread tid
|
|
|
|
withStore doneStore takeMVar
|
|
|
|
readStore doneStore >>= start
|
|
|
|
start :: MVar () -> IO ThreadId
|
2018-08-02 23:07:05 +03:00
|
|
|
start done = forkFinally (input auto "./config/devel.dhall" >>= defaultMain) (\_ -> putMVar done ())
|
2018-08-02 21:39:08 +03:00
|
|
|
|
|
|
|
modifyStoredIORef :: Store (IORef a) -> (a -> IO a) -> IO ()
|
|
|
|
modifyStoredIORef store f = withStore store $ \ref -> do
|
|
|
|
v <- readIORef ref
|
|
|
|
f v >>= writeIORef ref
|
|
|
|
|
|
|
|
tidStoreNum :: Word32
|
|
|
|
tidStoreNum = 1
|