X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=time-http.git;a=blobdiff_plain;f=Data%2FTime%2FAsctime.hs;h=f8d28ccd80091fb0424c779245aaa6627d50068a;hp=39d9961a8f68b0cd2c62641c464e964d13a02d8d;hb=782e6a9;hpb=d62f138e9f756f7e75324d66a45c839ba8ef1334 diff --git a/Data/Time/Asctime.hs b/Data/Time/Asctime.hs index 39d9961..f8d28cc 100644 --- a/Data/Time/Asctime.hs +++ b/Data/Time/Asctime.hs @@ -1,5 +1,8 @@ {-# LANGUAGE - OverloadedStrings + FlexibleInstances + , MultiParamTypeClasses + , OverloadedStrings + , TemplateHaskell , UnicodeSyntax #-} -- |This module provides functions for ANSI C's asctime() format. @@ -23,36 +26,40 @@ -- As you can see, it has no time zone info. "Data.Time.HTTP" will -- treat it as UTC. module Data.Time.Asctime - ( -- * Formatting - toAscii - , toAsciiBuilder - - -- * Parsing - , fromAscii + ( Asctime , asctime ) 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.Monoid.Unicode +import Data.Tagged import Data.Time import Data.Time.Calendar.WeekDate import Data.Time.HTTP.Common import Prelude.Unicode --- |Convert a 'LocalTime' to ANSI C's @asctime()@ string. -toAscii ∷ LocalTime → Ascii -toAscii = A.fromAsciiBuilder ∘ toAsciiBuilder +-- |The phantom type for conversion between ANSI C's @asctime()@ +-- string and 'LocalTime'. +-- +-- >>> convertSuccess (LocalTime (ModifiedJulianDay 49662) (TimeOfDay 8 49 37)) +-- Tagged "Sun Nov 6 08:49:37 1994" +data Asctime --- |Parse an ANSI C's @asctime()@ string. When the string can't be --- parsed, it returns @'Left' err@. -fromAscii ∷ Ascii → Either String LocalTime -fromAscii = parseOnly p ∘ A.toByteString - where - p = do zt ← asctime - endOfInput - return zt +instance ConvertSuccess LocalTime (Tagged Asctime Ascii) where + {-# INLINE convertSuccess #-} + convertSuccess = (A.fromAsciiBuilder <$>) ∘ cs + +instance ConvertSuccess LocalTime (Tagged Asctime AsciiBuilder) where + {-# INLINE convertSuccess #-} + convertSuccess = Tagged ∘ toAsciiBuilder + +instance ConvertAttempt (Tagged Asctime Ascii) LocalTime where + {-# INLINE convertAttempt #-} + convertAttempt = parseAttempt' asctime ∘ untag -- |Parse an ANSI C's @asctime()@ string. asctime ∷ Parser LocalTime @@ -76,7 +83,6 @@ asctime = do weekDay ← shortWeekDayNameP 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) @@ -96,3 +102,7 @@ toAsciiBuilder localTime ⊕ show2 (floor (todSec timeOfDay) ∷ Int) ⊕ A.toAsciiBuilder " " ⊕ show4 year + +deriveAttempts [ ([t| LocalTime |], [t| Tagged Asctime Ascii |]) + , ([t| LocalTime |], [t| Tagged Asctime AsciiBuilder |]) + ]