module Data.HodaTime.Pattern.LocalTime
(
pt
,pT
,pr
,phour
,pHH
,phh
,phhSpace
,pminute
,pmm
,psecond
,pss
,pfrac
,pp
,ppp
,ppp'
,pPeriod
,hour'
,minute'
,second'
)
where
import Data.HodaTime.Pattern.Internal
import Data.HodaTime.Pattern.ParseTypes (TimeInfo)
import qualified Data.HodaTime.Pattern.ParseTypes as PT(hour, minute, second)
import Data.HodaTime.LocalTime.Internal (HasLocalTime)
import qualified Data.HodaTime.LocalTime.Internal as LT(hour, setHour, minute, setMinute, second, setSecond, nanosecond, setNanosecond)
import Control.Applicative ((<|>))
import Formatting (Format, later, left, (%.))
import qualified Data.Text as T
import qualified Data.Text.Lazy.Builder as TLB
import Text.Parsec (oneOf, digit, count, try, (<?>))
import qualified Text.Parsec as P (char)
import Data.HodaTime.Locale.Internal (Locale(..))
phh :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
phh :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
phh = Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> Pattern (lt -> lt) (lt -> String) String
twelveHour Parser Int String
forall {u}. ParsecT String u Identity Int
paddedNum (lt -> Int) -> Format String (lt -> String)
forall b a r. Show b => (a -> b) -> Format r (a -> r)
f_shown_two
where
paddedNum :: ParsecT String u Identity Int
paddedNum = (Char -> Char -> Int
forall n. (Num n, Read n) => Char -> Char -> n
digitsToInt (Char -> Char -> Int)
-> ParsecT String u Identity Char
-> ParsecT String u Identity (Char -> Int)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Char -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'0' ParsecT String u Identity (Char -> Int)
-> ParsecT String u Identity Char -> ParsecT String u Identity Int
forall a b.
ParsecT String u Identity (a -> b)
-> ParsecT String u Identity a -> ParsecT String u Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf [Char
'1'..Char
'9']) ParsecT String u Identity Int
-> ParsecT String u Identity Int -> ParsecT String u Identity Int
forall a.
ParsecT String u Identity a
-> ParsecT String u Identity a -> ParsecT String u Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Char -> Char -> Int
forall n. (Num n, Read n) => Char -> Char -> n
digitsToInt (Char -> Char -> Int)
-> ParsecT String u Identity Char
-> ParsecT String u Identity (Char -> Int)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Char -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'1' ParsecT String u Identity (Char -> Int)
-> ParsecT String u Identity Char -> ParsecT String u Identity Int
forall a b.
ParsecT String u Identity (a -> b)
-> ParsecT String u Identity a -> ParsecT String u Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf [Char
'0'..Char
'2'])
phhSpace :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
phhSpace :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
phhSpace = Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> Pattern (lt -> lt) (lt -> String) String
twelveHour (Int -> Int -> Int -> Parser Int String
pDigitsSpace Int
2 Int
1 Int
12) (Int -> (lt -> Int) -> Format String (lt -> String)
forall b a r. Show b => Int -> (a -> b) -> Format r (a -> r)
f_shown_spad Int
2)
twelveHour :: HasLocalTime lt => Parser Int String -> ((lt -> Int) -> Format String (lt -> String)) -> Pattern (lt -> lt) (lt -> String) String
twelveHour :: forall lt.
HasLocalTime lt =>
Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> Pattern (lt -> lt) (lt -> String) String
twelveHour Parser Int String
numP (lt -> Int) -> Format String (lt -> String)
mkFmt = Parser (lt -> lt) String
-> Format String (lt -> String)
-> Pattern (lt -> lt) (lt -> String) String
forall a b r. Parser a r -> Format r b -> Pattern a b r
Pattern Parser (lt -> lt) String
par ((lt -> Int) -> Format String (lt -> String)
mkFmt (Int -> Int
forall {a}. Integral a => a -> a
to12 (Int -> Int) -> (lt -> Int) -> lt -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.hour))
where
par :: Parser (lt -> lt) String
par = (Int -> lt -> lt
forall {lt}. HasLocalTime lt => Int -> lt -> lt
adjust (Int -> lt -> lt) -> Parser Int String -> Parser (lt -> lt) String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Int String
numP) Parser (lt -> lt) String -> String -> Parser (lt -> lt) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"hour: 01-12"
adjust :: Int -> lt -> lt
adjust Int
n lt
lt = Int -> lt -> lt
forall {lt}. HasLocalTime lt => Int -> lt -> lt
LT.setHour (Int
12 Int -> Int -> Int
forall a. Num a => a -> a -> a
* (lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.hour lt
lt Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
12) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ (Int
n Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12)) lt
lt
to12 :: a -> a
to12 a
h = if a
h' a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
0 then a
12 else a
h' where h' :: a
h' = a
h a -> a -> a
forall a. Integral a => a -> a -> a
`mod` a
12
phour :: HasLocalTime lt => Int -> Pattern (lt -> lt) (lt -> String) String
phour :: forall lt.
HasLocalTime lt =>
Int -> Pattern (lt -> lt) (lt -> String) String
phour Int
w = (lt -> Int)
-> (Int -> lt -> lt)
-> Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> String
-> Pattern (lt -> lt) (lt -> String) String
forall s a.
(s -> a)
-> (a -> s -> s)
-> Parser a String
-> ((s -> a) -> Format String (s -> String))
-> String
-> Pattern (s -> s) (s -> String) String
pat_field lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.hour Int -> lt -> lt
forall {lt}. HasLocalTime lt => Int -> lt -> lt
LT.setHour (Int -> Int -> Int -> Int -> Parser Int String
pDigits Int
w Int
2 Int
0 Int
23) (Int -> (lt -> Int) -> Format String (lt -> String)
forall b a r. Show b => Int -> (a -> b) -> Format r (a -> r)
f_shown_pad Int
w) String
"hour: 00-23"
pHH :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
pHH :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pHH = Int -> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Int -> Pattern (lt -> lt) (lt -> String) String
phour Int
2
hour' :: HasLocalTime lt => Pattern (TimeInfo -> TimeInfo) (lt -> String) String
hour' :: forall lt.
HasLocalTime lt =>
Pattern (TimeInfo -> TimeInfo) (lt -> String) String
hour' = Lens TimeInfo TimeInfo Int Int
-> (lt -> Int)
-> Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> String
-> Pattern (TimeInfo -> TimeInfo) (lt -> String) String
forall s a s' a'.
Lens s s a a
-> (s' -> a')
-> Parser a String
-> ((s' -> a') -> Format String (s' -> String))
-> String
-> Pattern (s -> s) (s' -> String) String
pat_lens_field (Int -> f Int) -> TimeInfo -> f TimeInfo
Lens TimeInfo TimeInfo Int Int
PT.hour lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.hour (Parser Int String
forall {u}. ParsecT String u Identity Int
p_a Parser Int String -> Parser Int String -> Parser Int String
forall a.
ParsecT String () Identity a
-> ParsecT String () Identity a -> ParsecT String () Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser Int String
forall {u}. ParsecT String u Identity Int
p_b) (lt -> Int) -> Format String (lt -> String)
forall b a r. Show b => (a -> b) -> Format r (a -> r)
f_shown_two String
"hour: 00-23"
where
p_a :: ParsecT String u Identity Int
p_a = Char -> Char -> Int
forall n. (Num n, Read n) => Char -> Char -> n
digitsToInt (Char -> Char -> Int)
-> ParsecT String u Identity Char
-> ParsecT String u Identity (Char -> Int)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf [Char
'0', Char
'1'] ParsecT String u Identity (Char -> Int)
-> ParsecT String u Identity Char -> ParsecT String u Identity Int
forall a b.
ParsecT String u Identity (a -> b)
-> ParsecT String u Identity a -> ParsecT String u Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ParsecT String u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit
p_b :: ParsecT String u Identity Int
p_b = Char -> Char -> Int
forall n. (Num n, Read n) => Char -> Char -> n
digitsToInt (Char -> Char -> Int)
-> ParsecT String u Identity Char
-> ParsecT String u Identity (Char -> Int)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Char -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
Char -> ParsecT s u m Char
P.char Char
'2' ParsecT String u Identity (Char -> Int)
-> ParsecT String u Identity Char -> ParsecT String u Identity Int
forall a b.
ParsecT String u Identity (a -> b)
-> ParsecT String u Identity a -> ParsecT String u Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> String -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf [Char
'0'..Char
'3']
pminute :: HasLocalTime lt => Int -> Pattern (lt -> lt) (lt -> String) String
pminute :: forall lt.
HasLocalTime lt =>
Int -> Pattern (lt -> lt) (lt -> String) String
pminute Int
w = (lt -> Int)
-> (Int -> lt -> lt)
-> Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> String
-> Pattern (lt -> lt) (lt -> String) String
forall s a.
(s -> a)
-> (a -> s -> s)
-> Parser a String
-> ((s -> a) -> Format String (s -> String))
-> String
-> Pattern (s -> s) (s -> String) String
pat_field lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.minute Int -> lt -> lt
forall {lt}. HasLocalTime lt => Int -> lt -> lt
LT.setMinute (Int -> Int -> Int -> Int -> Parser Int String
pDigits Int
w Int
2 Int
0 Int
59) (Int -> (lt -> Int) -> Format String (lt -> String)
forall b a r. Show b => Int -> (a -> b) -> Format r (a -> r)
f_shown_pad Int
w) String
"minute: 00-59"
pmm :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
pmm :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pmm = Int -> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Int -> Pattern (lt -> lt) (lt -> String) String
pminute Int
2
minute' :: HasLocalTime lt => Pattern (TimeInfo -> TimeInfo) (lt -> String) String
minute' :: forall lt.
HasLocalTime lt =>
Pattern (TimeInfo -> TimeInfo) (lt -> String) String
minute' = Lens TimeInfo TimeInfo Int Int
-> (lt -> Int)
-> Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> String
-> Pattern (TimeInfo -> TimeInfo) (lt -> String) String
forall s a s' a'.
Lens s s a a
-> (s' -> a')
-> Parser a String
-> ((s' -> a') -> Format String (s' -> String))
-> String
-> Pattern (s -> s) (s' -> String) String
pat_lens_field (Int -> f Int) -> TimeInfo -> f TimeInfo
Lens TimeInfo TimeInfo Int Int
PT.minute lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.minute Parser Int String
forall n. (Num n, Read n) => Parser n String
p_sixty (lt -> Int) -> Format String (lt -> String)
forall b a r. Show b => (a -> b) -> Format r (a -> r)
f_shown_two String
"minute: 00-59"
psecond :: HasLocalTime lt => Int -> Pattern (lt -> lt) (lt -> String) String
psecond :: forall lt.
HasLocalTime lt =>
Int -> Pattern (lt -> lt) (lt -> String) String
psecond Int
w = (lt -> Int)
-> (Int -> lt -> lt)
-> Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> String
-> Pattern (lt -> lt) (lt -> String) String
forall s a.
(s -> a)
-> (a -> s -> s)
-> Parser a String
-> ((s -> a) -> Format String (s -> String))
-> String
-> Pattern (s -> s) (s -> String) String
pat_field lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.second Int -> lt -> lt
forall {lt}. HasLocalTime lt => Int -> lt -> lt
LT.setSecond (Int -> Int -> Int -> Int -> Parser Int String
pDigits Int
w Int
2 Int
0 Int
59) (Int -> (lt -> Int) -> Format String (lt -> String)
forall b a r. Show b => Int -> (a -> b) -> Format r (a -> r)
f_shown_pad Int
w) String
"second: 00-59"
pss :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
pss :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pss = Int -> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Int -> Pattern (lt -> lt) (lt -> String) String
psecond Int
2
second' :: HasLocalTime lt => Pattern (TimeInfo -> TimeInfo) (lt -> String) String
second' :: forall lt.
HasLocalTime lt =>
Pattern (TimeInfo -> TimeInfo) (lt -> String) String
second' = Lens TimeInfo TimeInfo Int Int
-> (lt -> Int)
-> Parser Int String
-> ((lt -> Int) -> Format String (lt -> String))
-> String
-> Pattern (TimeInfo -> TimeInfo) (lt -> String) String
forall s a s' a'.
Lens s s a a
-> (s' -> a')
-> Parser a String
-> ((s' -> a') -> Format String (s' -> String))
-> String
-> Pattern (s -> s) (s' -> String) String
pat_lens_field (Int -> f Int) -> TimeInfo -> f TimeInfo
Lens TimeInfo TimeInfo Int Int
PT.second lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.second Parser Int String
forall n. (Num n, Read n) => Parser n String
p_sixty (lt -> Int) -> Format String (lt -> String)
forall b a r. Show b => (a -> b) -> Format r (a -> r)
f_shown_two String
"second: 00-59"
pfrac :: HasLocalTime lt => Int -> Pattern (lt -> lt) (lt -> String) String
pfrac :: forall lt.
HasLocalTime lt =>
Int -> Pattern (lt -> lt) (lt -> String) String
pfrac Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
1 Bool -> Bool -> Bool
|| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
9 = String -> Pattern (lt -> lt) (lt -> String) String
forall a. HasCallStack => String -> a
error String
"pfrac: fractional second width must be between 1 and 9"
| Bool
otherwise = Parser (lt -> lt) String
-> Format String (lt -> String)
-> Pattern (lt -> lt) (lt -> String) String
forall a b r. Parser a r -> Format r b -> Pattern a b r
Pattern Parser (lt -> lt) String
forall {u}. ParsecT String u Identity (lt -> lt)
par Format String (lt -> String)
forall {r'}. Format r' (lt -> r')
fmt
where
scale :: Int
scale = Int
10 Int -> Int -> Int
forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
9 Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n) :: Int
par :: ParsecT String u Identity (lt -> lt)
par = ((Int -> lt -> lt
forall {lt}. HasLocalTime lt => Int -> lt -> lt
LT.setNanosecond (Int -> lt -> lt) -> (String -> Int) -> String -> lt -> lt
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int
scale) (Int -> Int) -> (String -> Int) -> String -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Int
forall a. Read a => String -> a
read) (String -> lt -> lt)
-> ParsecT String u Identity String
-> ParsecT String u Identity (lt -> lt)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int
-> ParsecT String u Identity Char
-> ParsecT String u Identity String
forall s (m :: * -> *) t u a.
Stream s m t =>
Int -> ParsecT s u m a -> ParsecT s u m [a]
count Int
n ParsecT String u Identity Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
digit) ParsecT String u Identity (lt -> lt)
-> String -> ParsecT String u Identity (lt -> lt)
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> (String
"fractional second: " String -> String -> String
forall a. [a] -> [a] -> [a]
++ Int -> String
forall a. Show a => a -> String
show Int
n String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" digits")
fmt :: Format r' (lt -> r')
fmt = Int -> Char -> Format r' (Builder -> r')
forall a r. Buildable a => Int -> Char -> Format r (a -> r)
left Int
n Char
'0' Format r' (Builder -> r')
-> Format r' (lt -> r') -> Format r' (lt -> r')
forall r r' a.
Format r (Builder -> r') -> Format r' a -> Format r a
%. (lt -> Int) -> Format r' (lt -> r')
forall b a r. Show b => (a -> b) -> Format r (a -> r)
f_shown (\lt
lt -> lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.nanosecond lt
lt Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
scale)
pp :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
pp :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pp = Parser (lt -> lt) String
-> Format String (lt -> String)
-> Pattern (lt -> lt) (lt -> String) String
forall a b r. Parser a r -> Format r b -> Pattern a b r
Pattern Parser (lt -> lt) String
forall {u}. ParsecT String u Identity (lt -> lt)
par ((Bool -> String) -> Format String (lt -> String)
forall lt.
HasLocalTime lt =>
(Bool -> String) -> Format String (lt -> String)
amPmFormat Bool -> String
render)
where
par :: ParsecT String u Identity (lt -> lt)
par = (Bool -> lt -> lt
forall lt. HasLocalTime lt => Bool -> lt -> lt
amPmSetter (Bool -> lt -> lt)
-> ParsecT String u Identity Bool
-> ParsecT String u Identity (lt -> lt)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String u Identity Bool
forall {u}. ParsecT String u Identity Bool
desig) ParsecT String u Identity (lt -> lt)
-> String -> ParsecT String u Identity (lt -> lt)
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"period: A or P"
desig :: ParsecT String u Identity Bool
desig = (Bool
True Bool
-> ParsecT String u Identity Char -> ParsecT String u Identity Bool
forall a b.
a -> ParsecT String u Identity b -> ParsecT String u Identity a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ String -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
"Pp") ParsecT String u Identity Bool
-> ParsecT String u Identity Bool -> ParsecT String u Identity Bool
forall a.
ParsecT String u Identity a
-> ParsecT String u Identity a -> ParsecT String u Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Bool
False Bool
-> ParsecT String u Identity Char -> ParsecT String u Identity Bool
forall a b.
a -> ParsecT String u Identity b -> ParsecT String u Identity a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ String -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
"Aa")
render :: Bool -> String
render Bool
isPM = if Bool
isPM then String
"P" else String
"A"
ppp :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
ppp :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
ppp = Parser (lt -> lt) String
-> Format String (lt -> String)
-> Pattern (lt -> lt) (lt -> String) String
forall a b r. Parser a r -> Format r b -> Pattern a b r
Pattern Parser (lt -> lt) String
forall {u}. ParsecT String u Identity (lt -> lt)
par ((Bool -> String) -> Format String (lt -> String)
forall lt.
HasLocalTime lt =>
(Bool -> String) -> Format String (lt -> String)
amPmFormat Bool -> String
render)
where
par :: ParsecT String u Identity (lt -> lt)
par = (Bool -> lt -> lt
forall lt. HasLocalTime lt => Bool -> lt -> lt
amPmSetter (Bool -> lt -> lt)
-> ParsecT String u Identity Bool
-> ParsecT String u Identity (lt -> lt)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String u Identity Bool
forall {u}. ParsecT String u Identity Bool
desig) ParsecT String u Identity (lt -> lt)
-> String -> ParsecT String u Identity (lt -> lt)
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"period: AM or PM"
desig :: ParsecT String u Identity Bool
desig = (\Char
c -> Char
c Char -> String -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
"Pp") (Char -> Bool)
-> ParsecT String u Identity Char -> ParsecT String u Identity Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
"AaPp" ParsecT String u Identity Bool
-> ParsecT String u Identity Char -> ParsecT String u Identity Bool
forall a b.
ParsecT String u Identity a
-> ParsecT String u Identity b -> ParsecT String u Identity a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* String -> ParsecT String u Identity Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
oneOf String
"Mm"
render :: Bool -> String
render Bool
isPM = if Bool
isPM then String
"PM" else String
"AM"
pPeriod :: HasLocalTime lt => (String, String) -> Pattern (lt -> lt) (lt -> String) String
pPeriod :: forall lt.
HasLocalTime lt =>
(String, String) -> Pattern (lt -> lt) (lt -> String) String
pPeriod (String
am, String
pm) = Parser (lt -> lt) String
-> Format String (lt -> String)
-> Pattern (lt -> lt) (lt -> String) String
forall a b r. Parser a r -> Format r b -> Pattern a b r
Pattern Parser (lt -> lt) String
par ((Bool -> String) -> Format String (lt -> String)
forall lt.
HasLocalTime lt =>
(Bool -> String) -> Format String (lt -> String)
amPmFormat Bool -> String
render)
where
par :: Parser (lt -> lt) String
par = (Bool -> lt -> lt
forall lt. HasLocalTime lt => Bool -> lt -> lt
amPmSetter (Bool -> lt -> lt)
-> ParsecT String () Identity Bool -> Parser (lt -> lt) String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ParsecT String () Identity Bool
desig) Parser (lt -> lt) String -> String -> Parser (lt -> lt) String
forall s u (m :: * -> *) a.
ParsecT s u m a -> String -> ParsecT s u m a
<?> String
"period"
desig :: ParsecT String () Identity Bool
desig = (Bool
True Bool
-> ParsecT String () Identity String
-> ParsecT String () Identity Bool
forall a b.
a -> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ParsecT String () Identity String
-> ParsecT String () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT String () Identity String
caseInsensitiveString String
pm)) ParsecT String () Identity Bool
-> ParsecT String () Identity Bool
-> ParsecT String () Identity Bool
forall a.
ParsecT String () Identity a
-> ParsecT String () Identity a -> ParsecT String () Identity a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Bool
False Bool
-> ParsecT String () Identity String
-> ParsecT String () Identity Bool
forall a b.
a -> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ ParsecT String () Identity String
-> ParsecT String () Identity String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
try (String -> ParsecT String () Identity String
caseInsensitiveString String
am))
render :: Bool -> String
render Bool
isPM = if Bool
isPM then String
pm else String
am
ppp' :: HasLocalTime lt => Locale -> Pattern (lt -> lt) (lt -> String) String
ppp' :: forall lt.
HasLocalTime lt =>
Locale -> Pattern (lt -> lt) (lt -> String) String
ppp' Locale
loc = (String, String) -> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
(String, String) -> Pattern (lt -> lt) (lt -> String) String
pPeriod (Locale -> String
amName Locale
loc, Locale -> String
pmName Locale
loc)
amPmSetter :: HasLocalTime lt => Bool -> lt -> lt
amPmSetter :: forall lt. HasLocalTime lt => Bool -> lt -> lt
amPmSetter Bool
isPM lt
lt = Int -> lt -> lt
forall {lt}. HasLocalTime lt => Int -> lt -> lt
LT.setHour (Int
h12 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ if Bool
isPM then Int
12 else Int
0) lt
lt
where h12 :: Int
h12 = lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.hour lt
lt Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
12
amPmFormat :: HasLocalTime lt => (Bool -> String) -> Format String (lt -> String)
amPmFormat :: forall lt.
HasLocalTime lt =>
(Bool -> String) -> Format String (lt -> String)
amPmFormat Bool -> String
render = (lt -> Builder) -> Format String (lt -> String)
forall a r. (a -> Builder) -> Format r (a -> r)
later (Text -> Builder
TLB.fromText (Text -> Builder) -> (lt -> Text) -> lt -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> (lt -> String) -> lt -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bool -> String
render (Bool -> String) -> (lt -> Bool) -> lt -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= (Int
12 :: Int)) (Int -> Bool) -> (lt -> Int) -> lt -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. lt -> Int
forall lt. HasLocalTime lt => lt -> Int
LT.hour)
pt :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
pt :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pt = Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pHH Pattern (lt -> lt) (lt -> String) String
-> Pattern Char String String
-> Pattern (lt -> lt) (lt -> String) String
forall a b r c. Pattern a b r -> Pattern c r r -> Pattern a b r
<% Char -> Pattern Char String String
char Char
':' Pattern (lt -> lt) (lt -> String) String
-> Pattern (lt -> lt) (lt -> String) String
-> Pattern (lt -> lt) (lt -> String) String
forall a. Semigroup a => a -> a -> a
<> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pmm
pT :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
pT :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pT = Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pHH Pattern (lt -> lt) (lt -> String) String
-> Pattern Char String String
-> Pattern (lt -> lt) (lt -> String) String
forall a b r c. Pattern a b r -> Pattern c r r -> Pattern a b r
<% Char -> Pattern Char String String
char Char
':' Pattern (lt -> lt) (lt -> String) String
-> Pattern (lt -> lt) (lt -> String) String
-> Pattern (lt -> lt) (lt -> String) String
forall a. Semigroup a => a -> a -> a
<> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pmm Pattern (lt -> lt) (lt -> String) String
-> Pattern Char String String
-> Pattern (lt -> lt) (lt -> String) String
forall a b r c. Pattern a b r -> Pattern c r r -> Pattern a b r
<% Char -> Pattern Char String String
char Char
':' Pattern (lt -> lt) (lt -> String) String
-> Pattern (lt -> lt) (lt -> String) String
-> Pattern (lt -> lt) (lt -> String) String
forall a. Semigroup a => a -> a -> a
<> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pss
pr :: HasLocalTime lt => Pattern (lt -> lt) (lt -> String) String
pr :: forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pr = Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pT Pattern (lt -> lt) (lt -> String) String
-> Pattern Char String String
-> Pattern (lt -> lt) (lt -> String) String
forall a b r c. Pattern a b r -> Pattern c r r -> Pattern a b r
<% Char -> Pattern Char String String
char Char
'.' Pattern (lt -> lt) (lt -> String) String
-> Pattern (lt -> lt) (lt -> String) String
-> Pattern (lt -> lt) (lt -> String) String
forall a. Semigroup a => a -> a -> a
<> Int -> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Int -> Pattern (lt -> lt) (lt -> String) String
pfrac Int
9