-- |
-- Module      :  Data.ReversedScientific
-- Copyright   :  (c) OleksandrZhabenko 2023
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  oleksandr.zhabenko@yahoo.com
--
-- Provides a function that shows the somewhat "reversed" scientific notation of the big 'Integer' number so that it is easier (more likely exact) to compare at quick glance twe numbers in such a notation by their order and values.

{-# LANGUAGE NoImplicitPrelude #-}

{-# OPTIONS_HADDOCK -show-extensions #-}

module Data.ReversedScientific where

import GHC.Base
import GHC.Num ((-),Integer)
import Text.Show (Show(..))
import Data.List (length,dropWhileEnd)


showBignum :: Int -> Integer -> String
showBignum :: Int -> Integer -> String
showBignum Int
n Integer
x 
  | Int
l0 forall a. Ord a => a -> a -> Bool
< Int
6 = String
xShow
  | Int
l forall a. Ord a => a -> a -> Bool
>= Int
n = forall a. Monoid a => [a] -> a
mconcat [String
"e", forall a. Show a => a -> String
show (Int
l forall a. Num a => a -> a -> a
- Int
1), String
"~m", forall a. Show a => a -> String
show Int
l0, String
"~", String
k1s, String
".", String
k2s, String
"...", String
k3s]
  | Bool
otherwise = String
xShow
      where xShow :: String
xShow = forall a. Show a => a -> String
show Integer
x
            l :: Int
l = forall (t :: * -> *) a. Foldable t => t a -> Int
length String
xShow
            k :: String
k = forall a. (a -> Bool) -> [a] -> [a]
dropWhileEnd (forall a. Eq a => a -> a -> Bool
== Char
'0') String
xShow 
            l0 :: Int
l0 = forall (t :: * -> *) a. Foldable t => t a -> Int
length String
k
            f :: [a] -> ([a], [a], [a])
f (a
p:a
q:a
r:a
s:a
t:a
u:a
v:[a]
vs) = [a] -> ([a], [a], [a])
f (a
pforall a. a -> [a] -> [a]
:a
qforall a. a -> [a] -> [a]
:a
rforall a. a -> [a] -> [a]
:a
tforall a. a -> [a] -> [a]
:a
uforall a. a -> [a] -> [a]
:a
vforall a. a -> [a] -> [a]
:[a]
vs)
            f (a
p:a
q:a
r:a
s:a
t:a
u:[a]
_) = ([a
p], [a
q, a
r], [a
s, a
t, a
u])
            (String
k1s,String
k2s,String
k3s) = forall {a}. [a] -> ([a], [a], [a])
f String
k