    {-# 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
    /= :: TimeLocale -> TimeLocale -> Bool
    $c/= :: TimeLocale -> TimeLocale -> Bool
    == :: TimeLocale -> TimeLocale -> Bool
    $c== :: 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
    min :: TimeLocale -> TimeLocale -> TimeLocale
    $cmin :: TimeLocale -> TimeLocale -> TimeLocale
    max :: TimeLocale -> TimeLocale -> TimeLocale
    $cmax :: TimeLocale -> TimeLocale -> TimeLocale
    >= :: TimeLocale -> TimeLocale -> Bool
    $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
    compare :: TimeLocale -> TimeLocale -> Ordering
    $ccompare :: TimeLocale -> TimeLocale -> Ordering
    $cp1Ord :: Eq 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
    showList :: [TimeLocale] -> ShowS
    $cshowList :: [TimeLocale] -> ShowS
    show :: TimeLocale -> String
    $cshow :: TimeLocale -> String
    showsPrec :: Int -> TimeLocale -> ShowS
    $cshowsPrec :: Int -> TimeLocale -> ShowS
    Show)

    defaultTimeLocale :: TimeLocale
    defaultTimeLocale :: TimeLocale
    defaultTimeLocale =  TimeLocale :: [(String, String)]
    -> [(String, String)]
    -> [(String, String)]
    -> (String, String)
    -> String
    -> String
    -> String
    -> String
    -> TimeLocale
    TimeLocale {
            wDays :: [(String, String)]
    wDays  = [("Sunday",   "Sun"),  ("Monday",    "Mon"),
                      ("Tuesday",  "Tue"),  ("Wednesday", "Wed"),
                      ("Thursday", "Thu"),  ("Friday",    "Fri"),
                      ("Saturday", "Sat")],

            months :: [(String, String)]
    months = [("January",   "Jan"), ("February",  "Feb"),
                      ("March",     "Mar"), ("April",     "Apr"),
                      ("May",       "May"), ("June",      "Jun"),
                      ("July",      "Jul"), ("August",    "Aug"),
                      ("September", "Sep"), ("October",   "Oct"),
                      ("November",  "Nov"), ("December",  "Dec")],

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

            amPm :: (String, String)
    amPm = ("AM", "PM"),
            dateTimeFmt :: String
    dateTimeFmt = "%a %b %e %H:%M:%S %Z %Y",
            dateFmt :: String
    dateFmt = "%m/%d/%y",
            timeFmt :: String
    timeFmt = "%H:%M:%S",
            time12Fmt :: String
    time12Fmt = "%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 mTimeFmt :: Maybe String
    mTimeFmt =
        "%Y-%m-%d" String -> ShowS
    forall a. [a] -> [a] -> [a]
    ++ case Maybe String
    mTimeFmt of
                 Nothing  -> ""
                 Just fmt :: String
    fmt -> '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 = "%a, %_d %b %Y %H:%M:%S %Z"