{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# Language FlexibleContexts #-}
{-# Language RecordWildCards #-}
{-# Language TypeSynonymInstances #-}
{-# Language TypeFamilies #-}
{-# Language FlexibleInstances #-}

module Text.Printf.TH.Printer.String where

import NumericUtils
import Text.Printf.TH.Printer

instance Printer String where
    type Output String = String
    string = id
    formatChar' = pure
    cons = (:)
    output _ = id
    rjust c n s
        | diff <= 0 = s
        | otherwise = replicate diff c ++ s
      where
        diff = fromIntegral n - length s
    ljust n s
        | diff <= 0 = s
        | otherwise = s ++ replicate diff ' '
      where
        diff = fromIntegral n - length s
    formatDec' = showIntAtBase 10 intToDigit
    formatOct' = showIntAtBase 8 intToDigit
    formatHex' = showIntAtBase 16 intToDigit
    formatHexUpper' = showIntAtBase 16 intToDigitUpper
    formatFloat' p =
        ( formatRealFloatAlt FFFixed (fromIntegral <$> p) False False
        , formatRealFloatAlt FFFixed (fromIntegral <$> p) True False)
    formatHexFloat' p =
        ( formatFloatHex (fromIntegral <$> p) False False
        , formatFloatHex (fromIntegral <$> p) True False)
    formatHexFloatUpper' p =
        ( formatFloatHex (fromIntegral <$> p) False True
        , formatFloatHex (fromIntegral <$> p) True True)
    formatSci' p =
        ( formatRealFloatAlt FFExponent (fromIntegral <$> p) False False
        , formatRealFloatAlt FFExponent (fromIntegral <$> p) True False)
    formatSciUpper' p =
        ( formatRealFloatAlt FFExponent (fromIntegral <$> p) False True
        , formatRealFloatAlt FFExponent (fromIntegral <$> p) True True)
    formatG' p =
        ( formatRealFloatAlt FFGeneric (fromIntegral <$> p) False False
        , formatRealFloatAlt FFGeneric (fromIntegral <$> p) True False)
    formatGUpper' p =
        ( formatRealFloatAlt FFGeneric (fromIntegral <$> p) False True
        , formatRealFloatAlt FFGeneric (fromIntegral <$> p) True True)