{-# LANGUAGE RelaxedPolyRec #-}
{-# LANGUAGE CPP #-}
module Data.Text.Format
(
left
, right
, hex
, fixed
, shortest
) where
#ifdef MIN_VERSION_double_conversion
import Data.Double.Conversion.Text (toFixed, toShortest)
#else
import Numeric (showFFloat, showInt)
#endif
import qualified Formatting.Buildable as B
import Data.Text.Format.Types (Hex(..))
import qualified Data.Text.Lazy as LT
import Data.Text.Lazy.Builder
import Prelude hiding (exp, print)
left :: B.Buildable a => Int -> Char -> a -> Builder
left :: forall a. Buildable a => Int -> Char -> a -> Builder
left Int
k Char
c =
Text -> Builder
fromLazyText (Text -> Builder) -> (a -> Text) -> a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int64 -> Char -> Text -> Text
LT.justifyRight (Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
k) Char
c (Text -> Text) -> (a -> Text) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
toLazyText (Builder -> Text) -> (a -> Builder) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Builder
forall p. Buildable p => p -> Builder
B.build
right :: B.Buildable a => Int -> Char -> a -> Builder
right :: forall a. Buildable a => Int -> Char -> a -> Builder
right Int
k Char
c =
Text -> Builder
fromLazyText (Text -> Builder) -> (a -> Text) -> a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int64 -> Char -> Text -> Text
LT.justifyLeft (Int -> Int64
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
k) Char
c (Text -> Text) -> (a -> Text) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Builder -> Text
toLazyText (Builder -> Text) -> (a -> Builder) -> a -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Builder
forall p. Buildable p => p -> Builder
B.build
fixed :: (Real a) =>
Int
-> a -> Builder
#ifdef MIN_VERSION_double_conversion
fixed decs = fromText . toFixed decs . realToFrac
#else
fixed :: forall a. Real a => Int -> a -> Builder
fixed Int
decs = String -> Builder
fromString (String -> Builder) -> (a -> String) -> a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> String
toFixed (Double -> String) -> (a -> Double) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac
where
toFixed :: Double -> String
toFixed :: Double -> String
toFixed Double
dbl = Maybe Int -> Double -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat (Int -> Maybe Int
forall a. a -> Maybe a
Just Int
decs) Double
dbl String
""
#endif
{-# NOINLINE[0] fixed #-}
shortest :: Real a => a -> Builder
#ifdef MIN_VERSION_double_conversion
shortest = fromText . toShortest . realToFrac
#else
shortest :: forall a. Real a => a -> Builder
shortest = String -> Builder
fromString (String -> Builder) -> (a -> String) -> a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> String
toShortest (Double -> String) -> (a -> Double) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Double
forall a b. (Real a, Fractional b) => a -> b
realToFrac
where
toShortest :: Double -> String
toShortest :: Double -> String
toShortest Double
dbl =
let intPart :: Int
intPart = (Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor Double
dbl :: Int) in
if Double
dbl Double -> Double -> Bool
forall a. Eq a => a -> a -> Bool
== (Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
intPart)
then Int -> ShowS
forall a. Integral a => a -> ShowS
showInt Int
intPart String
""
else Maybe Int -> Double -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing Double
dbl String
""
#endif
{-# INLINE shortest #-}
hex :: Integral a => a -> Builder
hex :: forall a. Integral a => a -> Builder
hex = Hex a -> Builder
forall p. Buildable p => p -> Builder
B.build (Hex a -> Builder) -> (a -> Hex a) -> a -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Hex a
forall a. a -> Hex a
Hex
{-# INLINE hex #-}