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