{-# LANGUAGE ImplicitParams #-}
module Main where
import Application.GUI
import Application.CommandLine
import Application.FileHandling
-- logic related imports
import Control.Monad
import Control.Concurrent
import Data.Maybe
-- transformation related imports
import System.Directory
loop :: Monad m => a -> (a -> m a) -> m a
loop a f = f a >>= \a' -> loop a' f
createLoadNotifier :: StartupOptions -> IO (MVar (String, FilePath))
createLoadNotifier o | canLoad o = newMVar (fromJust $ filetype o, fromJust $ file o)
| otherwise = newEmptyMVar
main :: IO ()
main = withCommandLine $ withGUI $ do
loadNotifier <- createLoadNotifier ?startupOptions
(window, webView) <- createInterface loadNotifier
let loadInsideView r = renderHtml r >>= webViewLoadUri webView
void . forkIO . void $ loop (Nothing, Nothing) $ \(resource, modificationTime) -> do
threadDelay 500
if isNothing resource || isNothing modificationTime
then do resource' <- takeMVar loadNotifier
modificationTime' <- getModificationTime (snd resource')
loadInsideView resource'
return (Just resource', Just modificationTime')
else do noNewFile <- isEmptyMVar loadNotifier
if noNewFile
then do modificationTime' <- getModificationTime (snd $ fromJust resource)
when (modificationTime' /= fromJust modificationTime) $ loadInsideView (fromJust resource)
return (resource, Just modificationTime')
else return (Nothing, Nothing)
return window