    {-# LANGUAGE CPP #-}
    #if __GLASGOW_HASKELL__ >= 701 && MIN_VERSION_base(4,4,1)
    {-# LANGUAGE Safe #-}
    #endif
    -----------------------------------------------------------------------------
    -- |
    -- Module      :  System.Locale
    -- Copyright   :  (c) The University of Glasgow 2001
    -- License     :  BSD3 (see LICENSE file)
    --
    -- Maintainer  :  libraries@haskell.org
    -- Stability   :  stable
    -- Portability :  portable
    --
    -- This module provides the ability to adapt to local conventions.
    --
    -- At present, it supports only time and date information as used by
    -- @calendarTimeToString@ from the @System.Time@ module in the
    -- @old-time@ package.
    --
    -----------------------------------------------------------------------------

    module System.Locale (

        TimeLocale(..)

        , defaultTimeLocale

        , iso8601DateFormat
        , rfc822DateFormat
        )
    where

    import Prelude

    data TimeLocale = TimeLocale {
            -- |full and abbreviated week days
            TimeLocale -> [(String, String)]
    wDays  :: [(String, String)],
            -- |full and abbreviated months
            TimeLocale -> [(String, String)]
    months :: [(String, String)],
            TimeLocale -> [(String, String)]
    intervals :: [(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
            } 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)

    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")],

            intervals :: [(String, String)]
    intervals = [ (String
    "year",String
    "years")
                        , (String
    "month", String
    "months")
                        , (String
    "day",String
    "days")
                        , (String
    "hour",String
    "hours")
                        , (String
    "min",String
    "mins")
                        , (String
    "sec",String
    "secs")
                        , (String
    "usec",String
    "usecs")
                        ],

            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"
            }

    {- | 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"