X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=time-http.git;a=blobdiff_plain;f=Data%2FTime%2FAsctime.hs;h=f7d7bddaa64114ad20728428119d6d38b6ae2e49;hp=39d9961a8f68b0cd2c62641c464e964d13a02d8d;hb=127b8db;hpb=d62f138e9f756f7e75324d66a45c839ba8ef1334 diff --git a/Data/Time/Asctime.hs b/Data/Time/Asctime.hs index 39d9961..f7d7bdd 100644 --- a/Data/Time/Asctime.hs +++ b/Data/Time/Asctime.hs @@ -1,5 +1,7 @@ {-# LANGUAGE - OverloadedStrings + FlexibleInstances + , MultiParamTypeClasses + , OverloadedStrings , UnicodeSyntax #-} -- |This module provides functions for ANSI C's asctime() format. @@ -23,36 +25,45 @@ -- 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'. +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 ConvertAttempt LocalTime (Tagged Asctime Ascii) where + {-# INLINE convertAttempt #-} + convertAttempt = return ∘ cs + +instance ConvertSuccess LocalTime (Tagged Asctime AsciiBuilder) where + {-# INLINE convertSuccess #-} + convertSuccess = Tagged ∘ toAsciiBuilder + +instance ConvertAttempt LocalTime (Tagged Asctime AsciiBuilder) where + {-# INLINE convertAttempt #-} + convertAttempt = return ∘ cs + +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 +87,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)