{-# 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
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
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
Ord, Int -> TimeLocale -> ShowS
[TimeLocale] -> ShowS
TimeLocale -> String
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 {
        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" forall a. [a] -> [a] -> [a]
++ case Maybe String
mTimeFmt of
             Maybe String
Nothing  -> String
""
             Just String
fmt -> Char
'T' 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"