]> gitweb.michael.orlitzky.com - dead/htsn-import.git/commitdiff
Add a pickler for the forecast gamedate attribute.
authorMichael Orlitzky <michael@orlitzky.com>
Thu, 16 Jan 2014 01:32:40 +0000 (20:32 -0500)
committerMichael Orlitzky <michael@orlitzky.com>
Thu, 16 Jan 2014 01:32:40 +0000 (20:32 -0500)
src/TSN/Picklers.hs

index 054d0f6512724158e614c8264b8e2de1427616e1..c67b5c924e62581ab8af566bfb7b590f1e1d190c 100644 (file)
@@ -3,6 +3,7 @@
 --
 module TSN.Picklers (
   xp_date,
+  xp_gamedate,
   xp_time )
 where
 
@@ -31,6 +32,53 @@ xp_date =
     from_date = formatTime defaultTimeLocale format
 
 
+-- | (Un)pickle a UTCTime from a weather forecast's gamedate. Example
+--   input looks like,
+--
+--   \<forecast gamedate=\"Monday, December 30th\"\>
+--
+--   When unpickling we get rid of the suffixes \"st\", \"nd\", \"rd\", and
+--   \"th\". During pickling, we add them back based on the last digit
+--   of the date.
+--
+xp_gamedate :: PU UTCTime
+xp_gamedate =
+  (to_gamedate, from_gamedate) `xpWrapMaybe` xpText
+  where
+    format = "%A, %B %-d"
+
+    to_gamedate :: String -> Maybe UTCTime
+    to_gamedate s =
+      parseTime defaultTimeLocale format s'
+      where
+        s' = case (reverse s) of
+               (c2:c1:cs) -> let suffix = c1:(c2:[])
+                             in
+                               case suffix of
+                                 "st" -> reverse cs
+                                 "nd" -> reverse cs
+                                 "rd" -> reverse cs
+                                 "th" -> reverse cs
+                                 _    -> s -- Unknown suffix, leave it alone.
+               _ -> s -- The String is less than two characters long,
+                      -- leave it alone.
+
+
+    from_gamedate :: UTCTime -> String
+    from_gamedate d = s ++ (suffix s)
+      where
+        s = formatTime defaultTimeLocale format d
+
+        suffix :: String -> String
+        suffix cs =
+          case (reverse cs) of
+            []       -> []
+            ('1':_) -> "st"
+            ('2':_) -> "nd"
+            ('3':_) -> "rd"
+            _        -> "th"
+
+
 -- | (Un)pickle a UTCTime without the date portion.
 --
 xp_time :: PU UTCTime