From 5f2c7ae801deb49b55f7f574253d02dbd4b78e5d Mon Sep 17 00:00:00 2001 From: Sean Whitton Date: Fri, 20 Mar 2015 14:09:11 +0000 Subject: readScoresFile and writeScoresFile rewritten in terms of new monad --- src/Utils/ScoresFile.hs | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/src/Utils/ScoresFile.hs b/src/Utils/ScoresFile.hs index 936a5dc..eac386c 100644 --- a/src/Utils/ScoresFile.hs +++ b/src/Utils/ScoresFile.hs @@ -14,6 +14,8 @@ import Control.Monad (liftM) import Data.List.Split (splitOn) import Data.Maybe (fromJust) import System.FilePath (()) +import Control.Monad.SariulClocks +import Control.Monad.Trans (liftIO) scoresToCSV :: ScoresList -> String scoresToCSV = unlines . foldr step [] @@ -33,22 +35,27 @@ scoresFromCSV csv = foldr step [] (lines csv) classString:scoreString:timeString:[] = splitOn "," line theClass = fromJust $ lookupSariulClass ((read . (:[]) . head) classString) ((read . (:[]) . last) classString) --- read from scores-XX.csv where XX is largest timestamp -readScoresFile :: IO (Maybe ScoresList) +-- try to read from scores-XX.csv where XX is largest timestamp +readScoresFile :: SariulScoresMonad a => a (Maybe ScoresList) readScoresFile = do - curDir <- getCurrentDirectory + curDir <- liftIO getCurrentDirectory let dataDir = curDir "data" - filenames <- liftM (reverse . sort . filter isCSV) $ getDirectoryContents dataDir - case filenames of - [] -> return Nothing - _ -> Just . scoresFromCSV <$> readFile (dataDir head filenames) + filenames <- liftM (reverse . sort . filter isCSV) $ liftIO $ getDirectoryContents dataDir + if null filenames + then return Nothing + else do + -- let scores = liftM scoresFromCSV $ liftIO $ readFile (dataDir head filenames) + scores <- liftIO $ scoresFromCSV <$> readFile (dataDir head filenames) + putScores scores + return $ Just scores where isCSV path = takeExtension path == ".csv" -- writes to score-XX.csv where XX is unix timestamp: a simple-minded logging -writeScoresFile :: ScoresList -> IO () -writeScoresFile scores = do - curDir <- getCurrentDirectory +writeScoresFile :: SariulScoresMonad a => a () +writeScoresFile = do + scores <- getScores + curDir <- liftIO getCurrentDirectory let dataDir = curDir "data" - timestamp <- round <$> getPOSIXTime + timestamp <- liftM round $ liftIO getPOSIXTime let filename = dataDir ("scores-" ++ show timestamp ++ ".csv") - writeFile filename (scoresToCSV scores) + liftIO $ writeFile filename (scoresToCSV scores) -- cgit v1.2.3