ebook-manager/src/Devel/Main.hs

37 lines
1.1 KiB
Haskell

{-# Language OverloadedStrings #-}
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)
import Dhall (input, auto)
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
start done = forkFinally (input auto "./config/devel.dhall" >>= defaultMain) (\_ -> putMVar done ())
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