{-# LANGUAGE Safe #-}moduleData.Time.Format.Parse.Class(-- * ParsingParseNumericPadding (..),ParseTime (..),parseSpecifiers ,timeSubstituteTimeSpecifier ,timeParseTimeSpecifier ,durationParseTimeSpecifier ,)whereimportData.CharimportData.MaybeimportData.ProxyimportData.Time.Format.Locale importText.ParserCombinators.ReadPdataParseNumericPadding =NoPadding |SpacePadding |ZeroPadding -- | The class of types which can be parsed given a UNIX-style time format-- string.classParseTime t where-- | @since 1.9.1substituteTimeSpecifier ::Proxyt ->TimeLocale ->Char->MaybeStringsubstituteTimeSpecifier Proxy t _TimeLocale _Char _=Maybe String forall a. Maybe a Nothing-- | Get the string corresponding to the given format specifier.---- @since 1.9.1parseTimeSpecifier ::Proxyt ->TimeLocale ->MaybeParseNumericPadding ->Char->ReadPString-- | Builds a time value from a parsed input string.-- If the input does not include all the information needed to-- construct a complete value, any missing parts should be taken-- from 1970年01月01日 00:00:00 +0000 (which was a Thursday).-- In the absence of @%C@ or @%Y@, century is 1969 - 2068.---- @since 1.9.1buildTime ::-- | The time locale.TimeLocale ->-- | Pairs of format characters and the-- corresponding part of the input.[(Char,String)]->Maybet -- | Case-insensitive version of 'Text.ParserCombinators.ReadP.char'.charCI ::Char->ReadPCharcharCI :: Char -> ReadP Char charCI Char c =(Char -> Bool) -> ReadP Char satisfy(\Char x ->Char -> Char toUpperChar c Char -> Char -> Bool forall a. Eq a => a -> a -> Bool ==Char -> Char toUpperChar x )-- | Case-insensitive version of 'Text.ParserCombinators.ReadP.string'.stringCI ::String->ReadPStringstringCI :: String -> ReadP String stringCI String this =doletscan :: String -> String -> ReadP String scan []String _=String -> ReadP String forall (m :: * -> *) a. Monad m => a -> m a returnString this scan (Char x :String xs )(Char y :String ys )|Char -> Char toUpperChar x Char -> Char -> Bool forall a. Eq a => a -> a -> Bool ==Char -> Char toUpperChar y =doChar _<-ReadP Char getString -> String -> ReadP String scan String xs String ys scan String _String _=ReadP String forall a. ReadP a pfailString s <-ReadP String lookString -> String -> ReadP String scan String this String s parseSpecifiers ::ParseTime t =>Proxyt ->TimeLocale ->String->ReadP[(Char,String)]parseSpecifiers :: Proxy t -> TimeLocale -> String -> ReadP [(Char, String)] parseSpecifiers Proxy t pt TimeLocale locale =letparse ::String->ReadP[(Char,String)]parse :: String -> ReadP [(Char, String)] parse []=[(Char, String)] -> ReadP [(Char, String)] forall (m :: * -> *) a. Monad m => a -> m a return[]parse (Char '%':String cs )=String -> ReadP [(Char, String)] parse1 String cs parse (Char c :String cs )|Char -> Bool isSpaceChar c =doChar _<-(Char -> Bool) -> ReadP Char satisfyChar -> Bool isSpacecaseString cs of(Char c' :String _)|Char -> Bool isSpaceChar c' ->() -> ReadP () forall (m :: * -> *) a. Monad m => a -> m a return()String _->ReadP () skipSpacesString -> ReadP [(Char, String)] parse String cs parse (Char c :String cs )=doChar _<-Char -> ReadP Char charCI Char c String -> ReadP [(Char, String)] parse String cs parse1 ::String->ReadP[(Char,String)]parse1 :: String -> ReadP [(Char, String)] parse1 (Char '-':String cs )=Maybe ParseNumericPadding -> String -> ReadP [(Char, String)] parse2 (ParseNumericPadding -> Maybe ParseNumericPadding forall a. a -> Maybe a JustParseNumericPadding NoPadding )String cs parse1 (Char '_':String cs )=Maybe ParseNumericPadding -> String -> ReadP [(Char, String)] parse2 (ParseNumericPadding -> Maybe ParseNumericPadding forall a. a -> Maybe a JustParseNumericPadding SpacePadding )String cs parse1 (Char '0':String cs )=Maybe ParseNumericPadding -> String -> ReadP [(Char, String)] parse2 (ParseNumericPadding -> Maybe ParseNumericPadding forall a. a -> Maybe a JustParseNumericPadding ZeroPadding )String cs parse1 String cs =Maybe ParseNumericPadding -> String -> ReadP [(Char, String)] parse2 Maybe ParseNumericPadding forall a. Maybe a NothingString cs parse2 ::MaybeParseNumericPadding ->String->ReadP[(Char,String)]parse2 :: Maybe ParseNumericPadding -> String -> ReadP [(Char, String)] parse2 Maybe ParseNumericPadding mpad (Char 'E':String cs )=Maybe ParseNumericPadding -> Bool -> String -> ReadP [(Char, String)] parse3 Maybe ParseNumericPadding mpad Bool TrueString cs parse2 Maybe ParseNumericPadding mpad String cs =Maybe ParseNumericPadding -> Bool -> String -> ReadP [(Char, String)] parse3 Maybe ParseNumericPadding mpad Bool FalseString cs parse3 ::MaybeParseNumericPadding ->Bool->String->ReadP[(Char,String)]parse3 :: Maybe ParseNumericPadding -> Bool -> String -> ReadP [(Char, String)] parse3 Maybe ParseNumericPadding _Bool _(Char '%':String cs )=doChar _<-Char -> ReadP Char charChar '%'String -> ReadP [(Char, String)] parse String cs parse3 Maybe ParseNumericPadding _Bool _(Char c :String cs )|JustString s <-Proxy t -> TimeLocale -> Char -> Maybe String forall t. ParseTime t => Proxy t -> TimeLocale -> Char -> Maybe String substituteTimeSpecifier Proxy t pt TimeLocale locale Char c =String -> ReadP [(Char, String)] parse (String -> ReadP [(Char, String)]) -> String -> ReadP [(Char, String)] forall a b. (a -> b) -> a -> b $String s String -> String -> String forall a. [a] -> [a] -> [a] ++String cs parse3 Maybe ParseNumericPadding mpad Bool _alt (Char c :String cs )=doString str <-Proxy t -> TimeLocale -> Maybe ParseNumericPadding -> Char -> ReadP String forall t. ParseTime t => Proxy t -> TimeLocale -> Maybe ParseNumericPadding -> Char -> ReadP String parseTimeSpecifier Proxy t pt TimeLocale locale Maybe ParseNumericPadding mpad Char c [(Char, String)] specs <-String -> ReadP [(Char, String)] parse String cs [(Char, String)] -> ReadP [(Char, String)] forall (m :: * -> *) a. Monad m => a -> m a return([(Char, String)] -> ReadP [(Char, String)]) -> [(Char, String)] -> ReadP [(Char, String)] forall a b. (a -> b) -> a -> b $(Char c ,String str )(Char, String) -> [(Char, String)] -> [(Char, String)] forall a. a -> [a] -> [a] :[(Char, String)] specs parse3 Maybe ParseNumericPadding _Bool _[]=[(Char, String)] -> ReadP [(Char, String)] forall (m :: * -> *) a. Monad m => a -> m a return[]inString -> ReadP [(Char, String)] parse dataPaddingSide =PrePadding |PostPadding allowEmptyParser ::Bool->ReadPStringallowEmptyParser :: Bool -> ReadP String allowEmptyParser Bool False=ReadP Char -> ReadP String forall a. ReadP a -> ReadP [a] many1((Char -> Bool) -> ReadP Char satisfyChar -> Bool isDigit)allowEmptyParser Bool True=ReadP Char -> ReadP String forall a. ReadP a -> ReadP [a] many((Char -> Bool) -> ReadP Char satisfyChar -> Bool isDigit)parsePaddedDigits ::PaddingSide ->ParseNumericPadding ->Bool->Int->ReadPStringparsePaddedDigits :: PaddingSide -> ParseNumericPadding -> Bool -> Int -> ReadP String parsePaddedDigits PaddingSide _ParseNumericPadding ZeroPadding Bool _Int n =Int -> ReadP Char -> ReadP String forall a. Int -> ReadP a -> ReadP [a] countInt n ((Char -> Bool) -> ReadP Char satisfyChar -> Bool isDigit)parsePaddedDigits PaddingSide PrePadding ParseNumericPadding SpacePadding Bool allowEmpty Int _n =ReadP () skipSpacesReadP () -> ReadP String -> ReadP String forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>Bool -> ReadP String allowEmptyParser Bool allowEmpty parsePaddedDigits PaddingSide PostPadding ParseNumericPadding SpacePadding Bool allowEmpty Int _n =doString r <-Bool -> ReadP String allowEmptyParser Bool allowEmpty ReadP () skipSpacesString -> ReadP String forall (m :: * -> *) a. Monad m => a -> m a returnString r parsePaddedDigits PaddingSide _ParseNumericPadding NoPadding Bool FalseInt _n =ReadP Char -> ReadP String forall a. ReadP a -> ReadP [a] many1((Char -> Bool) -> ReadP Char satisfyChar -> Bool isDigit)parsePaddedDigits PaddingSide _ParseNumericPadding NoPadding Bool TrueInt _n =ReadP Char -> ReadP String forall a. ReadP a -> ReadP [a] many((Char -> Bool) -> ReadP Char satisfyChar -> Bool isDigit)parsePaddedSignedDigits ::ParseNumericPadding ->Int->ReadPStringparsePaddedSignedDigits :: ParseNumericPadding -> Int -> ReadP String parsePaddedSignedDigits ParseNumericPadding pad Int n =doString sign <-String -> ReadP String -> ReadP String forall a. a -> ReadP a -> ReadP a optionString ""(ReadP String -> ReadP String) -> ReadP String -> ReadP String forall a b. (a -> b) -> a -> b $Char -> ReadP Char charChar '-'ReadP Char -> ReadP String -> ReadP String forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>String -> ReadP String forall (m :: * -> *) a. Monad m => a -> m a returnString "-"String digits <-PaddingSide -> ParseNumericPadding -> Bool -> Int -> ReadP String parsePaddedDigits PaddingSide PrePadding ParseNumericPadding pad Bool FalseInt n String -> ReadP String forall (m :: * -> *) a. Monad m => a -> m a return(String -> ReadP String) -> String -> ReadP String forall a b. (a -> b) -> a -> b $String sign String -> String -> String forall a. [a] -> [a] -> [a] ++String digits parseSignedDecimal ::ReadPStringparseSignedDecimal :: ReadP String parseSignedDecimal =doString sign <-String -> ReadP String -> ReadP String forall a. a -> ReadP a -> ReadP a optionString ""(ReadP String -> ReadP String) -> ReadP String -> ReadP String forall a b. (a -> b) -> a -> b $Char -> ReadP Char charChar '-'ReadP Char -> ReadP String -> ReadP String forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>String -> ReadP String forall (m :: * -> *) a. Monad m => a -> m a returnString "-"ReadP () skipSpacesString digits <-ReadP Char -> ReadP String forall a. ReadP a -> ReadP [a] many1(ReadP Char -> ReadP String) -> ReadP Char -> ReadP String forall a b. (a -> b) -> a -> b $(Char -> Bool) -> ReadP Char satisfyChar -> Bool isDigitString decimaldigits <-String -> ReadP String -> ReadP String forall a. a -> ReadP a -> ReadP a optionString ""(ReadP String -> ReadP String) -> ReadP String -> ReadP String forall a b. (a -> b) -> a -> b $doChar _<-Char -> ReadP Char charChar '.'String dd <-ReadP Char -> ReadP String forall a. ReadP a -> ReadP [a] many(ReadP Char -> ReadP String) -> ReadP Char -> ReadP String forall a b. (a -> b) -> a -> b $(Char -> Bool) -> ReadP Char satisfyChar -> Bool isDigitString -> ReadP String forall (m :: * -> *) a. Monad m => a -> m a return(String -> ReadP String) -> String -> ReadP String forall a b. (a -> b) -> a -> b $Char '.'Char -> String -> String forall a. a -> [a] -> [a] :String dd String -> ReadP String forall (m :: * -> *) a. Monad m => a -> m a return(String -> ReadP String) -> String -> ReadP String forall a b. (a -> b) -> a -> b $String sign String -> String -> String forall a. [a] -> [a] -> [a] ++String digits String -> String -> String forall a. [a] -> [a] -> [a] ++String decimaldigits timeParseTimeSpecifier ::TimeLocale ->MaybeParseNumericPadding ->Char->ReadPStringtimeParseTimeSpecifier :: TimeLocale -> Maybe ParseNumericPadding -> Char -> ReadP String timeParseTimeSpecifier TimeLocale l Maybe ParseNumericPadding mpad Char c =letdigits' :: PaddingSide -> ParseNumericPadding -> Bool -> Int -> ReadP String digits' PaddingSide ps ParseNumericPadding pad =PaddingSide -> ParseNumericPadding -> Bool -> Int -> ReadP String parsePaddedDigits PaddingSide ps (ParseNumericPadding -> Maybe ParseNumericPadding -> ParseNumericPadding forall a. a -> Maybe a -> a fromMaybeParseNumericPadding pad Maybe ParseNumericPadding mpad )digits :: ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding pad =PaddingSide -> ParseNumericPadding -> Bool -> Int -> ReadP String digits' PaddingSide PrePadding ParseNumericPadding pad Bool FalseoneOf :: [String] -> ReadP String oneOf =[ReadP String] -> ReadP String forall a. [ReadP a] -> ReadP a choice([ReadP String] -> ReadP String) -> ([String] -> [ReadP String]) -> [String] -> ReadP String forall b c a. (b -> c) -> (a -> b) -> a -> c .(String -> ReadP String) -> [String] -> [ReadP String] forall a b. (a -> b) -> [a] -> [b] mapString -> ReadP String stringCI numericTZ :: ReadP String numericTZ =doChar s <-[ReadP Char] -> ReadP Char forall a. [ReadP a] -> ReadP a choice[Char -> ReadP Char charChar '+',Char -> ReadP Char charChar '-']String h <-PaddingSide -> ParseNumericPadding -> Bool -> Int -> ReadP String parsePaddedDigits PaddingSide PrePadding ParseNumericPadding ZeroPadding Bool FalseInt 2ReadP Char -> ReadP () forall a. ReadP a -> ReadP () optional(Char -> ReadP Char charChar ':')String m <-PaddingSide -> ParseNumericPadding -> Bool -> Int -> ReadP String parsePaddedDigits PaddingSide PrePadding ParseNumericPadding ZeroPadding Bool FalseInt 2String -> ReadP String forall (m :: * -> *) a. Monad m => a -> m a return(Char s Char -> String -> String forall a. a -> [a] -> [a] :String h String -> String -> String forall a. [a] -> [a] -> [a] ++String m )allowNegative ::ReadPString->ReadPStringallowNegative :: ReadP String -> ReadP String allowNegative ReadP String p =(Char -> ReadP Char charChar '-'ReadP Char -> ReadP String -> ReadP String forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>(String -> String) -> ReadP String -> ReadP String forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(Char '-'Char -> String -> String forall a. a -> [a] -> [a] :)ReadP String p )ReadP String -> ReadP String -> ReadP String forall a. ReadP a -> ReadP a -> ReadP a <++ReadP String p incaseChar c of-- centuryChar 'C'->ReadP String -> ReadP String allowNegative (ReadP String -> ReadP String) -> ReadP String -> ReadP String forall a b. (a -> b) -> a -> b $ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding SpacePadding Int 2Char 'f'->ReadP String -> ReadP String allowNegative (ReadP String -> ReadP String) -> ReadP String -> ReadP String forall a b. (a -> b) -> a -> b $ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding SpacePadding Int 2-- yearChar 'Y'->ReadP String -> ReadP String allowNegative (ReadP String -> ReadP String) -> ReadP String -> ReadP String forall a b. (a -> b) -> a -> b $ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding SpacePadding Int 4Char 'G'->ReadP String -> ReadP String allowNegative (ReadP String -> ReadP String) -> ReadP String -> ReadP String forall a b. (a -> b) -> a -> b $ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding SpacePadding Int 4-- year of centuryChar 'y'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2Char 'g'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2-- month of yearChar 'B'->[String] -> ReadP String oneOf (((String, String) -> String) -> [(String, String)] -> [String] forall a b. (a -> b) -> [a] -> [b] map(String, String) -> String forall a b. (a, b) -> a fst(TimeLocale -> [(String, String)] months TimeLocale l ))Char 'b'->[String] -> ReadP String oneOf (((String, String) -> String) -> [(String, String)] -> [String] forall a b. (a -> b) -> [a] -> [b] map(String, String) -> String forall a b. (a, b) -> b snd(TimeLocale -> [(String, String)] months TimeLocale l ))Char 'm'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2-- day of monthChar 'd'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2Char 'e'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding SpacePadding Int 2-- week of yearChar 'V'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2Char 'U'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2Char 'W'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2-- day of weekChar 'u'->[String] -> ReadP String oneOf ([String] -> ReadP String) -> [String] -> ReadP String forall a b. (a -> b) -> a -> b $(Char -> String) -> String -> [String] forall a b. (a -> b) -> [a] -> [b] map(Char -> String -> String forall a. a -> [a] -> [a] :[])[Char '1'..Char '7']Char 'a'->[String] -> ReadP String oneOf (((String, String) -> String) -> [(String, String)] -> [String] forall a b. (a -> b) -> [a] -> [b] map(String, String) -> String forall a b. (a, b) -> b snd(TimeLocale -> [(String, String)] wDays TimeLocale l ))Char 'A'->[String] -> ReadP String oneOf (((String, String) -> String) -> [(String, String)] -> [String] forall a b. (a -> b) -> [a] -> [b] map(String, String) -> String forall a b. (a, b) -> a fst(TimeLocale -> [(String, String)] wDays TimeLocale l ))Char 'w'->[String] -> ReadP String oneOf ([String] -> ReadP String) -> [String] -> ReadP String forall a b. (a -> b) -> a -> b $(Char -> String) -> String -> [String] forall a b. (a -> b) -> [a] -> [b] map(Char -> String -> String forall a. a -> [a] -> [a] :[])[Char '0'..Char '6']-- day of yearChar 'j'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 3-- dayhalf of day (i.e. AM or PM)Char 'P'->[String] -> ReadP String oneOf (let(String am ,String pm )=TimeLocale -> (String, String) amPm TimeLocale l in[String am ,String pm ])Char 'p'->[String] -> ReadP String oneOf (let(String am ,String pm )=TimeLocale -> (String, String) amPm TimeLocale l in[String am ,String pm ])-- hour of day (i.e. 24h)Char 'H'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2Char 'k'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding SpacePadding Int 2-- hour of dayhalf (i.e. 12h)Char 'I'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2Char 'l'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding SpacePadding Int 2-- minute of hourChar 'M'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2-- second of minuteChar 'S'->ParseNumericPadding -> Int -> ReadP String digits ParseNumericPadding ZeroPadding Int 2-- picosecond of secondChar 'q'->PaddingSide -> ParseNumericPadding -> Bool -> Int -> ReadP String digits' PaddingSide PostPadding ParseNumericPadding ZeroPadding Bool TrueInt 12Char 'Q'->(Char -> ReadP Char charChar '.'ReadP Char -> ReadP String -> ReadP String forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>PaddingSide -> ParseNumericPadding -> Bool -> Int -> ReadP String digits' PaddingSide PostPadding ParseNumericPadding NoPadding Bool TrueInt 12)ReadP String -> ReadP String -> ReadP String forall a. ReadP a -> ReadP a -> ReadP a <++String -> ReadP String forall (m :: * -> *) a. Monad m => a -> m a returnString ""-- time zoneChar 'z'->ReadP String numericTZ Char 'Z'->(Char -> Bool) -> ReadP String munch1Char -> Bool isAlphaReadP String -> ReadP String -> ReadP String forall a. ReadP a -> ReadP a -> ReadP a <++ReadP String numericTZ -- seconds since epochChar 's'->(Char -> ReadP Char charChar '-'ReadP Char -> ReadP String -> ReadP String forall (m :: * -> *) a b. Monad m => m a -> m b -> m b >>(String -> String) -> ReadP String -> ReadP String forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap(Char '-'Char -> String -> String forall a. a -> [a] -> [a] :)((Char -> Bool) -> ReadP String munch1Char -> Bool isDigit))ReadP String -> ReadP String -> ReadP String forall a. ReadP a -> ReadP a -> ReadP a <++(Char -> Bool) -> ReadP String munch1Char -> Bool isDigitChar _->String -> ReadP String forall (m :: * -> *) a. MonadFail m => String -> m a fail(String -> ReadP String) -> String -> ReadP String forall a b. (a -> b) -> a -> b $String "Unknown format character: "String -> String -> String forall a. [a] -> [a] -> [a] ++Char -> String forall a. Show a => a -> String showChar c timeSubstituteTimeSpecifier ::TimeLocale ->Char->MaybeStringtimeSubstituteTimeSpecifier :: TimeLocale -> Char -> Maybe String timeSubstituteTimeSpecifier TimeLocale l Char 'c'=String -> Maybe String forall a. a -> Maybe a Just(String -> Maybe String) -> String -> Maybe String forall a b. (a -> b) -> a -> b $TimeLocale -> String dateTimeFmt TimeLocale l timeSubstituteTimeSpecifier TimeLocale _Char 'R'=String -> Maybe String forall a. a -> Maybe a JustString "%H:%M"timeSubstituteTimeSpecifier TimeLocale _Char 'T'=String -> Maybe String forall a. a -> Maybe a JustString "%H:%M:%S"timeSubstituteTimeSpecifier TimeLocale l Char 'X'=String -> Maybe String forall a. a -> Maybe a Just(String -> Maybe String) -> String -> Maybe String forall a b. (a -> b) -> a -> b $TimeLocale -> String timeFmt TimeLocale l timeSubstituteTimeSpecifier TimeLocale l Char 'r'=String -> Maybe String forall a. a -> Maybe a Just(String -> Maybe String) -> String -> Maybe String forall a b. (a -> b) -> a -> b $TimeLocale -> String time12Fmt TimeLocale l timeSubstituteTimeSpecifier TimeLocale _Char 'D'=String -> Maybe String forall a. a -> Maybe a JustString "%m/%d/%y"timeSubstituteTimeSpecifier TimeLocale _Char 'F'=String -> Maybe String forall a. a -> Maybe a JustString "%Y-%m-%d"timeSubstituteTimeSpecifier TimeLocale l Char 'x'=String -> Maybe String forall a. a -> Maybe a Just(String -> Maybe String) -> String -> Maybe String forall a b. (a -> b) -> a -> b $TimeLocale -> String dateFmt TimeLocale l timeSubstituteTimeSpecifier TimeLocale _Char 'h'=String -> Maybe String forall a. a -> Maybe a JustString "%b"timeSubstituteTimeSpecifier TimeLocale _Char _=Maybe String forall a. Maybe a NothingdurationParseTimeSpecifier ::TimeLocale ->MaybeParseNumericPadding ->Char->ReadPStringdurationParseTimeSpecifier :: TimeLocale -> Maybe ParseNumericPadding -> Char -> ReadP String durationParseTimeSpecifier TimeLocale _Maybe ParseNumericPadding mpad Char c =letpadopt :: Int -> ReadP String padopt =ParseNumericPadding -> Int -> ReadP String parsePaddedSignedDigits (ParseNumericPadding -> Int -> ReadP String) -> ParseNumericPadding -> Int -> ReadP String forall a b. (a -> b) -> a -> b $ParseNumericPadding -> Maybe ParseNumericPadding -> ParseNumericPadding forall a. a -> Maybe a -> a fromMaybeParseNumericPadding NoPadding Maybe ParseNumericPadding mpad incaseChar c ofChar 'y'->Int -> ReadP String padopt Int 1Char 'b'->Int -> ReadP String padopt Int 1Char 'B'->Int -> ReadP String padopt Int 2Char 'w'->Int -> ReadP String padopt Int 1Char 'd'->Int -> ReadP String padopt Int 1Char 'D'->Int -> ReadP String padopt Int 1Char 'h'->Int -> ReadP String padopt Int 1Char 'H'->Int -> ReadP String padopt Int 2Char 'm'->Int -> ReadP String padopt Int 1Char 'M'->Int -> ReadP String padopt Int 2Char 's'->ReadP String parseSignedDecimal Char 'S'->ReadP String parseSignedDecimal Char _->String -> ReadP String forall (m :: * -> *) a. MonadFail m => String -> m a fail(String -> ReadP String) -> String -> ReadP String forall a b. (a -> b) -> a -> b $String "Unknown format character: "String -> String -> String forall a. [a] -> [a] -> [a] ++Char -> String forall a. Show a => a -> String showChar c