aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSean Whitton <spwhitton@spwhitton.name>2015-03-17 12:55:12 +0000
committerSean Whitton <spwhitton@spwhitton.name>2015-03-17 12:55:12 +0000
commit94df9312f3461c4a6b53227bb1bab12965be3bd9 (patch)
treea83ffd6fffad28b26f09bbcd3d1dc222483978bb
parentd2a2ece999eb879d051116b64f11998152f910df (diff)
downloadsariulclocks-94df9312f3461c4a6b53227bb1bab12965be3bd9.tar.gz
lookupSariulClass: better handling of bad classes
-rw-r--r--src/Data/Classes.hs17
-rw-r--r--src/Types/Session.hs2
-rw-r--r--src/Utils/ScoresFile.hs3
3 files changed, 14 insertions, 8 deletions
diff --git a/src/Data/Classes.hs b/src/Data/Classes.hs
index 1e9df43..b7386d6 100644
--- a/src/Data/Classes.hs
+++ b/src/Data/Classes.hs
@@ -22,9 +22,14 @@ sariulClasses =
zeroScores :: ScoresList
zeroScores = foldr ((:) . (,emptyScore)) [] sariulClasses
-lookupSariulClass :: Int -> Int -> Class
-lookupSariulClass grade theClass = (head . filter choose) sariulClasses
- where
- choose (Class g n _) = theClass == n && process grade == g
- process 5 = sariulGrade5
- process 6 = sariulGrade6
+lookupSariulClass :: Int -> Int -> Maybe Class
+lookupSariulClass grade theClass = do
+ grade' <- case grade of
+ 5 -> Just sariulGrade5
+ 6 -> Just sariulGrade6
+ _ -> Nothing
+ let choose (Class g n _) = theClass == n && grade' == g
+ classes = filter choose sariulClasses
+ case classes of
+ [] -> Nothing
+ (x:xs) -> Just x
diff --git a/src/Types/Session.hs b/src/Types/Session.hs
index b7ff979..a4dba93 100644
--- a/src/Types/Session.hs
+++ b/src/Types/Session.hs
@@ -63,5 +63,5 @@ parseClassCookie s =
parseClassCookie' :: String -> Maybe Class
parseClassCookie' s =
case splitOn "-" s of
- g:c:[] -> Just $ lookupSariulClass (read g) (read c)
+ g:c:[] -> lookupSariulClass (read g) (read c)
_ -> Nothing
diff --git a/src/Utils/ScoresFile.hs b/src/Utils/ScoresFile.hs
index 247c1b6..4028efa 100644
--- a/src/Utils/ScoresFile.hs
+++ b/src/Utils/ScoresFile.hs
@@ -12,6 +12,7 @@ import System.Directory (getDirectoryContents, getCurrentDirectory)
import System.FilePath (takeExtension)
import Control.Monad (liftM)
import Data.List.Split (splitOn)
+import Data.Maybe (fromJust)
scoresToCSV :: ScoresList -> String
scoresToCSV = unlines . foldr step []
@@ -26,7 +27,7 @@ scoresFromCSV csv = foldr step [] (lines csv)
step line scores = (theClass, Score (read scoreString) (read timeString)) : scores
where
classString:scoreString:timeString:[] = splitOn "," line
- theClass = lookupSariulClass ((head . read) classString) ((last . read) classString)
+ theClass = fromJust $ lookupSariulClass ((head . read) classString) ((last . read) classString)
-- read to scores-XX.csv where XX is largest timestamp
readScoresFile :: IO (Maybe ScoresList)