{-# LANGUAGE Safe #-}

-- Note: this file derives from old-locale:System.Locale.hs, which is copyright (c) The University of Glasgow 2001
module Data.Time.Format.Locale (
    TimeLocale (..),
    defaultTimeLocale,
    iso8601DateFormat,
    rfc822DateFormat,
) where

import Data.Time.LocalTime.Internal.TimeZone

data TimeLocale = TimeLocale
    { -- | full and abbreviated week days, starting with Sunday
      TimeLocale -> [(String, String)]
wDays :: [(String, String)]
    , -- | full and abbreviated months
      TimeLocale -> [(String, String)]
months :: [(String, String)]
    , -- | AM\/PM symbols
      TimeLocale -> (String, String)
amPm :: (String, String)
    , -- | formatting strings
      TimeLocale -> String
dateTimeFmt, TimeLocale -> String
dateFmt, TimeLocale -> String
timeFmt, TimeLocale -> String
time12Fmt :: String
    , -- | time zones known by name
      TimeLocale -> [TimeZone]
knownTimeZones :: [TimeZone]
    }
    deriving (TimeLocale -> TimeLocale -> Bool
(TimeLocale -> TimeLocale -> Bool)
-> (TimeLocale -> TimeLocale -> Bool) -> Eq TimeLocale
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TimeLocale -> TimeLocale -> Bool
== :: TimeLocale -> TimeLocale -> Bool
$c/= :: TimeLocale -> TimeLocale -> Bool
/= :: TimeLocale -> TimeLocale -> Bool
Eq, Eq TimeLocale
Eq TimeLocale
-> (TimeLocale -> TimeLocale -> Ordering)
-> (TimeLocale -> TimeLocale -> Bool)
-> (TimeLocale -> TimeLocale -> Bool)
-> (TimeLocale -> TimeLocale -> Bool)
-> (TimeLocale -> TimeLocale -> Bool)
-> (TimeLocale -> TimeLocale -> TimeLocale)
-> (TimeLocale -> TimeLocale -> TimeLocale)
-> Ord TimeLocale
TimeLocale -> TimeLocale -> Bool
TimeLocale -> TimeLocale -> Ordering
TimeLocale -> TimeLocale -> TimeLocale
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: TimeLocale -> TimeLocale -> Ordering
compare :: TimeLocale -> TimeLocale -> Ordering
$c< :: TimeLocale -> TimeLocale -> Bool
< :: TimeLocale -> TimeLocale -> Bool
$c<= :: TimeLocale -> TimeLocale -> Bool
<= :: TimeLocale -> TimeLocale -> Bool
$c> :: TimeLocale -> TimeLocale -> Bool
> :: TimeLocale -> TimeLocale -> Bool
$c>= :: TimeLocale -> TimeLocale -> Bool
>= :: TimeLocale -> TimeLocale -> Bool
$cmax :: TimeLocale -> TimeLocale -> TimeLocale
max :: TimeLocale -> TimeLocale -> TimeLocale
$cmin :: TimeLocale -> TimeLocale -> TimeLocale
min :: TimeLocale -> TimeLocale -> TimeLocale
Ord, Int -> TimeLocale -> ShowS
[TimeLocale] -> ShowS
TimeLocale -> String
(Int -> TimeLocale -> ShowS)
-> (TimeLocale -> String)
-> ([TimeLocale] -> ShowS)
-> Show TimeLocale
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TimeLocale -> ShowS
showsPrec :: Int -> TimeLocale -> ShowS
$cshow :: TimeLocale -> String
show :: TimeLocale -> String
$cshowList :: [TimeLocale] -> ShowS
showList :: [TimeLocale] -> ShowS
Show)

-- | Locale representing American usage.
--
-- 'knownTimeZones' contains only the ten time-zones mentioned in RFC 822 sec. 5:
-- \"UT\", \"GMT\", \"EST\", \"EDT\", \"CST\", \"CDT\", \"MST\", \"MDT\", \"PST\", \"PDT\".
-- Note that the parsing functions will regardless parse \"UTC\", single-letter military time-zones, and +HHMM format.
defaultTimeLocale :: TimeLocale
defaultTimeLocale :: TimeLocale
defaultTimeLocale =
    TimeLocale
        { wDays :: [(String, String)]
wDays =
            [ (String
"Sunday", String
"Sun")
            , (String
"Monday", String
"Mon")
            , (String
"Tuesday", String
"Tue")
            , (String
"Wednesday", String
"Wed")
            , (String
"Thursday", String
"Thu")
            , (String
"Friday", String
"Fri")
            , (String
"Saturday", String
"Sat")
            ]
        , months :: [(String, String)]
months =
            [ (String
"January", String
"Jan")
            , (String
"February", String
"Feb")
            , (String
"March", String
"Mar")
            , (String
"April", String
"Apr")
            , (String
"May", String
"May")
            , (String
"June", String
"Jun")
            , (String
"July", String
"Jul")
            , (String
"August", String
"Aug")
            , (String
"September", String
"Sep")
            , (String
"October", String
"Oct")
            , (String
"November", String
"Nov")
            , (String
"December", String
"Dec")
            ]
        , amPm :: (String, String)
amPm = (String
"AM", String
"PM")
        , dateTimeFmt :: String
dateTimeFmt = String
"%a %b %e %H:%M:%S %Z %Y"
        , dateFmt :: String
dateFmt = String
"%m/%d/%y"
        , timeFmt :: String
timeFmt = String
"%H:%M:%S"
        , time12Fmt :: String
time12Fmt = String
"%I:%M:%S %p"
        , knownTimeZones :: [TimeZone]
knownTimeZones =
            [ Int -> Bool -> String -> TimeZone
TimeZone Int
0 Bool
False String
"UT"
            , Int -> Bool -> String -> TimeZone
TimeZone Int
0 Bool
False String
"GMT"
            , Int -> Bool -> String -> TimeZone
TimeZone (-Int
5 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60) Bool
False String
"EST"
            , Int -> Bool -> String -> TimeZone
TimeZone (-Int
4 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60) Bool
True String
"EDT"
            , Int -> Bool -> String -> TimeZone
TimeZone (-Int
6 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60) Bool
False String
"CST"
            , Int -> Bool -> String -> TimeZone
TimeZone (-Int
5 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60) Bool
True String
"CDT"
            , Int -> Bool -> String -> TimeZone
TimeZone (-Int
7 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60) Bool
False String
"MST"
            , Int -> Bool -> String -> TimeZone
TimeZone (-Int
6 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60) Bool
True String
"MDT"
            , Int -> Bool -> String -> TimeZone
TimeZone (-Int
8 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60) Bool
False String
"PST"
            , Int -> Bool -> String -> TimeZone
TimeZone (-Int
7 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
60) Bool
True String
"PDT"
            ]
        }

{-# DEPRECATED iso8601DateFormat "use \"Data.Time.Format.ISO8601\" functions instead" #-}

{- | Construct format string according to <http://en.wikipedia.org/wiki/ISO_8601 ISO-8601>.

The @Maybe String@ argument allows to supply an optional time specification. E.g.:

@
'iso8601DateFormat' Nothing            == "%Y-%m-%d"           -- i.e. @/YYYY-MM-DD/@
'iso8601DateFormat' (Just "%H:%M:%S")  == "%Y-%m-%dT%H:%M:%S"  -- i.e. @/YYYY-MM-DD/T/HH:MM:SS/@
@
-}
iso8601DateFormat :: Maybe String -> String
iso8601DateFormat :: Maybe String -> String
iso8601DateFormat Maybe String
mTimeFmt =
    String
"%Y-%m-%d"
        String -> ShowS
forall a. [a] -> [a] -> [a]
++ case Maybe String
mTimeFmt of
            Maybe String
Nothing -> String
""
            Just String
fmt -> Char
'T' Char -> ShowS
forall a. a -> [a] -> [a]
: String
fmt

-- | Format string according to <http://tools.ietf.org/html/rfc822#section-5 RFC822>.
rfc822DateFormat :: String
rfc822DateFormat :: String
rfc822DateFormat = String
"%a, %_d %b %Y %H:%M:%S %Z"