{-# LANGUAGE Safe #-} {-# LANGUAGE TypeOperators #-} {-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-} module Text.Printf( printf, hPrintf, PrintfArg(..), FieldFormatter, FieldFormat(..), FormatAdjustment(..), FormatSign(..), vFmt, ModifierParser, FormatParse(..), formatString, formatChar, formatInt, formatInteger, formatRealFloat, errorBadFormat, errorShortFormat, errorMissingArgument, errorBadArgument, perror, PrintfType, HPrintfType, IsChar(..) ) where import Prelude import Data.Char import GHC.Internal.Int import GHC.Internal.Data.List (stripPrefix) import GHC.Internal.Word import GHC.Internal.Numeric import GHC.Internal.Numeric.Natural import GHC.Internal.System.IO printf :: (PrintfType r) => String -> r printf :: forall r. PrintfType r => String -> r printf String fmts = String -> [UPrintf] -> r forall t. PrintfType t => String -> [UPrintf] -> t spr String fmts [] hPrintf :: (HPrintfType r) => Handle -> String -> r hPrintf :: forall r. HPrintfType r => Handle -> String -> r hPrintf Handle hdl String fmts = Handle -> String -> [UPrintf] -> r forall t. HPrintfType t => Handle -> String -> [UPrintf] -> t hspr Handle hdl String fmts [] class PrintfType t where spr :: String -> [UPrintf] -> t class HPrintfType t where hspr :: Handle -> String -> [UPrintf] -> t instance (IsChar c) => PrintfType [c] where spr :: String -> [UPrintf] -> [c] spr String fmts [UPrintf] args = (Char -> c) -> String -> [c] forall a b. (a -> b) -> [a] -> [b] map Char -> c forall c. IsChar c => Char -> c fromChar (String -> [UPrintf] -> String uprintf String fmts ([UPrintf] -> [UPrintf] forall a. [a] -> [a] reverse [UPrintf] args)) instance (a ~ ()) => PrintfType (IO a) where spr :: String -> [UPrintf] -> IO a spr String fmts [UPrintf] args = String -> IO () putStr (String -> IO ()) -> String -> IO () forall a b. (a -> b) -> a -> b $ (Char -> Char) -> String -> String forall a b. (a -> b) -> [a] -> [b] map Char -> Char forall c. IsChar c => Char -> c fromChar (String -> String) -> String -> String forall a b. (a -> b) -> a -> b $ String -> [UPrintf] -> String uprintf String fmts ([UPrintf] -> String) -> [UPrintf] -> String forall a b. (a -> b) -> a -> b $ [UPrintf] -> [UPrintf] forall a. [a] -> [a] reverse [UPrintf] args instance (a ~ ()) => HPrintfType (IO a) where hspr :: Handle -> String -> [UPrintf] -> IO a hspr Handle hdl String fmts [UPrintf] args = Handle -> String -> IO () hPutStr Handle hdl (String -> [UPrintf] -> String uprintf String fmts ([UPrintf] -> [UPrintf] forall a. [a] -> [a] reverse [UPrintf] args)) instance (PrintfArg a, PrintfType r) => PrintfType (a -> r) where spr :: String -> [UPrintf] -> a -> r spr String fmts [UPrintf] args = \ a a -> String -> [UPrintf] -> r forall t. PrintfType t => String -> [UPrintf] -> t spr String fmts ((a -> ModifierParser forall a. PrintfArg a => a -> ModifierParser parseFormat a a, a -> FieldFormatter forall a. PrintfArg a => a -> FieldFormatter formatArg a a) UPrintf -> [UPrintf] -> [UPrintf] forall a. a -> [a] -> [a] : [UPrintf] args) instance (PrintfArg a, HPrintfType r) => HPrintfType (a -> r) where hspr :: Handle -> String -> [UPrintf] -> a -> r hspr Handle hdl String fmts [UPrintf] args = \ a a -> Handle -> String -> [UPrintf] -> r forall t. HPrintfType t => Handle -> String -> [UPrintf] -> t hspr Handle hdl String fmts ((a -> ModifierParser forall a. PrintfArg a => a -> ModifierParser parseFormat a a, a -> FieldFormatter forall a. PrintfArg a => a -> FieldFormatter formatArg a a) UPrintf -> [UPrintf] -> [UPrintf] forall a. a -> [a] -> [a] : [UPrintf] args) class PrintfArg a where formatArg :: a -> FieldFormatter parseFormat :: a -> ModifierParser parseFormat a _ (Char c : String cs) = String -> Char -> ModifierParser FormatParse String "" Char c String cs parseFormat a _ String "" = FormatParse forall a. a errorShortFormat instance PrintfArg Char where formatArg :: Char -> FieldFormatter formatArg = Char -> FieldFormatter formatChar parseFormat :: Char -> ModifierParser parseFormat Char _ String cf = Int -> ModifierParser forall a. a -> ModifierParser parseIntFormat (Int forall a. HasCallStack => a undefined :: Int) String cf instance (IsChar c) => PrintfArg [c] where formatArg :: [c] -> FieldFormatter formatArg = [c] -> FieldFormatter forall c. IsChar c => [c] -> FieldFormatter formatString instance PrintfArg Int where formatArg :: Int -> FieldFormatter formatArg = Int -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Int -> ModifierParser parseFormat = Int -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Int8 where formatArg :: Int8 -> FieldFormatter formatArg = Int8 -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Int8 -> ModifierParser parseFormat = Int8 -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Int16 where formatArg :: Int16 -> FieldFormatter formatArg = Int16 -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Int16 -> ModifierParser parseFormat = Int16 -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Int32 where formatArg :: Int32 -> FieldFormatter formatArg = Int32 -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Int32 -> ModifierParser parseFormat = Int32 -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Int64 where formatArg :: Int64 -> FieldFormatter formatArg = Int64 -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Int64 -> ModifierParser parseFormat = Int64 -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Word where formatArg :: Word -> FieldFormatter formatArg = Word -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Word -> ModifierParser parseFormat = Word -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Word8 where formatArg :: Word8 -> FieldFormatter formatArg = Word8 -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Word8 -> ModifierParser parseFormat = Word8 -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Word16 where formatArg :: Word16 -> FieldFormatter formatArg = Word16 -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Word16 -> ModifierParser parseFormat = Word16 -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Word32 where formatArg :: Word32 -> FieldFormatter formatArg = Word32 -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Word32 -> ModifierParser parseFormat = Word32 -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Word64 where formatArg :: Word64 -> FieldFormatter formatArg = Word64 -> FieldFormatter forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt parseFormat :: Word64 -> ModifierParser parseFormat = Word64 -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Integer where formatArg :: Integer -> FieldFormatter formatArg = Integer -> FieldFormatter formatInteger parseFormat :: Integer -> ModifierParser parseFormat = Integer -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Natural where formatArg :: Natural -> FieldFormatter formatArg = Integer -> FieldFormatter formatInteger (Integer -> FieldFormatter) -> (Natural -> Integer) -> Natural -> FieldFormatter forall b c a. (b -> c) -> (a -> b) -> a -> c . Natural -> Integer forall a. Integral a => a -> Integer toInteger parseFormat :: Natural -> ModifierParser parseFormat = Natural -> ModifierParser forall a. a -> ModifierParser parseIntFormat instance PrintfArg Float where formatArg :: Float -> FieldFormatter formatArg = Float -> FieldFormatter forall a. RealFloat a => a -> FieldFormatter formatRealFloat instance PrintfArg Double where formatArg :: Double -> FieldFormatter formatArg = Double -> FieldFormatter forall a. RealFloat a => a -> FieldFormatter formatRealFloat class IsChar c where toChar :: c -> Char fromChar :: Char -> c instance IsChar Char where toChar :: Char -> Char toChar Char c = Char c fromChar :: Char -> Char fromChar Char c = Char c data FormatAdjustment = LeftAdjust | ZeroPad data FormatSign = SignPlus | SignSpace data FieldFormat = FieldFormat { FieldFormat -> Maybe Int fmtWidth :: Maybe Int, FieldFormat -> Maybe Int fmtPrecision :: Maybe Int, FieldFormat -> Maybe FormatAdjustment fmtAdjust :: Maybe FormatAdjustment, FieldFormat -> Maybe FormatSign fmtSign :: Maybe FormatSign, FieldFormat -> Bool fmtAlternate :: Bool, FieldFormat -> String fmtModifiers :: String, FieldFormat -> Char fmtChar :: Char } data FormatParse = FormatParse { FormatParse -> String fpModifiers :: String, FormatParse -> Char fpChar :: Char, FormatParse -> String fpRest :: String } intModifierMap :: [(String, Integer)] intModifierMap :: [(String, Integer)] intModifierMap = [ (String "hh", Int8 -> Integer forall a. Integral a => a -> Integer toInteger (Int8 forall a. Bounded a => a minBound :: Int8)), (String "h", Int16 -> Integer forall a. Integral a => a -> Integer toInteger (Int16 forall a. Bounded a => a minBound :: Int16)), (String "l", Int32 -> Integer forall a. Integral a => a -> Integer toInteger (Int32 forall a. Bounded a => a minBound :: Int32)), (String "ll", Int64 -> Integer forall a. Integral a => a -> Integer toInteger (Int64 forall a. Bounded a => a minBound :: Int64)), (String "L", Int64 -> Integer forall a. Integral a => a -> Integer toInteger (Int64 forall a. Bounded a => a minBound :: Int64)) ] parseIntFormat :: a -> String -> FormatParse parseIntFormat :: forall a. a -> ModifierParser parseIntFormat a _ String s = case ((String, Integer) -> Maybe FormatParse -> Maybe FormatParse) -> Maybe FormatParse -> [(String, Integer)] -> Maybe FormatParse forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr (String, Integer) -> Maybe FormatParse -> Maybe FormatParse forall {b}. (String, b) -> Maybe FormatParse -> Maybe FormatParse matchPrefix Maybe FormatParse forall a. Maybe a Nothing [(String, Integer)] intModifierMap of Just FormatParse m -> FormatParse m Maybe FormatParse Nothing -> case String s of Char c : String cs -> String -> Char -> ModifierParser FormatParse String "" Char c String cs String "" -> FormatParse forall a. a errorShortFormat where matchPrefix :: (String, b) -> Maybe FormatParse -> Maybe FormatParse matchPrefix (String p, b _) m :: Maybe FormatParse m@(Just (FormatParse String p0 Char _ String _)) | String -> Int forall a. [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length String p0 Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >= String -> Int forall a. [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length String p = Maybe FormatParse m | Bool otherwise = case String -> Maybe FormatParse getFormat String p of Maybe FormatParse Nothing -> Maybe FormatParse m Just FormatParse fp -> FormatParse -> Maybe FormatParse forall a. a -> Maybe a Just FormatParse fp matchPrefix (String p, b _) Maybe FormatParse Nothing = String -> Maybe FormatParse getFormat String p getFormat :: String -> Maybe FormatParse getFormat String p = String -> String -> Maybe String forall a. Eq a => [a] -> [a] -> Maybe [a] stripPrefix String p String s Maybe String -> (String -> Maybe FormatParse) -> Maybe FormatParse forall a b. Maybe a -> (a -> Maybe b) -> Maybe b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= String -> Maybe FormatParse fp where fp :: String -> Maybe FormatParse fp (Char c : String cs) = FormatParse -> Maybe FormatParse forall a. a -> Maybe a Just (FormatParse -> Maybe FormatParse) -> FormatParse -> Maybe FormatParse forall a b. (a -> b) -> a -> b $ String -> Char -> ModifierParser FormatParse String p Char c String cs fp String "" = Maybe FormatParse forall a. a errorShortFormat type FieldFormatter = FieldFormat -> ShowS type ModifierParser = String -> FormatParse vFmt :: Char -> FieldFormat -> FieldFormat vFmt :: Char -> FieldFormat -> FieldFormat vFmt Char c ufmt :: FieldFormat ufmt@(FieldFormat {fmtChar :: FieldFormat -> Char fmtChar = Char 'v'}) = FieldFormat ufmt {fmtChar = c} vFmt Char _ FieldFormat ufmt = FieldFormat ufmt formatChar :: Char -> FieldFormatter formatChar :: Char -> FieldFormatter formatChar Char x FieldFormat ufmt = Maybe Integer -> Integer -> FieldFormatter formatIntegral (Integer -> Maybe Integer forall a. a -> Maybe a Just Integer 0) (Int -> Integer forall a. Integral a => a -> Integer toInteger (Int -> Integer) -> Int -> Integer forall a b. (a -> b) -> a -> b $ Char -> Int ord Char x) FieldFormatter -> FieldFormatter forall a b. (a -> b) -> a -> b $ Char -> FieldFormat -> FieldFormat vFmt Char 'c' FieldFormat ufmt formatString :: IsChar a => [a] -> FieldFormatter formatString :: forall c. IsChar c => [c] -> FieldFormatter formatString [a] x FieldFormat ufmt = case FieldFormat -> Char fmtChar (FieldFormat -> Char) -> FieldFormat -> Char forall a b. (a -> b) -> a -> b $ Char -> FieldFormat -> FieldFormat vFmt Char 's' FieldFormat ufmt of Char 's' -> (Char -> Char) -> String -> String forall a b. (a -> b) -> [a] -> [b] map Char -> Char forall c. IsChar c => c -> Char toChar (String -> String) -> (String -> String) -> String -> String forall b c a. (b -> c) -> (a -> b) -> a -> c . (FieldFormat -> (String, String) -> String adjust FieldFormat ufmt (String "", String ts) String -> String -> String forall a. [a] -> [a] -> [a] ++) where ts :: String ts = (a -> Char) -> [a] -> String forall a b. (a -> b) -> [a] -> [b] map a -> Char forall c. IsChar c => c -> Char toChar ([a] -> String) -> [a] -> String forall a b. (a -> b) -> a -> b $ Maybe Int -> [a] trunc (Maybe Int -> [a]) -> Maybe Int -> [a] forall a b. (a -> b) -> a -> b $ FieldFormat -> Maybe Int fmtPrecision FieldFormat ufmt where trunc :: Maybe Int -> [a] trunc Maybe Int Nothing = [a] x trunc (Just Int n) = Int -> [a] -> [a] forall a. Int -> [a] -> [a] take Int n [a] x Char c -> Char -> String -> String forall a. Char -> a errorBadFormat Char c fixupMods :: FieldFormat -> Maybe Integer -> Maybe Integer fixupMods :: FieldFormat -> Maybe Integer -> Maybe Integer fixupMods FieldFormat ufmt Maybe Integer m = let mods :: String mods = FieldFormat -> String fmtModifiers FieldFormat ufmt in case String mods of String "" -> Maybe Integer m String _ -> case String -> [(String, Integer)] -> Maybe Integer forall a b. Eq a => a -> [(a, b)] -> Maybe b lookup String mods [(String, Integer)] intModifierMap of Just Integer m0 -> Integer -> Maybe Integer forall a. a -> Maybe a Just Integer m0 Maybe Integer Nothing -> String -> Maybe Integer forall a. String -> a perror String "unknown format modifier" formatInt :: (Integral a, Bounded a) => a -> FieldFormatter formatInt :: forall a. (Integral a, Bounded a) => a -> FieldFormatter formatInt a x FieldFormat ufmt = let lb :: Integer lb = a -> Integer forall a. Integral a => a -> Integer toInteger (a -> Integer) -> a -> Integer forall a b. (a -> b) -> a -> b $ a forall a. Bounded a => a minBound a -> a -> a forall a. a -> a -> a `asTypeOf` a x m :: Maybe Integer m = FieldFormat -> Maybe Integer -> Maybe Integer fixupMods FieldFormat ufmt (Integer -> Maybe Integer forall a. a -> Maybe a Just Integer lb) ufmt' :: FieldFormat ufmt' = case Integer lb of Integer 0 -> Char -> FieldFormat -> FieldFormat vFmt Char 'u' FieldFormat ufmt Integer _ -> FieldFormat ufmt in Maybe Integer -> Integer -> FieldFormatter formatIntegral Maybe Integer m (a -> Integer forall a. Integral a => a -> Integer toInteger a x) FieldFormat ufmt' formatInteger :: Integer -> FieldFormatter formatInteger :: Integer -> FieldFormatter formatInteger Integer x FieldFormat ufmt = let m :: Maybe Integer m = FieldFormat -> Maybe Integer -> Maybe Integer fixupMods FieldFormat ufmt Maybe Integer forall a. Maybe a Nothing in Maybe Integer -> Integer -> FieldFormatter formatIntegral Maybe Integer m Integer x FieldFormat ufmt formatIntegral :: Maybe Integer -> Integer -> FieldFormatter formatIntegral :: Maybe Integer -> Integer -> FieldFormatter formatIntegral Maybe Integer m Integer x FieldFormat ufmt0 = let prec :: Maybe Int prec = FieldFormat -> Maybe Int fmtPrecision FieldFormat ufmt0 in case FieldFormat -> Char fmtChar FieldFormat ufmt of Char 'd' -> (FieldFormat -> (String, String) -> String adjustSigned FieldFormat ufmt (Maybe Int -> Integer -> (String, String) fmti Maybe Int prec Integer x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'i' -> (FieldFormat -> (String, String) -> String adjustSigned FieldFormat ufmt (Maybe Int -> Integer -> (String, String) fmti Maybe Int prec Integer x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'x' -> (FieldFormat -> (String, String) -> String adjust FieldFormat ufmt (Integer -> Maybe String -> Maybe Int -> Maybe Integer -> Integer -> (String, String) fmtu Integer 16 (String -> Integer -> Maybe String forall {a} {a}. (Eq a, Num a) => a -> a -> Maybe a alt String "0x" Integer x) Maybe Int prec Maybe Integer m Integer x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'X' -> (FieldFormat -> (String, String) -> String adjust FieldFormat ufmt ((String, String) -> (String, String) forall {a}. (a, String) -> (a, String) upcase ((String, String) -> (String, String)) -> (String, String) -> (String, String) forall a b. (a -> b) -> a -> b $ Integer -> Maybe String -> Maybe Int -> Maybe Integer -> Integer -> (String, String) fmtu Integer 16 (String -> Integer -> Maybe String forall {a} {a}. (Eq a, Num a) => a -> a -> Maybe a alt String "0X" Integer x) Maybe Int prec Maybe Integer m Integer x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'b' -> (FieldFormat -> (String, String) -> String adjust FieldFormat ufmt (Integer -> Maybe String -> Maybe Int -> Maybe Integer -> Integer -> (String, String) fmtu Integer 2 (String -> Integer -> Maybe String forall {a} {a}. (Eq a, Num a) => a -> a -> Maybe a alt String "0b" Integer x) Maybe Int prec Maybe Integer m Integer x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'o' -> (FieldFormat -> (String, String) -> String adjust FieldFormat ufmt (Integer -> Maybe String -> Maybe Int -> Maybe Integer -> Integer -> (String, String) fmtu Integer 8 (String -> Integer -> Maybe String forall {a} {a}. (Eq a, Num a) => a -> a -> Maybe a alt String "0" Integer x) Maybe Int prec Maybe Integer m Integer x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'u' -> (FieldFormat -> (String, String) -> String adjust FieldFormat ufmt (Integer -> Maybe String -> Maybe Int -> Maybe Integer -> Integer -> (String, String) fmtu Integer 10 Maybe String forall a. Maybe a Nothing Maybe Int prec Maybe Integer m Integer x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'c' | Integer x Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool >= Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral (Char -> Int ord (Char forall a. Bounded a => a minBound :: Char)) Bool -> Bool -> Bool && Integer x Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool <= Int -> Integer forall a b. (Integral a, Num b) => a -> b fromIntegral (Char -> Int ord (Char forall a. Bounded a => a maxBound :: Char)) Bool -> Bool -> Bool && FieldFormat -> Maybe Int fmtPrecision FieldFormat ufmt Maybe Int -> Maybe Int -> Bool forall a. Eq a => a -> a -> Bool == Maybe Int forall a. Maybe a Nothing Bool -> Bool -> Bool && FieldFormat -> String fmtModifiers FieldFormat ufmt String -> String -> Bool forall a. Eq a => a -> a -> Bool == String "" -> String -> FieldFormatter forall c. IsChar c => [c] -> FieldFormatter formatString [Int -> Char chr (Int -> Char) -> Int -> Char forall a b. (a -> b) -> a -> b $ Integer -> Int forall a b. (Integral a, Num b) => a -> b fromIntegral Integer x] (FieldFormat ufmt { fmtChar = 's' }) Char 'c' -> String -> String -> String forall a. String -> a perror String "illegal char conversion" Char c -> Char -> String -> String forall a. Char -> a errorBadFormat Char c where ufmt :: FieldFormat ufmt = Char -> FieldFormat -> FieldFormat vFmt Char 'd' (FieldFormat -> FieldFormat) -> FieldFormat -> FieldFormat forall a b. (a -> b) -> a -> b $ case FieldFormat ufmt0 of FieldFormat { fmtPrecision :: FieldFormat -> Maybe Int fmtPrecision = Just Int _, fmtAdjust :: FieldFormat -> Maybe FormatAdjustment fmtAdjust = Just FormatAdjustment ZeroPad } -> FieldFormat ufmt0 { fmtAdjust = Nothing } FieldFormat _ -> FieldFormat ufmt0 alt :: a -> a -> Maybe a alt a _ a 0 = Maybe a forall a. Maybe a Nothing alt a p a _ = case FieldFormat -> Bool fmtAlternate FieldFormat ufmt of Bool True -> a -> Maybe a forall a. a -> Maybe a Just a p Bool False -> Maybe a forall a. Maybe a Nothing upcase :: (a, String) -> (a, String) upcase (a s1, String s2) = (a s1, (Char -> Char) -> String -> String forall a b. (a -> b) -> [a] -> [b] map Char -> Char toUpper String s2) formatRealFloat :: RealFloat a => a -> FieldFormatter formatRealFloat :: forall a. RealFloat a => a -> FieldFormatter formatRealFloat a x FieldFormat ufmt = let c :: Char c = FieldFormat -> Char fmtChar (FieldFormat -> Char) -> FieldFormat -> Char forall a b. (a -> b) -> a -> b $ Char -> FieldFormat -> FieldFormat vFmt Char 'g' FieldFormat ufmt prec :: Maybe Int prec = FieldFormat -> Maybe Int fmtPrecision FieldFormat ufmt alt :: Bool alt = FieldFormat -> Bool fmtAlternate FieldFormat ufmt in case Char c of Char 'e' -> (FieldFormat -> (String, String) -> String adjustSigned FieldFormat ufmt (Char -> Maybe Int -> Bool -> a -> (String, String) forall a. RealFloat a => Char -> Maybe Int -> Bool -> a -> (String, String) dfmt Char c Maybe Int prec Bool alt a x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'E' -> (FieldFormat -> (String, String) -> String adjustSigned FieldFormat ufmt (Char -> Maybe Int -> Bool -> a -> (String, String) forall a. RealFloat a => Char -> Maybe Int -> Bool -> a -> (String, String) dfmt Char c Maybe Int prec Bool alt a x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'f' -> (FieldFormat -> (String, String) -> String adjustSigned FieldFormat ufmt (Char -> Maybe Int -> Bool -> a -> (String, String) forall a. RealFloat a => Char -> Maybe Int -> Bool -> a -> (String, String) dfmt Char c Maybe Int prec Bool alt a x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'F' -> (FieldFormat -> (String, String) -> String adjustSigned FieldFormat ufmt (Char -> Maybe Int -> Bool -> a -> (String, String) forall a. RealFloat a => Char -> Maybe Int -> Bool -> a -> (String, String) dfmt Char c Maybe Int prec Bool alt a x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'g' -> (FieldFormat -> (String, String) -> String adjustSigned FieldFormat ufmt (Char -> Maybe Int -> Bool -> a -> (String, String) forall a. RealFloat a => Char -> Maybe Int -> Bool -> a -> (String, String) dfmt Char c Maybe Int prec Bool alt a x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char 'G' -> (FieldFormat -> (String, String) -> String adjustSigned FieldFormat ufmt (Char -> Maybe Int -> Bool -> a -> (String, String) forall a. RealFloat a => Char -> Maybe Int -> Bool -> a -> (String, String) dfmt Char c Maybe Int prec Bool alt a x) String -> String -> String forall a. [a] -> [a] -> [a] ++) Char _ -> Char -> String -> String forall a. Char -> a errorBadFormat Char c type UPrintf = (ModifierParser, FieldFormatter) uprintf :: String -> [UPrintf] -> String uprintf :: String -> [UPrintf] -> String uprintf String s [UPrintf] us = String -> [UPrintf] -> String -> String uprintfs String s [UPrintf] us String "" uprintfs :: String -> [UPrintf] -> ShowS uprintfs :: String -> [UPrintf] -> String -> String uprintfs String "" [] = String -> String forall a. a -> a id uprintfs String "" (UPrintf _:[UPrintf] _) = String -> String forall a. a errorShortFormat uprintfs (Char '%':Char '%':String cs) [UPrintf] us = (Char '%' Char -> String -> String forall a. a -> [a] -> [a] :) (String -> String) -> (String -> String) -> String -> String forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> [UPrintf] -> String -> String uprintfs String cs [UPrintf] us uprintfs (Char '%':String _) [] = String -> String forall a. a errorMissingArgument uprintfs (Char '%':String cs) us :: [UPrintf] us@(UPrintf _:[UPrintf] _) = String -> [UPrintf] -> String -> String fmt String cs [UPrintf] us uprintfs (Char c:String cs) [UPrintf] us = (Char c Char -> String -> String forall a. a -> [a] -> [a] :) (String -> String) -> (String -> String) -> String -> String forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> [UPrintf] -> String -> String uprintfs String cs [UPrintf] us fmt :: String -> [UPrintf] -> ShowS fmt :: String -> [UPrintf] -> String -> String fmt String cs0 [UPrintf] us0 = case Bool -> Bool -> Maybe FormatSign -> Bool -> String -> [UPrintf] -> (FieldFormat, String, [UPrintf]) getSpecs Bool False Bool False Maybe FormatSign forall a. Maybe a Nothing Bool False String cs0 [UPrintf] us0 of (FieldFormat _, String _, []) -> String -> String forall a. a errorMissingArgument (FieldFormat ufmt, String cs, (ModifierParser _, FieldFormatter u) : [UPrintf] us) -> FieldFormatter u FieldFormat ufmt (String -> String) -> (String -> String) -> String -> String forall b c a. (b -> c) -> (a -> b) -> a -> c . String -> [UPrintf] -> String -> String uprintfs String cs [UPrintf] us adjust :: FieldFormat -> (String, String) -> String adjust :: FieldFormat -> (String, String) -> String adjust FieldFormat ufmt (String pre, String str) = let naturalWidth :: Int naturalWidth = String -> Int forall a. [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length String pre Int -> Int -> Int forall a. Num a => a -> a -> a + String -> Int forall a. [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length String str zero :: Bool zero = case FieldFormat -> Maybe FormatAdjustment fmtAdjust FieldFormat ufmt of Just FormatAdjustment ZeroPad -> Bool True Maybe FormatAdjustment _ -> Bool False left :: Bool left = case FieldFormat -> Maybe FormatAdjustment fmtAdjust FieldFormat ufmt of Just FormatAdjustment LeftAdjust -> Bool True Maybe FormatAdjustment _ -> Bool False fill :: String fill = case FieldFormat -> Maybe Int fmtWidth FieldFormat ufmt of Just Int width | Int naturalWidth Int -> Int -> Bool forall a. Ord a => a -> a -> Bool < Int width -> let fillchar :: Char fillchar = if Bool zero then Char '0' else Char ' ' in Int -> Char -> String forall a. Int -> a -> [a] replicate (Int width Int -> Int -> Int forall a. Num a => a -> a -> a - Int naturalWidth) Char fillchar Maybe Int _ -> String "" in if Bool left then String pre String -> String -> String forall a. [a] -> [a] -> [a] ++ String str String -> String -> String forall a. [a] -> [a] -> [a] ++ String fill else if Bool zero then String pre String -> String -> String forall a. [a] -> [a] -> [a] ++ String fill String -> String -> String forall a. [a] -> [a] -> [a] ++ String str else String fill String -> String -> String forall a. [a] -> [a] -> [a] ++ String pre String -> String -> String forall a. [a] -> [a] -> [a] ++ String str adjustSigned :: FieldFormat -> (String, String) -> String adjustSigned :: FieldFormat -> (String, String) -> String adjustSigned ufmt :: FieldFormat ufmt@(FieldFormat {fmtSign :: FieldFormat -> Maybe FormatSign fmtSign = Just FormatSign SignPlus}) (String "", String str) = FieldFormat -> (String, String) -> String adjust FieldFormat ufmt (String "+", String str) adjustSigned ufmt :: FieldFormat ufmt@(FieldFormat {fmtSign :: FieldFormat -> Maybe FormatSign fmtSign = Just FormatSign SignSpace}) (String "", String str) = FieldFormat -> (String, String) -> String adjust FieldFormat ufmt (String " ", String str) adjustSigned FieldFormat ufmt (String, String) ps = FieldFormat -> (String, String) -> String adjust FieldFormat ufmt (String, String) ps fmti :: Maybe Int -> Integer -> (String, String) fmti :: Maybe Int -> Integer -> (String, String) fmti Maybe Int prec Integer i | Integer i Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool < Integer 0 = (String "-", Maybe Int -> String -> String integral_prec Maybe Int prec (Integer -> String forall a. Show a => a -> String show (-Integer i))) | Bool otherwise = (String "", Maybe Int -> String -> String integral_prec Maybe Int prec (Integer -> String forall a. Show a => a -> String show Integer i)) fmtu :: Integer -> Maybe String -> Maybe Int -> Maybe Integer -> Integer -> (String, String) fmtu :: Integer -> Maybe String -> Maybe Int -> Maybe Integer -> Integer -> (String, String) fmtu Integer b (Just String pre) Maybe Int prec Maybe Integer m Integer i = let (String "", String s) = Integer -> Maybe String -> Maybe Int -> Maybe Integer -> Integer -> (String, String) fmtu Integer b Maybe String forall a. Maybe a Nothing Maybe Int prec Maybe Integer m Integer i in case String pre of String "0" -> case String s of Char '0' : String _ -> (String "", String s) String _ -> (String pre, String s) String _ -> (String pre, String s) fmtu Integer b Maybe String Nothing Maybe Int prec0 Maybe Integer m0 Integer i0 = case Maybe Int -> Maybe Integer -> Integer -> Maybe String fmtu' Maybe Int prec0 Maybe Integer m0 Integer i0 of Just String s -> (String "", String s) Maybe String Nothing -> (String, String) forall a. a errorBadArgument where fmtu' :: Maybe Int -> Maybe Integer -> Integer -> Maybe String fmtu' :: Maybe Int -> Maybe Integer -> Integer -> Maybe String fmtu' Maybe Int prec (Just Integer m) Integer i | Integer i Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool < Integer 0 = Maybe Int -> Maybe Integer -> Integer -> Maybe String fmtu' Maybe Int prec Maybe Integer forall a. Maybe a Nothing (-Integer 2 Integer -> Integer -> Integer forall a. Num a => a -> a -> a * Integer m Integer -> Integer -> Integer forall a. Num a => a -> a -> a + Integer i) fmtu' (Just Int prec) Maybe Integer _ Integer i | Integer i Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool >= Integer 0 = (String -> String) -> Maybe String -> Maybe String forall a b. (a -> b) -> Maybe a -> Maybe b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (Maybe Int -> String -> String integral_prec (Int -> Maybe Int forall a. a -> Maybe a Just Int prec)) (Maybe String -> Maybe String) -> Maybe String -> Maybe String forall a b. (a -> b) -> a -> b $ Maybe Int -> Maybe Integer -> Integer -> Maybe String fmtu' Maybe Int forall a. Maybe a Nothing Maybe Integer forall a. Maybe a Nothing Integer i fmtu' Maybe Int Nothing Maybe Integer _ Integer i | Integer i Integer -> Integer -> Bool forall a. Ord a => a -> a -> Bool >= Integer 0 = String -> Maybe String forall a. a -> Maybe a Just (String -> Maybe String) -> String -> Maybe String forall a b. (a -> b) -> a -> b $ Integer -> (Int -> Char) -> Integer -> String -> String forall a. Integral a => a -> (Int -> Char) -> a -> String -> String showIntAtBase Integer b Int -> Char intToDigit Integer i String "" fmtu' Maybe Int _ Maybe Integer _ Integer _ = Maybe String forall a. Maybe a Nothing integral_prec :: Maybe Int -> String -> String integral_prec :: Maybe Int -> String -> String integral_prec Maybe Int Nothing String integral = String integral integral_prec (Just Int 0) String "0" = String "" integral_prec (Just Int prec) String integral = Int -> Char -> String forall a. Int -> a -> [a] replicate (Int prec Int -> Int -> Int forall a. Num a => a -> a -> a - String -> Int forall a. [a] -> Int forall (t :: * -> *) a. Foldable t => t a -> Int length String integral) Char '0' String -> String -> String forall a. [a] -> [a] -> [a] ++ String integral stoi :: String -> (Int, String) stoi :: String -> (Int, String) stoi String cs = let (String as, String cs') = (Char -> Bool) -> String -> (String, String) forall a. (a -> Bool) -> [a] -> ([a], [a]) span Char -> Bool isDigit String cs in case String as of String "" -> (Int 0, String cs') String _ -> (String -> Int forall a. Read a => String -> a read String as, String cs') adjustment :: Maybe Int -> Maybe a -> Bool -> Bool -> Maybe FormatAdjustment adjustment :: forall a. Maybe Int -> Maybe a -> Bool -> Bool -> Maybe FormatAdjustment adjustment Maybe Int w Maybe a p Bool l Bool z = case Maybe Int w of Just Int n | Int n Int -> Int -> Bool forall a. Ord a => a -> a -> Bool < Int 0 -> Maybe a -> Bool -> Bool -> Maybe FormatAdjustment forall {p}. p -> Bool -> Bool -> Maybe FormatAdjustment adjl Maybe a p Bool True Bool z Maybe Int _ -> Maybe a -> Bool -> Bool -> Maybe FormatAdjustment forall {p}. p -> Bool -> Bool -> Maybe FormatAdjustment adjl Maybe a p Bool l Bool z where adjl :: p -> Bool -> Bool -> Maybe FormatAdjustment adjl p _ Bool True Bool _ = FormatAdjustment -> Maybe FormatAdjustment forall a. a -> Maybe a Just FormatAdjustment LeftAdjust adjl p _ Bool False Bool True = FormatAdjustment -> Maybe FormatAdjustment forall a. a -> Maybe a Just FormatAdjustment ZeroPad adjl p _ Bool _ Bool _ = Maybe FormatAdjustment forall a. Maybe a Nothing getSpecs :: Bool -> Bool -> Maybe FormatSign -> Bool -> String -> [UPrintf] -> (FieldFormat, String, [UPrintf]) getSpecs :: Bool -> Bool -> Maybe FormatSign -> Bool -> String -> [UPrintf] -> (FieldFormat, String, [UPrintf]) getSpecs Bool _ Bool z Maybe FormatSign s Bool a (Char '-' : String cs0) [UPrintf] us = Bool -> Bool -> Maybe FormatSign -> Bool -> String -> [UPrintf] -> (FieldFormat, String, [UPrintf]) getSpecs Bool True Bool z Maybe FormatSign s Bool a String cs0 [UPrintf] us getSpecs Bool l Bool z Maybe FormatSign _ Bool a (Char '+' : String cs0) [UPrintf] us = Bool -> Bool -> Maybe FormatSign -> Bool -> String -> [UPrintf] -> (FieldFormat, String, [UPrintf]) getSpecs Bool l Bool z (FormatSign -> Maybe FormatSign forall a. a -> Maybe a Just FormatSign SignPlus) Bool a String cs0 [UPrintf] us getSpecs Bool l Bool z Maybe FormatSign s Bool a (Char ' ' : String cs0) [UPrintf] us = Bool -> Bool -> Maybe FormatSign -> Bool -> String -> [UPrintf] -> (FieldFormat, String, [UPrintf]) getSpecs Bool l Bool z Maybe FormatSign ss Bool a String cs0 [UPrintf] us where ss :: Maybe FormatSign ss = case Maybe FormatSign s of Just FormatSign SignPlus -> FormatSign -> Maybe FormatSign forall a. a -> Maybe a Just FormatSign SignPlus Maybe FormatSign _ -> FormatSign -> Maybe FormatSign forall a. a -> Maybe a Just FormatSign SignSpace getSpecs Bool l Bool _ Maybe FormatSign s Bool a (Char '0' : String cs0) [UPrintf] us = Bool -> Bool -> Maybe FormatSign -> Bool -> String -> [UPrintf] -> (FieldFormat, String, [UPrintf]) getSpecs Bool l Bool True Maybe FormatSign s Bool a String cs0 [UPrintf] us getSpecs Bool l Bool z Maybe FormatSign s Bool _ (Char '#' : String cs0) [UPrintf] us = Bool -> Bool -> Maybe FormatSign -> Bool -> String -> [UPrintf] -> (FieldFormat, String, [UPrintf]) getSpecs Bool l Bool z Maybe FormatSign s Bool True String cs0 [UPrintf] us getSpecs Bool l Bool z Maybe FormatSign s Bool a (Char '*' : String cs0) [UPrintf] us = let ([UPrintf] us', Int n) = [UPrintf] -> ([UPrintf], Int) getStar [UPrintf] us ((Maybe Int p, String cs''), [UPrintf] us'') = case String cs0 of Char '.':Char '*':String r -> let ([UPrintf] us''', Int p') = [UPrintf] -> ([UPrintf], Int) getStar [UPrintf] us' in ((Int -> Maybe Int forall a. a -> Maybe a Just Int p', String r), [UPrintf] us''') Char '.':String r -> let (Int p', String r') = String -> (Int, String) stoi String r in ((Int -> Maybe Int forall a. a -> Maybe a Just Int p', String r'), [UPrintf] us') String _ -> ((Maybe Int forall a. Maybe a Nothing, String cs0), [UPrintf] us') FormatParse String ms Char c String cs = case [UPrintf] us'' of (ModifierParser ufmt, FieldFormatter _) : [UPrintf] _ -> ModifierParser ufmt String cs'' [] -> FormatParse forall a. a errorMissingArgument in (FieldFormat { fmtWidth :: Maybe Int fmtWidth = Int -> Maybe Int forall a. a -> Maybe a Just (Int -> Int forall a. Num a => a -> a abs Int n), fmtPrecision :: Maybe Int fmtPrecision = Maybe Int p, fmtAdjust :: Maybe FormatAdjustment fmtAdjust = Maybe Int -> Maybe Int -> Bool -> Bool -> Maybe FormatAdjustment forall a. Maybe Int -> Maybe a -> Bool -> Bool -> Maybe FormatAdjustment adjustment (Int -> Maybe Int forall a. a -> Maybe a Just Int n) Maybe Int p Bool l Bool z, fmtSign :: Maybe FormatSign fmtSign = Maybe FormatSign s, fmtAlternate :: Bool fmtAlternate = Bool a, fmtModifiers :: String fmtModifiers = String ms, fmtChar :: Char fmtChar = Char c}, String cs, [UPrintf] us'') getSpecs Bool l Bool z Maybe FormatSign s Bool a (Char '.' : String cs0) [UPrintf] us = let ((Int p, String cs'), [UPrintf] us') = case String cs0 of Char '*':String cs'' -> let ([UPrintf] us'', Int p') = [UPrintf] -> ([UPrintf], Int) getStar [UPrintf] us in ((Int p', String cs''), [UPrintf] us'') String _ -> (String -> (Int, String) stoi String cs0, [UPrintf] us) FormatParse String ms Char c String cs = case [UPrintf] us' of (ModifierParser ufmt, FieldFormatter _) : [UPrintf] _ -> ModifierParser ufmt String cs' [] -> FormatParse forall a. a errorMissingArgument in (FieldFormat { fmtWidth :: Maybe Int fmtWidth = Maybe Int forall a. Maybe a Nothing, fmtPrecision :: Maybe Int fmtPrecision = Int -> Maybe Int forall a. a -> Maybe a Just Int p, fmtAdjust :: Maybe FormatAdjustment fmtAdjust = Maybe Int -> Maybe Int -> Bool -> Bool -> Maybe FormatAdjustment forall a. Maybe Int -> Maybe a -> Bool -> Bool -> Maybe FormatAdjustment adjustment Maybe Int forall a. Maybe a Nothing (Int -> Maybe Int forall a. a -> Maybe a Just Int p) Bool l Bool z, fmtSign :: Maybe FormatSign fmtSign = Maybe FormatSign s, fmtAlternate :: Bool fmtAlternate = Bool a, fmtModifiers :: String fmtModifiers = String ms, fmtChar :: Char fmtChar = Char c}, String cs, [UPrintf] us') getSpecs Bool l Bool z Maybe FormatSign s Bool a cs0 :: String cs0@(Char c0 : String _) [UPrintf] us | Char -> Bool isDigit Char c0 = let (Int n, String cs') = String -> (Int, String) stoi String cs0 ((Maybe Int p, String cs''), [UPrintf] us') = case String cs' of Char '.' : Char '*' : String r -> let ([UPrintf] us'', Int p') = [UPrintf] -> ([UPrintf], Int) getStar [UPrintf] us in ((Int -> Maybe Int forall a. a -> Maybe a Just Int p', String r), [UPrintf] us'') Char '.' : String r -> let (Int p', String r') = String -> (Int, String) stoi String r in ((Int -> Maybe Int forall a. a -> Maybe a Just Int p', String r'), [UPrintf] us) String _ -> ((Maybe Int forall a. Maybe a Nothing, String cs'), [UPrintf] us) FormatParse String ms Char c String cs = case [UPrintf] us' of (ModifierParser ufmt, FieldFormatter _) : [UPrintf] _ -> ModifierParser ufmt String cs'' [] -> FormatParse forall a. a errorMissingArgument in (FieldFormat { fmtWidth :: Maybe Int fmtWidth = Int -> Maybe Int forall a. a -> Maybe a Just (Int -> Int forall a. Num a => a -> a abs Int n), fmtPrecision :: Maybe Int fmtPrecision = Maybe Int p, fmtAdjust :: Maybe FormatAdjustment fmtAdjust = Maybe Int -> Maybe Int -> Bool -> Bool -> Maybe FormatAdjustment forall a. Maybe Int -> Maybe a -> Bool -> Bool -> Maybe FormatAdjustment adjustment (Int -> Maybe Int forall a. a -> Maybe a Just Int n) Maybe Int p Bool l Bool z, fmtSign :: Maybe FormatSign fmtSign = Maybe FormatSign s, fmtAlternate :: Bool fmtAlternate = Bool a, fmtModifiers :: String fmtModifiers = String ms, fmtChar :: Char fmtChar = Char c}, String cs, [UPrintf] us') getSpecs Bool l Bool z Maybe FormatSign s Bool a cs0 :: String cs0@(Char _ : String _) [UPrintf] us = let FormatParse String ms Char c String cs = case [UPrintf] us of (ModifierParser ufmt, FieldFormatter _) : [UPrintf] _ -> ModifierParser ufmt String cs0 [] -> FormatParse forall a. a errorMissingArgument in (FieldFormat { fmtWidth :: Maybe Int fmtWidth = Maybe Int forall a. Maybe a Nothing, fmtPrecision :: Maybe Int fmtPrecision = Maybe Int forall a. Maybe a Nothing, fmtAdjust :: Maybe FormatAdjustment fmtAdjust = Maybe Int -> Maybe (ZonkAny 0) -> Bool -> Bool -> Maybe FormatAdjustment forall a. Maybe Int -> Maybe a -> Bool -> Bool -> Maybe FormatAdjustment adjustment Maybe Int forall a. Maybe a Nothing Maybe (ZonkAny 0) forall a. Maybe a Nothing Bool l Bool z, fmtSign :: Maybe FormatSign fmtSign = Maybe FormatSign s, fmtAlternate :: Bool fmtAlternate = Bool a, fmtModifiers :: String fmtModifiers = String ms, fmtChar :: Char fmtChar = Char c}, String cs, [UPrintf] us) getSpecs Bool _ Bool _ Maybe FormatSign _ Bool _ String "" [UPrintf] _ = (FieldFormat, String, [UPrintf]) forall a. a errorShortFormat getStar :: [UPrintf] -> ([UPrintf], Int) getStar :: [UPrintf] -> ([UPrintf], Int) getStar [UPrintf] us = let ufmt :: FieldFormat ufmt = FieldFormat { fmtWidth :: Maybe Int fmtWidth = Maybe Int forall a. Maybe a Nothing, fmtPrecision :: Maybe Int fmtPrecision = Maybe Int forall a. Maybe a Nothing, fmtAdjust :: Maybe FormatAdjustment fmtAdjust = Maybe FormatAdjustment forall a. Maybe a Nothing, fmtSign :: Maybe FormatSign fmtSign = Maybe FormatSign forall a. Maybe a Nothing, fmtAlternate :: Bool fmtAlternate = Bool False, fmtModifiers :: String fmtModifiers = String "", fmtChar :: Char fmtChar = Char 'd' } in case [UPrintf] us of [] -> ([UPrintf], Int) forall a. a errorMissingArgument (ModifierParser _, FieldFormatter nu) : [UPrintf] us' -> ([UPrintf] us', String -> Int forall a. Read a => String -> a read (FieldFormatter nu FieldFormat ufmt String "")) dfmt :: (RealFloat a) => Char -> Maybe Int -> Bool -> a -> (String, String) dfmt :: forall a. RealFloat a => Char -> Maybe Int -> Bool -> a -> (String, String) dfmt Char c Maybe Int p Bool a a d = let caseConvert :: String -> String caseConvert = if Char -> Bool isUpper Char c then (Char -> Char) -> String -> String forall a b. (a -> b) -> [a] -> [b] map Char -> Char toUpper else String -> String forall a. a -> a id showFunction :: Maybe Int -> a -> String -> String showFunction = case Char -> Char toLower Char c of Char 'e' -> Maybe Int -> a -> String -> String forall a. RealFloat a => Maybe Int -> a -> String -> String showEFloat Char 'f' -> if Bool a then Maybe Int -> a -> String -> String forall a. RealFloat a => Maybe Int -> a -> String -> String showFFloatAlt else Maybe Int -> a -> String -> String forall a. RealFloat a => Maybe Int -> a -> String -> String showFFloat Char 'g' -> if Bool a then Maybe Int -> a -> String -> String forall a. RealFloat a => Maybe Int -> a -> String -> String showGFloatAlt else Maybe Int -> a -> String -> String forall a. RealFloat a => Maybe Int -> a -> String -> String showGFloat Char _ -> String -> Maybe Int -> a -> String -> String forall a. String -> a perror String "internal error: impossible dfmt" result :: String result = String -> String caseConvert (String -> String) -> String -> String forall a b. (a -> b) -> a -> b $ Maybe Int -> a -> String -> String showFunction Maybe Int p a d String "" in case String result of Char '-' : String cs -> (String "-", String cs) String cs -> (String "" , String cs) perror :: String -> a perror :: forall a. String -> a perror String s = String -> a forall a. String -> a errorWithoutStackTrace (String -> a) -> String -> a forall a b. (a -> b) -> a -> b $ String "printf: " String -> String -> String forall a. [a] -> [a] -> [a] ++ String s errorBadFormat :: Char -> a errorBadFormat :: forall a. Char -> a errorBadFormat Char c = String -> a forall a. String -> a perror (String -> a) -> String -> a forall a b. (a -> b) -> a -> b $ String "bad formatting char " String -> String -> String forall a. [a] -> [a] -> [a] ++ Char -> String forall a. Show a => a -> String show Char c errorShortFormat, errorMissingArgument, errorBadArgument :: a errorShortFormat :: forall a. a errorShortFormat = String -> a forall a. String -> a perror String "formatting string ended prematurely" errorMissingArgument :: forall a. a errorMissingArgument = String -> a forall a. String -> a perror String "argument list ended prematurely" errorBadArgument :: forall a. a errorBadArgument = String -> a forall a. String -> a perror String "bad argument"
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4