{-# LANGUAGE FlexibleContexts #-}
module Data.HodaTime.Pattern.Locale
(
StrftimeError(..)
,ZonelessLayoutException(..)
,OffsetlessLayoutException(..)
,localeDatePattern
,localeTimePattern
,localeDateTimePattern
,localeOffsetDateTimePattern
,parseZonedDateTime
)
where
import Data.HodaTime.Pattern.Internal (Pattern(..), (<%), string)
import Data.HodaTime.Pattern.CalendarDate (pyyyy, pyy, pMM, pdd, pdaySpace, pMMMM', pMMM', pdddd', pddd')
import Data.HodaTime.Pattern.OffsetDateTime (offsetDateTimePattern)
import Data.HodaTime.Pattern.Offset (pOffsetCompact)
import Data.HodaTime.Pattern.LocalTime (pHH, phh, phhSpace, pmm, pss, ppp')
import Data.HodaTime.Pattern.ZonedDateTime.Internal (parseZonedDateTimeWith)
import Data.HodaTime.Locale.Internal (Locale(..))
import Data.HodaTime.CalendarDateTime.Internal (HasDate, DoW, MoY, Month, CalendarDateTime, IsCalendar)
import Data.HodaTime.LocalTime.Internal (HasLocalTime)
import Data.HodaTime.ZonedDateTime (ZonedDateTime)
import Data.HodaTime.OffsetDateTime (OffsetDateTime)
import Data.HodaTime.TimeZone (TimeZone)
import Control.Monad.Catch (MonadThrow, throwM)
import Control.Exception (Exception)
import Data.Typeable (Typeable)
import qualified Data.Text as T
import qualified Data.Text.Lazy.Builder as TLB
import qualified Text.Parsec as P (string)
import Formatting (later)
data StrftimeError
= UnsupportedSpecifier Char
| DanglingPercent
deriving (StrftimeError -> StrftimeError -> Bool
(StrftimeError -> StrftimeError -> Bool)
-> (StrftimeError -> StrftimeError -> Bool) -> Eq StrftimeError
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: StrftimeError -> StrftimeError -> Bool
== :: StrftimeError -> StrftimeError -> Bool
$c/= :: StrftimeError -> StrftimeError -> Bool
/= :: StrftimeError -> StrftimeError -> Bool
Eq, Int -> StrftimeError -> ShowS
[StrftimeError] -> ShowS
StrftimeError -> String
(Int -> StrftimeError -> ShowS)
-> (StrftimeError -> String)
-> ([StrftimeError] -> ShowS)
-> Show StrftimeError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> StrftimeError -> ShowS
showsPrec :: Int -> StrftimeError -> ShowS
$cshow :: StrftimeError -> String
show :: StrftimeError -> String
$cshowList :: [StrftimeError] -> ShowS
showList :: [StrftimeError] -> ShowS
Show, Typeable)
instance Exception StrftimeError
litField :: String -> Pattern (a -> a) (a -> String) String
litField :: forall a. String -> Pattern (a -> a) (a -> String) String
litField String
s = Parser (a -> a) String
-> Format String (a -> String)
-> Pattern (a -> a) (a -> String) String
forall a b r. Parser a r -> Format r b -> Pattern a b r
Pattern (a -> a
forall a. a -> a
id (a -> a)
-> ParsecT String () Identity String -> Parser (a -> a) String
forall a b.
a -> ParsecT String () Identity b -> ParsecT String () Identity a
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ String -> ParsecT String () Identity String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
s) ((a -> Builder) -> Format String (a -> String)
forall a r. (a -> Builder) -> Format r (a -> r)
later (Builder -> a -> Builder
forall a b. a -> b -> a
const (Text -> Builder
TLB.fromText (String -> Text
T.pack String
s))))
data Tok = Lit Char | Conv Char
data Frag = LitRun String | ConvF Char
tokenize :: String -> Either StrftimeError [Tok]
tokenize :: String -> Either StrftimeError [Tok]
tokenize [] = [Tok] -> Either StrftimeError [Tok]
forall a b. b -> Either a b
Right []
tokenize (Char
'%':Char
c:String
rest) = case Char
c of
Char
'%' -> (Char -> Tok
Lit Char
'%' Tok -> [Tok] -> [Tok]
forall a. a -> [a] -> [a]
:) ([Tok] -> [Tok])
-> Either StrftimeError [Tok] -> Either StrftimeError [Tok]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Either StrftimeError [Tok]
tokenize String
rest
Char
'n' -> (Char -> Tok
Lit Char
'\n' Tok -> [Tok] -> [Tok]
forall a. a -> [a] -> [a]
:) ([Tok] -> [Tok])
-> Either StrftimeError [Tok] -> Either StrftimeError [Tok]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Either StrftimeError [Tok]
tokenize String
rest
Char
't' -> (Char -> Tok
Lit Char
'\t' Tok -> [Tok] -> [Tok]
forall a. a -> [a] -> [a]
:) ([Tok] -> [Tok])
-> Either StrftimeError [Tok] -> Either StrftimeError [Tok]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Either StrftimeError [Tok]
tokenize String
rest
Char
'T' -> String -> Either StrftimeError [Tok]
tokenize (String
"%H:%M:%S" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
rest)
Char
'R' -> String -> Either StrftimeError [Tok]
tokenize (String
"%H:%M" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
rest)
Char
'r' -> String -> Either StrftimeError [Tok]
tokenize (String
"%I:%M:%S %p" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
rest)
Char
'F' -> String -> Either StrftimeError [Tok]
tokenize (String
"%Y-%m-%d" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
rest)
Char
'D' -> String -> Either StrftimeError [Tok]
tokenize (String
"%m/%d/%y" String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
rest)
Char
_ -> (Char -> Tok
Conv Char
c Tok -> [Tok] -> [Tok]
forall a. a -> [a] -> [a]
:) ([Tok] -> [Tok])
-> Either StrftimeError [Tok] -> Either StrftimeError [Tok]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Either StrftimeError [Tok]
tokenize String
rest
tokenize [Char
'%'] = StrftimeError -> Either StrftimeError [Tok]
forall a b. a -> Either a b
Left StrftimeError
DanglingPercent
tokenize (Char
c:String
rest) = (Char -> Tok
Lit Char
c Tok -> [Tok] -> [Tok]
forall a. a -> [a] -> [a]
:) ([Tok] -> [Tok])
-> Either StrftimeError [Tok] -> Either StrftimeError [Tok]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Either StrftimeError [Tok]
tokenize String
rest
toFrags :: [Tok] -> [Frag]
toFrags :: [Tok] -> [Frag]
toFrags = (Tok -> [Frag] -> [Frag]) -> [Frag] -> [Tok] -> [Frag]
forall a b. (a -> b -> b) -> b -> [a] -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Tok -> [Frag] -> [Frag]
step []
where
step :: Tok -> [Frag] -> [Frag]
step (Lit Char
c) (LitRun String
s : [Frag]
fs) = String -> Frag
LitRun (Char
c Char -> ShowS
forall a. a -> [a] -> [a]
: String
s) Frag -> [Frag] -> [Frag]
forall a. a -> [a] -> [a]
: [Frag]
fs
step (Lit Char
c) [Frag]
fs = String -> Frag
LitRun [Char
c] Frag -> [Frag] -> [Frag]
forall a. a -> [a] -> [a]
: [Frag]
fs
step (Conv Char
c) [Frag]
fs = Char -> Frag
ConvF Char
c Frag -> [Frag] -> [Frag]
forall a. a -> [a] -> [a]
: [Frag]
fs
assemble
:: (Char -> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> [Frag]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
assemble :: forall a.
(Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> [Frag]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
assemble Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
mapConv [Frag]
frags = do
[Pattern (a -> a) (a -> String) String]
ps <- (Frag
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> [Frag]
-> Either StrftimeError [Pattern (a -> a) (a -> String) String]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM Frag
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
toPat [Frag]
frags
case [Pattern (a -> a) (a -> String) String]
ps of
[] -> Pattern (a -> a) (a -> String) String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
forall a b. b -> Either a b
Right (String -> Pattern (a -> a) (a -> String) String
forall a. String -> Pattern (a -> a) (a -> String) String
litField String
"")
[Pattern (a -> a) (a -> String) String]
_ -> Pattern (a -> a) (a -> String) String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
forall a b. b -> Either a b
Right ((Pattern (a -> a) (a -> String) String
-> Pattern (a -> a) (a -> String) String
-> Pattern (a -> a) (a -> String) String)
-> [Pattern (a -> a) (a -> String) String]
-> Pattern (a -> a) (a -> String) String
forall a. (a -> a -> a) -> [a] -> a
forall (t :: * -> *) a. Foldable t => (a -> a -> a) -> t a -> a
foldr1 Pattern (a -> a) (a -> String) String
-> Pattern (a -> a) (a -> String) String
-> Pattern (a -> a) (a -> String) String
forall a. Semigroup a => a -> a -> a
(<>) [Pattern (a -> a) (a -> String) String]
ps)
where
toPat :: Frag
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
toPat (LitRun String
s) = Pattern (a -> a) (a -> String) String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
forall a b. b -> Either a b
Right (String -> Pattern (a -> a) (a -> String) String
forall a. String -> Pattern (a -> a) (a -> String) String
litField String
s)
toPat (ConvF Char
c) = Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
mapConv Char
c
compileWith
:: (Char -> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
compileWith :: forall a.
(Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
compileWith Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
mapConv String
fmtStr = String -> Either StrftimeError [Tok]
tokenize String
fmtStr Either StrftimeError [Tok]
-> ([Tok]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
forall a b.
Either StrftimeError a
-> (a -> Either StrftimeError b) -> Either StrftimeError b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> [Frag]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
forall a.
(Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> [Frag]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
assemble Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
mapConv ([Frag]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> ([Tok] -> [Frag])
-> [Tok]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tok] -> [Frag]
toFrags
compileDroppingZones
:: (Char -> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
compileDroppingZones :: forall a.
(Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
compileDroppingZones Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
mapConv String
fmtStr = String -> Either StrftimeError [Tok]
tokenize String
fmtStr Either StrftimeError [Tok]
-> ([Tok]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
forall a b.
Either StrftimeError a
-> (a -> Either StrftimeError b) -> Either StrftimeError b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> [Frag]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
forall a.
(Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> [Frag]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
assemble Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
mapConv ([Frag]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> ([Tok] -> [Frag])
-> [Tok]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Frag] -> [Frag]
stripZones ([Frag] -> [Frag]) -> ([Tok] -> [Frag]) -> [Tok] -> [Frag]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Tok] -> [Frag]
toFrags
stripZones :: [Frag] -> [Frag]
stripZones :: [Frag] -> [Frag]
stripZones [] = []
stripZones (LitRun String
s : ConvF Char
c : [Frag]
rest)
| Char -> Bool
isZone Char
c = [String -> Frag
LitRun String
s' | Bool -> Bool
not (String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
s')] [Frag] -> [Frag] -> [Frag]
forall a. [a] -> [a] -> [a]
++ [Frag] -> [Frag]
stripZones [Frag]
rest
where s' :: String
s' = ShowS
forall a. [a] -> [a]
reverse ((Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
' ') (ShowS
forall a. [a] -> [a]
reverse String
s))
stripZones (ConvF Char
c : [Frag]
rest)
| Char -> Bool
isZone Char
c = [Frag] -> [Frag]
stripZones [Frag]
rest
stripZones (Frag
f : [Frag]
rest) = Frag
f Frag -> [Frag] -> [Frag]
forall a. a -> [a] -> [a]
: [Frag] -> [Frag]
stripZones [Frag]
rest
isZone :: Char -> Bool
isZone :: Char -> Bool
isZone Char
c = Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'Z' Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'z'
dateConv :: (HasDate d, Enum (MoY d), Enum (DoW d)) => Locale -> Char -> Either StrftimeError (Pattern (d -> d) (d -> String) String)
dateConv :: forall d.
(HasDate d, Enum (MoY d), Enum (DoW d)) =>
Locale
-> Char
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
dateConv Locale
loc Char
c = case Char
c of
Char
'Y' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right Pattern (d -> d) (d -> String) String
forall d. HasDate d => Pattern (d -> d) (d -> String) String
pyyyy
Char
'y' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right Pattern (d -> d) (d -> String) String
forall d. HasDate d => Pattern (d -> d) (d -> String) String
pyy
Char
'm' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right Pattern (d -> d) (d -> String) String
forall d.
(HasDate d, Enum (MoY d)) =>
Pattern (d -> d) (d -> String) String
pMM
Char
'd' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right Pattern (d -> d) (d -> String) String
forall d. HasDate d => Pattern (d -> d) (d -> String) String
pdd
Char
'e' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right Pattern (d -> d) (d -> String) String
forall d. HasDate d => Pattern (d -> d) (d -> String) String
pdaySpace
Char
'B' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right (Locale -> Pattern (d -> d) (d -> String) String
forall d.
(HasDate d, Enum (MoY d)) =>
Locale -> Pattern (d -> d) (d -> String) String
pMMMM' Locale
loc)
Char
'b' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right (Locale -> Pattern (d -> d) (d -> String) String
forall d.
(HasDate d, Enum (MoY d)) =>
Locale -> Pattern (d -> d) (d -> String) String
pMMM' Locale
loc)
Char
'h' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right (Locale -> Pattern (d -> d) (d -> String) String
forall d.
(HasDate d, Enum (MoY d)) =>
Locale -> Pattern (d -> d) (d -> String) String
pMMM' Locale
loc)
Char
'A' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right (Locale -> Pattern (d -> d) (d -> String) String
forall d.
(HasDate d, Enum (DoW d)) =>
Locale -> Pattern (d -> d) (d -> String) String
pdddd' Locale
loc)
Char
'a' -> Pattern (d -> d) (d -> String) String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. b -> Either a b
Right (Locale -> Pattern (d -> d) (d -> String) String
forall d.
(HasDate d, Enum (DoW d)) =>
Locale -> Pattern (d -> d) (d -> String) String
pddd' Locale
loc)
Char
_ -> StrftimeError
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a b. a -> Either a b
Left (Char -> StrftimeError
UnsupportedSpecifier Char
c)
timeConv :: HasLocalTime lt => Locale -> Char -> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
timeConv :: forall lt.
HasLocalTime lt =>
Locale
-> Char
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
timeConv Locale
loc Char
c = case Char
c of
Char
'H' -> Pattern (lt -> lt) (lt -> String) String
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
forall a b. b -> Either a b
Right Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pHH
Char
'I' -> Pattern (lt -> lt) (lt -> String) String
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
forall a b. b -> Either a b
Right Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
phh
Char
'l' -> Pattern (lt -> lt) (lt -> String) String
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
forall a b. b -> Either a b
Right Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
phhSpace
Char
'M' -> Pattern (lt -> lt) (lt -> String) String
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
forall a b. b -> Either a b
Right Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pmm
Char
'S' -> Pattern (lt -> lt) (lt -> String) String
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
forall a b. b -> Either a b
Right Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Pattern (lt -> lt) (lt -> String) String
pss
Char
'p' -> Pattern (lt -> lt) (lt -> String) String
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
forall a b. b -> Either a b
Right (Locale -> Pattern (lt -> lt) (lt -> String) String
forall lt.
HasLocalTime lt =>
Locale -> Pattern (lt -> lt) (lt -> String) String
ppp' Locale
loc)
Char
_ -> StrftimeError
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
forall a b. a -> Either a b
Left (Char -> StrftimeError
UnsupportedSpecifier Char
c)
compileDatePattern :: (MonadThrow m, HasDate d, Enum (MoY d), Enum (DoW d)) => Locale -> String -> m (Pattern (d -> d) (d -> String) String)
compileDatePattern :: forall (m :: * -> *) d.
(MonadThrow m, HasDate d, Enum (MoY d), Enum (DoW d)) =>
Locale -> String -> m (Pattern (d -> d) (d -> String) String)
compileDatePattern Locale
loc = (StrftimeError -> m (Pattern (d -> d) (d -> String) String))
-> (Pattern (d -> d) (d -> String) String
-> m (Pattern (d -> d) (d -> String) String))
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
-> m (Pattern (d -> d) (d -> String) String)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either StrftimeError -> m (Pattern (d -> d) (d -> String) String)
forall e a. (HasCallStack, Exception e) => e -> m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM Pattern (d -> d) (d -> String) String
-> m (Pattern (d -> d) (d -> String) String)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either StrftimeError (Pattern (d -> d) (d -> String) String)
-> m (Pattern (d -> d) (d -> String) String))
-> (String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String))
-> String
-> m (Pattern (d -> d) (d -> String) String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char
-> Either StrftimeError (Pattern (d -> d) (d -> String) String))
-> String
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall a.
(Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
compileWith (Locale
-> Char
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
forall d.
(HasDate d, Enum (MoY d), Enum (DoW d)) =>
Locale
-> Char
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
dateConv Locale
loc)
compileTimePattern :: (MonadThrow m, HasLocalTime lt) => Locale -> String -> m (Pattern (lt -> lt) (lt -> String) String)
compileTimePattern :: forall (m :: * -> *) lt.
(MonadThrow m, HasLocalTime lt) =>
Locale -> String -> m (Pattern (lt -> lt) (lt -> String) String)
compileTimePattern Locale
loc = (StrftimeError -> m (Pattern (lt -> lt) (lt -> String) String))
-> (Pattern (lt -> lt) (lt -> String) String
-> m (Pattern (lt -> lt) (lt -> String) String))
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
-> m (Pattern (lt -> lt) (lt -> String) String)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either StrftimeError -> m (Pattern (lt -> lt) (lt -> String) String)
forall e a. (HasCallStack, Exception e) => e -> m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM Pattern (lt -> lt) (lt -> String) String
-> m (Pattern (lt -> lt) (lt -> String) String)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
-> m (Pattern (lt -> lt) (lt -> String) String))
-> (String
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String))
-> String
-> m (Pattern (lt -> lt) (lt -> String) String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String))
-> String
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
forall a.
(Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
compileWith (Locale
-> Char
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
forall lt.
HasLocalTime lt =>
Locale
-> Char
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
timeConv Locale
loc)
localeDatePattern :: (MonadThrow m, HasDate d, Enum (MoY d), Enum (DoW d)) => Locale -> m (Pattern (d -> d) (d -> String) String)
localeDatePattern :: forall (m :: * -> *) d.
(MonadThrow m, HasDate d, Enum (MoY d), Enum (DoW d)) =>
Locale -> m (Pattern (d -> d) (d -> String) String)
localeDatePattern Locale
loc = Locale -> String -> m (Pattern (d -> d) (d -> String) String)
forall (m :: * -> *) d.
(MonadThrow m, HasDate d, Enum (MoY d), Enum (DoW d)) =>
Locale -> String -> m (Pattern (d -> d) (d -> String) String)
compileDatePattern Locale
loc (Locale -> String
rawDateFormat Locale
loc)
localeTimePattern :: (MonadThrow m, HasLocalTime lt) => Locale -> m (Pattern (lt -> lt) (lt -> String) String)
localeTimePattern :: forall (m :: * -> *) lt.
(MonadThrow m, HasLocalTime lt) =>
Locale -> m (Pattern (lt -> lt) (lt -> String) String)
localeTimePattern Locale
loc = Locale -> String -> m (Pattern (lt -> lt) (lt -> String) String)
forall (m :: * -> *) lt.
(MonadThrow m, HasLocalTime lt) =>
Locale -> String -> m (Pattern (lt -> lt) (lt -> String) String)
compileTimePattern Locale
loc (Locale -> String
rawTimeFormat Locale
loc)
dateTimeConv :: (IsCalendar cal, Enum (Month cal), Enum (DoW (CalendarDateTime cal))) => Locale -> Char -> Either StrftimeError (Pattern (CalendarDateTime cal -> CalendarDateTime cal) (CalendarDateTime cal -> String) String)
dateTimeConv :: forall cal.
(IsCalendar cal, Enum (Month cal),
Enum (DoW (CalendarDateTime cal))) =>
Locale
-> Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
dateTimeConv Locale
loc Char
c = case Locale
-> Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall d.
(HasDate d, Enum (MoY d), Enum (DoW d)) =>
Locale
-> Char
-> Either StrftimeError (Pattern (d -> d) (d -> String) String)
dateConv Locale
loc Char
c of
Right Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
p -> Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall a b. b -> Either a b
Right Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
p
Left StrftimeError
_ -> Locale
-> Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall lt.
HasLocalTime lt =>
Locale
-> Char
-> Either StrftimeError (Pattern (lt -> lt) (lt -> String) String)
timeConv Locale
loc Char
c
localeDateTimePattern :: (MonadThrow m, IsCalendar cal, Enum (Month cal), Enum (DoW (CalendarDateTime cal))) => Locale -> m (Pattern (CalendarDateTime cal -> CalendarDateTime cal) (CalendarDateTime cal -> String) String)
localeDateTimePattern :: forall (m :: * -> *) cal.
(MonadThrow m, IsCalendar cal, Enum (Month cal),
Enum (DoW (CalendarDateTime cal))) =>
Locale
-> m (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
localeDateTimePattern Locale
loc = (StrftimeError
-> m (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String))
-> (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
-> m (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String))
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
-> m (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either StrftimeError
-> m (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall e a. (HasCallStack, Exception e) => e -> m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
-> m (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String))
-> String
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall a.
(Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> String
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
compileDroppingZones (Locale
-> Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall cal.
(IsCalendar cal, Enum (Month cal),
Enum (DoW (CalendarDateTime cal))) =>
Locale
-> Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
dateTimeConv Locale
loc) (Locale -> String
rawDateTimeFormat Locale
loc))
newtype ZonelessLayoutException = ZonelessLayout String
deriving (ZonelessLayoutException -> ZonelessLayoutException -> Bool
(ZonelessLayoutException -> ZonelessLayoutException -> Bool)
-> (ZonelessLayoutException -> ZonelessLayoutException -> Bool)
-> Eq ZonelessLayoutException
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ZonelessLayoutException -> ZonelessLayoutException -> Bool
== :: ZonelessLayoutException -> ZonelessLayoutException -> Bool
$c/= :: ZonelessLayoutException -> ZonelessLayoutException -> Bool
/= :: ZonelessLayoutException -> ZonelessLayoutException -> Bool
Eq, Int -> ZonelessLayoutException -> ShowS
[ZonelessLayoutException] -> ShowS
ZonelessLayoutException -> String
(Int -> ZonelessLayoutException -> ShowS)
-> (ZonelessLayoutException -> String)
-> ([ZonelessLayoutException] -> ShowS)
-> Show ZonelessLayoutException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ZonelessLayoutException -> ShowS
showsPrec :: Int -> ZonelessLayoutException -> ShowS
$cshow :: ZonelessLayoutException -> String
show :: ZonelessLayoutException -> String
$cshowList :: [ZonelessLayoutException] -> ShowS
showList :: [ZonelessLayoutException] -> ShowS
Show, Typeable)
instance Exception ZonelessLayoutException
parseZonedDateTime
:: (MonadThrow m, IsCalendar cal, Enum (Month cal), Enum (DoW (CalendarDateTime cal)))
=> (String -> m TimeZone)
-> (CalendarDateTime cal -> TimeZone -> m (ZonedDateTime cal))
-> Locale
-> String
-> m (ZonedDateTime cal)
parseZonedDateTime :: forall (m :: * -> *) cal.
(MonadThrow m, IsCalendar cal, Enum (Month cal),
Enum (DoW (CalendarDateTime cal))) =>
(String -> m TimeZone)
-> (CalendarDateTime cal -> TimeZone -> m (ZonedDateTime cal))
-> Locale
-> String
-> m (ZonedDateTime cal)
parseZonedDateTime String -> m TimeZone
provider CalendarDateTime cal -> TimeZone -> m (ZonedDateTime cal)
resolve Locale
loc String
s
| String -> Bool
hasZoneSpecifier (Locale -> String
rawDateTimeFormat Locale
loc) = Locale
-> m (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall (m :: * -> *) cal.
(MonadThrow m, IsCalendar cal, Enum (Month cal),
Enum (DoW (CalendarDateTime cal))) =>
Locale
-> m (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
localeDateTimePattern Locale
loc m (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
-> (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
-> m (ZonedDateTime cal))
-> m (ZonedDateTime cal)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
localPat -> Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
-> (String -> m TimeZone)
-> (CalendarDateTime cal -> TimeZone -> m (ZonedDateTime cal))
-> String
-> m (ZonedDateTime cal)
forall (m :: * -> *) cal b.
(MonadThrow m, IsCalendar cal) =>
Pattern (CalendarDateTime cal -> CalendarDateTime cal) b String
-> (String -> m TimeZone)
-> (CalendarDateTime cal -> TimeZone -> m (ZonedDateTime cal))
-> String
-> m (ZonedDateTime cal)
parseZonedDateTimeWith Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
localPat String -> m TimeZone
provider CalendarDateTime cal -> TimeZone -> m (ZonedDateTime cal)
resolve String
s
| Bool
otherwise = ZonelessLayoutException -> m (ZonedDateTime cal)
forall e a. (HasCallStack, Exception e) => e -> m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM (String -> ZonelessLayoutException
ZonelessLayout (Locale -> String
localeId Locale
loc))
hasZoneSpecifier :: String -> Bool
hasZoneSpecifier :: String -> Bool
hasZoneSpecifier (Char
'%':Char
'%':String
rest) = String -> Bool
hasZoneSpecifier String
rest
hasZoneSpecifier (Char
'%':Char
'Z':String
_) = Bool
True
hasZoneSpecifier (Char
'%':Char
_:String
rest) = String -> Bool
hasZoneSpecifier String
rest
hasZoneSpecifier (Char
_:String
rest) = String -> Bool
hasZoneSpecifier String
rest
hasZoneSpecifier [] = Bool
False
newtype OffsetlessLayoutException = OffsetlessLayout String
deriving (OffsetlessLayoutException -> OffsetlessLayoutException -> Bool
(OffsetlessLayoutException -> OffsetlessLayoutException -> Bool)
-> (OffsetlessLayoutException -> OffsetlessLayoutException -> Bool)
-> Eq OffsetlessLayoutException
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: OffsetlessLayoutException -> OffsetlessLayoutException -> Bool
== :: OffsetlessLayoutException -> OffsetlessLayoutException -> Bool
$c/= :: OffsetlessLayoutException -> OffsetlessLayoutException -> Bool
/= :: OffsetlessLayoutException -> OffsetlessLayoutException -> Bool
Eq, Int -> OffsetlessLayoutException -> ShowS
[OffsetlessLayoutException] -> ShowS
OffsetlessLayoutException -> String
(Int -> OffsetlessLayoutException -> ShowS)
-> (OffsetlessLayoutException -> String)
-> ([OffsetlessLayoutException] -> ShowS)
-> Show OffsetlessLayoutException
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> OffsetlessLayoutException -> ShowS
showsPrec :: Int -> OffsetlessLayoutException -> ShowS
$cshow :: OffsetlessLayoutException -> String
show :: OffsetlessLayoutException -> String
$cshowList :: [OffsetlessLayoutException] -> ShowS
showList :: [OffsetlessLayoutException] -> ShowS
Show, Typeable)
instance Exception OffsetlessLayoutException
localeOffsetDateTimePattern
:: (MonadThrow m, IsCalendar cal, Enum (Month cal), Enum (DoW (CalendarDateTime cal)))
=> Locale
-> m (Pattern (OffsetDateTime cal -> OffsetDateTime cal) (OffsetDateTime cal -> String) String)
localeOffsetDateTimePattern :: forall (m :: * -> *) cal.
(MonadThrow m, IsCalendar cal, Enum (Month cal),
Enum (DoW (CalendarDateTime cal))) =>
Locale
-> m (Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
localeOffsetDateTimePattern Locale
loc
| String -> Bool
hasOffsetSpecifier String
fmt = (StrftimeError
-> m (Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String))
-> (Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String
-> m (Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String))
-> Either
StrftimeError
(Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
-> m (Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either StrftimeError
-> m (Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
forall e a. (HasCallStack, Exception e) => e -> m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String
-> m (Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ((Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String))
-> String
-> Either
StrftimeError
(Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
forall cal.
IsCalendar cal =>
(Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String))
-> String
-> Either
StrftimeError
(Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
compileOffsetDateTime (Locale
-> Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall cal.
(IsCalendar cal, Enum (Month cal),
Enum (DoW (CalendarDateTime cal))) =>
Locale
-> Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
dateTimeConv Locale
loc) String
fmt)
| Bool
otherwise = OffsetlessLayoutException
-> m (Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
forall e a. (HasCallStack, Exception e) => e -> m a
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> m a
throwM (String -> OffsetlessLayoutException
OffsetlessLayout (Locale -> String
localeId Locale
loc))
where fmt :: String
fmt = Locale -> String
rawDateTimeFormat Locale
loc
compileOffsetDateTime
:: IsCalendar cal
=> (Char -> Either StrftimeError (Pattern (CalendarDateTime cal -> CalendarDateTime cal) (CalendarDateTime cal -> String) String))
-> String
-> Either StrftimeError (Pattern (OffsetDateTime cal -> OffsetDateTime cal) (OffsetDateTime cal -> String) String)
compileOffsetDateTime :: forall cal.
IsCalendar cal =>
(Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String))
-> String
-> Either
StrftimeError
(Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
compileOffsetDateTime Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
dtConv String
fmtStr = do
[Tok]
toks <- String -> Either StrftimeError [Tok]
tokenize String
fmtStr
let ([Frag]
before, [Frag]
rest) = (Frag -> Bool) -> [Frag] -> ([Frag], [Frag])
forall a. (a -> Bool) -> [a] -> ([a], [a])
break Frag -> Bool
isOffsetFrag ([Tok] -> [Frag]
toFrags [Tok]
toks)
Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
localPat <- (Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String))
-> [Frag]
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
forall a.
(Char
-> Either StrftimeError (Pattern (a -> a) (a -> String) String))
-> [Frag]
-> Either StrftimeError (Pattern (a -> a) (a -> String) String)
assemble Char
-> Either
StrftimeError
(Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String)
dtConv [Frag]
before
String
trailing <- [Frag] -> Either StrftimeError String
trailingLits (Int -> [Frag] -> [Frag]
forall a. Int -> [a] -> [a]
drop Int
1 [Frag]
rest)
Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String
-> Either
StrftimeError
(Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String)
forall a. a -> Either StrftimeError a
forall (m :: * -> *) a. Monad m => a -> m a
return (Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
-> Pattern (Offset -> Offset) (Offset -> String) String
-> Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String
forall cal.
IsCalendar cal =>
Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
-> Pattern (Offset -> Offset) (Offset -> String) String
-> Pattern
(OffsetDateTime cal -> OffsetDateTime cal)
(OffsetDateTime cal -> String)
String
offsetDateTimePattern Pattern
(CalendarDateTime cal -> CalendarDateTime cal)
(CalendarDateTime cal -> String)
String
localPat (Pattern (Offset -> Offset) (Offset -> String) String
pOffsetCompact Pattern (Offset -> Offset) (Offset -> String) String
-> Pattern String String String
-> Pattern (Offset -> Offset) (Offset -> String) String
forall a b r c. Pattern a b r -> Pattern c r r -> Pattern a b r
<% String -> Pattern String String String
string String
trailing))
isOffsetFrag :: Frag -> Bool
isOffsetFrag :: Frag -> Bool
isOffsetFrag (ConvF Char
'z') = Bool
True
isOffsetFrag Frag
_ = Bool
False
trailingLits :: [Frag] -> Either StrftimeError String
trailingLits :: [Frag] -> Either StrftimeError String
trailingLits [] = String -> Either StrftimeError String
forall a b. b -> Either a b
Right String
""
trailingLits (LitRun String
s : [Frag]
rest) = (String
s String -> ShowS
forall a. [a] -> [a] -> [a]
++) ShowS -> Either StrftimeError String -> Either StrftimeError String
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Frag] -> Either StrftimeError String
trailingLits [Frag]
rest
trailingLits (ConvF Char
c : [Frag]
_) = StrftimeError -> Either StrftimeError String
forall a b. a -> Either a b
Left (Char -> StrftimeError
UnsupportedSpecifier Char
c)
hasOffsetSpecifier :: String -> Bool
hasOffsetSpecifier :: String -> Bool
hasOffsetSpecifier (Char
'%':Char
'%':String
rest) = String -> Bool
hasOffsetSpecifier String
rest
hasOffsetSpecifier (Char
'%':Char
'z':String
_) = Bool
True
hasOffsetSpecifier (Char
'%':Char
_:String
rest) = String -> Bool
hasOffsetSpecifier String
rest
hasOffsetSpecifier (Char
_:String
rest) = String -> Bool
hasOffsetSpecifier String
rest
hasOffsetSpecifier [] = Bool
False