import Log
import Driver.Log
import Event
import Transition.Managed
import GTK
import Control.Concurrent
import Control.Monad
import Control.Monad.Fix
import System.FilePath ((</>), takeDirectory)
import System.Directory
import System.Environment
import System.Random
--import Data.Time.Clock
--import Data.Time.Format()
import Data.Char
import Data.List
import Data.Binary
--------------------------------------
main :: IO ()
main = getArgs >>= mainWithArgs
mainWithArgs :: [String] -> IO ()
mainWithArgs args = do
-- init logging
logState <- case args of
["-"] -> return stdOutLog
[fn] -> fileLog fn
_ -> return noLog
-- find preferences file
dir <- getAppUserDataDirectory "minesweeper"
let prefFile = dir </> "preferences"
-- init program state
userName <- getEnv "USER"
seed <- newStdGen
b <- doesFileExist prefFile
st <- if b
then do
decodeFile prefFile
{-
str <- readFile prefFile
case reads str of
[(st, s)] | all (==' ') s -> return st
_ -> error $ "The file " ++ prefFile ++ " is corrupted. Try to delete it."
-}
else do
return $ initState userName seed
-- init driver state
dst <- initDriverState st
-- init GUI state
gui <- mfix $ \gui -> guiState (handleEvent logState gui dst) (writeState prefFile dst)
-- wake up the program
let initActions = [Init]
mapM_ (forkIO . handleEvent logState gui dst) initActions
-- start GUI
startGUI gui
handleEvent :: LogState -> GUIState -> DriverState State Event -> Event -> IO ()
handleEvent logState gui dst e =
applyTransition logState dst (handleResponses gui) transition e
writeState :: FilePath -> DriverState State a -> IO ()
writeState prefFile dst = do
st <- takeState dst
createDirectoryIfMissing True $ takeDirectory prefFile
encodeFile prefFile $ stopState st
-- writeFile prefFile $ show $ stopState st