{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeSynonymInstances #-}
module Data.Time.RFC2822 (
formatTimeRFC2822, parseTimeRFC2822
) where
import Control.Applicative
import qualified Data.Attoparsec.Combinator as AC
import Data.Attoparsec.Text
import qualified Data.Attoparsec.Text as A
import Data.Maybe
import Data.Monoid ((<>))
import Data.Monoid.Textual hiding (foldr, map)
import Data.String (fromString)
import Data.Text (Text)
import Data.Time.Calendar
import Data.Time.Format (defaultTimeLocale, formatTime, parseTimeM)
import Data.Time.LocalTime
import Data.Time.Util
formatTimeRFC2822 :: (TextualMonoid t) => ZonedTime -> t
formatTimeRFC2822 :: forall t. TextualMonoid t => ZonedTime -> t
formatTimeRFC2822 zt :: ZonedTime
zt@(ZonedTime LocalTime
lt TimeZone
z) = forall a. IsString a => String -> a
fromString (forall t. FormatTime t => TimeLocale -> String -> t -> String
formatTime TimeLocale
defaultTimeLocale String
"%a, %e %b %Y %T" ZonedTime
zt) forall a. Semigroup a => a -> a -> a
<> forall a. IsString a => String -> a
fromString String
printZone
where timeZoneStr :: String
timeZoneStr = TimeZone -> String
timeZoneOffsetString TimeZone
z
printZone :: String
printZone = if String
timeZoneStr forall a. Eq a => a -> a -> Bool
== TimeZone -> String
timeZoneOffsetString TimeZone
utc
then String
" GMT"
else String
" " forall a. [a] -> [a] -> [a]
++ String
timeZoneStr
formatsRFC2822 :: [Text]
formatsRFC2822 :: [Text]
formatsRFC2822 = do
Text
day <- [Text
"%a, ", Text
""]
Text
time <- [Text
"%T", Text
"%R"]
Text
zone <- [Text
"GMT", Text
"%z"]
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Text
day forall a. Semigroup a => a -> a -> a
<> Text
"%e %b %Y " forall a. Semigroup a => a -> a -> a
<> Text
time forall a. Semigroup a => a -> a -> a
<> Text
" " forall a. Semigroup a => a -> a -> a
<> Text
zone
parseTimeRFC2822 :: (TextualMonoid t) => t -> Maybe ZonedTime
parseTimeRFC2822 :: forall t. TextualMonoid t => t -> Maybe ZonedTime
parseTimeRFC2822 t
t = forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
(<|>) forall a. Maybe a
Nothing forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map forall t. TextualMonoid t => t -> Maybe ZonedTime
parse [Text]
formatsRFC2822
where parse :: (TextualMonoid t) => t -> Maybe ZonedTime
parse :: forall t. TextualMonoid t => t -> Maybe ZonedTime
parse t
format = forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> String -> String -> m t
parseTimeM Bool
True TimeLocale
defaultTimeLocale (forall t. TextualMonoid t => t -> String
toString' t
format) String
t'
t' :: String
t' :: String
t' = String -> [String]
lines (forall t. TextualMonoid t => t -> String
toString' t
t) forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (String
"" forall a. [a] -> [a] -> [a]
++)