packages feed

minesweeper-0.8.8: Minesweeper.hs

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