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