]> gitweb @ CieloNegro.org - time-http.git/blobdiff - Data/Time/Asctime.hs
Delete Data.Time.Asctime.Internal
[time-http.git] / Data / Time / Asctime.hs
index 0814e451f9f0f82e37f849da656740adb0e09103..39d9961a8f68b0cd2c62641c464e964d13a02d8d 100644 (file)
@@ -1,5 +1,6 @@
 {-# LANGUAGE
-    UnicodeSyntax
+    OverloadedStrings
+  , UnicodeSyntax
   #-}
 -- |This module provides functions for ANSI C's asctime() format.
 --
@@ -31,11 +32,13 @@ module Data.Time.Asctime
     , asctime
     )
     where
-import Data.Ascii (Ascii)
+import Data.Ascii (Ascii, AsciiBuilder)
 import qualified Data.Ascii as A
-import qualified Data.Attoparsec.Char8 as P
+import Data.Attoparsec.Char8
+import Data.Monoid.Unicode
 import Data.Time
-import Data.Time.Asctime.Internal
+import Data.Time.Calendar.WeekDate
+import Data.Time.HTTP.Common
 import Prelude.Unicode
 
 -- |Convert a 'LocalTime' to ANSI C's @asctime()@ string.
@@ -45,8 +48,51 @@ toAscii = A.fromAsciiBuilder ∘ toAsciiBuilder
 -- |Parse an ANSI C's @asctime()@ string. When the string can't be
 -- parsed, it returns @'Left' err@.
 fromAscii ∷ Ascii → Either String LocalTime
-fromAscii = P.parseOnly p ∘ A.toByteString
+fromAscii = parseOnly p ∘ A.toByteString
     where
       p = do zt ← asctime
-             P.endOfInput
+             endOfInput
              return zt
+
+-- |Parse an ANSI C's @asctime()@ string.
+asctime ∷ Parser LocalTime
+asctime = do weekDay ← shortWeekDayNameP
+             _       ← char ' '
+             month   ← shortMonthNameP
+             _       ← char ' '
+             day     ← read2'
+             _       ← char ' '
+             hour    ← read2
+             _       ← char ':'
+             minute  ← read2
+             _       ← char ':'
+             second  ← read2
+             _       ← char ' '
+             year    ← read4
+
+             gregDay ← assertGregorianDateIsGood year month day
+             _       ← assertWeekDayIsGood weekDay gregDay
+             tod     ← assertTimeOfDayIsGood hour minute second
+
+             return (LocalTime gregDay tod)
+
+-- |Convert a 'LocalTime' to ANSI C's @asctime()@ string.
+toAsciiBuilder ∷ LocalTime → AsciiBuilder
+toAsciiBuilder localTime
+    = let (year, month, day) = toGregorian (localDay localTime)
+          (_, _, week)       = toWeekDate  (localDay localTime)
+          timeOfDay          = localTimeOfDay localTime
+      in
+        shortWeekDayName week
+        ⊕ A.toAsciiBuilder " "
+        ⊕ shortMonthName month
+        ⊕ A.toAsciiBuilder " "
+        ⊕ show2' day
+        ⊕ A.toAsciiBuilder " "
+        ⊕ show2 (todHour timeOfDay)
+        ⊕ A.toAsciiBuilder ":"
+        ⊕ show2 (todMin timeOfDay)
+        ⊕ A.toAsciiBuilder ":"
+        ⊕ show2 (floor (todSec timeOfDay) ∷ Int)
+        ⊕ A.toAsciiBuilder " "
+        ⊕ show4 year