, MultiParamTypeClasses
, OverloadedStrings
, TemplateHaskell
+ , TypeSynonymInstances
, UnicodeSyntax
#-}
-- |This module provides functions for ANSI C's date and time strings.
-- > year ::= 4DIGIT
module Data.Time.Format.C
( C
- , c
- , cDateAndTime
)
where
-import Control.Applicative
import Data.Ascii (Ascii, AsciiBuilder)
import qualified Data.Ascii as A
import Data.Attoparsec.Char8
import Data.Convertible.Base
+import Data.Default
import Data.Monoid.Unicode
-import Data.Proxy
import Data.Tagged
import Data.Time
import Data.Time.Calendar.WeekDate
-- |The phantom type for conversions between ANSI C's date and time
-- strings and 'LocalTime'.
--
--- >>> convertSuccess (LocalTime (ModifiedJulianDay 49662) (TimeOfDay 8 49 37))
--- Tagged "Sun Nov 6 08:49:37 1994"
+-- >>> convertSuccess (Tagged (LocalTime (ModifiedJulianDay 49662) (TimeOfDay 8 49 37)) :: Tagged C LocalTime)
+-- "Sun Nov 6 08:49:37 1994"
data C
--- |The proxy for conversions between ANSI C's date and time strings
--- and 'LocalTime'.
-c ∷ Proxy C
-{-# INLINE CONLIKE c #-}
-c = Proxy
-
-instance ConvertSuccess LocalTime (Tagged C Ascii) where
+instance ConvertSuccess (Tagged C LocalTime) Ascii where
{-# INLINE convertSuccess #-}
- convertSuccess = (A.fromAsciiBuilder <$>) ∘ cs
+ convertSuccess = A.fromAsciiBuilder ∘ cs
-instance ConvertSuccess LocalTime (Tagged C AsciiBuilder) where
+instance ConvertSuccess (Tagged C LocalTime) AsciiBuilder where
{-# INLINE convertSuccess #-}
- convertSuccess = Tagged ∘ toAsciiBuilder
+ convertSuccess = toAsciiBuilder ∘ untag
-instance ConvertAttempt (Tagged C Ascii) LocalTime where
+instance ConvertAttempt Ascii (Tagged C LocalTime) where
{-# INLINE convertAttempt #-}
- convertAttempt = parseAttempt' cDateAndTime ∘ untag
+ convertAttempt = parseAttempt' def
-- |Parse an ANSI C's date and time string.
-cDateAndTime ∷ Parser LocalTime
-cDateAndTime
- = do weekDay ← shortWeekDayNameP
- _ ← char ' '
- month ← shortMonthNameP
- _ ← char ' '
- day ← read2'
- _ ← char ' '
- hour ← read2
- _ ← char ':'
- minute ← read2
- _ ← char ':'
- second ← read2
- _ ← char ' '
- year ← read4
+instance Default (Parser (Tagged C LocalTime)) where
+ {-# INLINEABLE def #-}
+ def = 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
+ gregDay ← assertGregorianDateIsGood year month day
+ _ ← assertWeekDayIsGood weekDay gregDay
+ tod ← assertTimeOfDayIsGood hour minute second
- return (LocalTime gregDay tod)
+ return ∘ Tagged $ LocalTime gregDay tod
toAsciiBuilder ∷ LocalTime → AsciiBuilder
toAsciiBuilder localTime
⊕ A.toAsciiBuilder " "
⊕ show4 year
-deriveAttempts [ ([t| LocalTime |], [t| Tagged C Ascii |])
- , ([t| LocalTime |], [t| Tagged C AsciiBuilder |])
+deriveAttempts [ ([t| Tagged C LocalTime |], [t| Ascii |])
+ , ([t| Tagged C LocalTime |], [t| AsciiBuilder |])
]