module NumericUtils (module NumericUtils, intToDigit) where
import Data.Char
import GHC.Base
import Text.Printf.TH.Printer
intToDigitUpper :: Int -> Char
intToDigitUpper (I# i)
| isTrue# (i >=# 0#) && isTrue# (i <=# 9#) = unsafeChr (ord '0' + I# i)
| isTrue# (i >=# 10#) && isTrue# (i <=# 15#) = unsafeChr (ord 'A' + I# i 10)
| otherwise = error ("Char.intToDigit: not a digit " ++ show (I# i))
showIntAtBase :: (Integral i, Monoid b, Printer b) => i -> (Int -> Char) -> i -> b
showIntAtBase base toB n0 = showIt (quotRem n0 base) mempty
where
showIt (n, d) r =
case n of
0 -> r'
_ -> showIt (quotRem n base) r'
where
r' = cons (toB $ fromIntegral d) r