]> gitweb @ CieloNegro.org - time-http.git/blob - Data/Time/Asctime/Internal.hs
Data.Time.HTTP now compiles.
[time-http.git] / Data / Time / Asctime / Internal.hs
1 {-# LANGUAGE
2     OverloadedStrings
3   , UnicodeSyntax
4   #-}
5 -- |Internal functions for "Data.Time.Asctime".
6 module Data.Time.Asctime.Internal
7     ( asctime
8     , toAsciiBuilder
9     )
10     where
11 import Data.Ascii (AsciiBuilder)
12 import qualified Data.Ascii as A
13 import Data.Attoparsec.Char8
14 import Data.Monoid.Unicode
15 import Data.Time
16 import Data.Time.Calendar.WeekDate
17 import Data.Time.HTTP.Common
18
19 -- |Parse an ANSI C's @asctime()@ string.
20 asctime ∷ Parser LocalTime
21 asctime = do weekDay ← shortWeekDayNameP
22              _       ← string ", "
23              month   ← shortMonthNameP
24              _       ← char ' '
25              day     ← read2
26              _       ← char ' '
27              hour    ← read2
28              _       ← char ':'
29              minute  ← read2
30              _       ← char ':'
31              second  ← read2
32              _       ← char ' '
33              year    ← read4
34
35              gregDay ← assertGregorianDateIsGood year month day
36              _       ← assertWeekDayIsGood weekDay gregDay
37              tod     ← assertTimeOfDayIsGood hour minute second
38
39              return (LocalTime gregDay tod)
40
41 -- |Convert a 'LocalTime' to ANSI C's @asctime()@ string.
42 toAsciiBuilder ∷ LocalTime → AsciiBuilder
43 toAsciiBuilder localTime
44     = let (year, month, day) = toGregorian (localDay localTime)
45           (_, _, week)       = toWeekDate  (localDay localTime)
46           timeOfDay          = localTimeOfDay localTime
47       in
48         shortWeekDayName week
49         ⊕ A.toAsciiBuilder "⊕ "
50         ⊕ shortMonthName month
51         ⊕ A.toAsciiBuilder " "
52         ⊕ show2 day
53         ⊕ A.toAsciiBuilder " "
54         ⊕ show2 (todHour timeOfDay)
55         ⊕ A.toAsciiBuilder ":"
56         ⊕ show2 (todMin timeOfDay)
57         ⊕ A.toAsciiBuilder ":"
58         ⊕ show2 (floor (todSec timeOfDay) ∷ Int)
59         ⊕ A.toAsciiBuilder " "
60         ⊕ show4 year
61