module Cachix.Client.HumanSize where

import Protolude
import Text.Printf (printf)
import qualified Prelude

humanSize :: Double -> Text
humanSize :: Double -> Text
humanSize Double
size
  | Double
size Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Int -> Double
unitstep Int
1 = Text -> Double -> Text
render Text
"B" Double
size
  | Double
size Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Int -> Double
unitstep Int
2 = Text -> Double -> Text
render Text
"KiB" (Double -> Text) -> Double -> Text
forall a b. (a -> b) -> a -> b
$ Double
size Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Int -> Double
unitstep Int
1
  | Double
size Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Int -> Double
unitstep Int
3 = Text -> Double -> Text
render Text
"MiB" (Double -> Text) -> Double -> Text
forall a b. (a -> b) -> a -> b
$ Double
size Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Int -> Double
unitstep Int
2
  | Double
size Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Int -> Double
unitstep Int
4 = Text -> Double -> Text
render Text
"GiB" (Double -> Text) -> Double -> Text
forall a b. (a -> b) -> a -> b
$ Double
size Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Int -> Double
unitstep Int
3
  | Bool
otherwise = Text -> Double -> Text
render Text
"TiB" (Double -> Text) -> Double -> Text
forall a b. (a -> b) -> a -> b
$ Double
size Double -> Double -> Double
forall a. Fractional a => a -> a -> a
/ Int -> Double
unitstep Int
4
  where
    unitstep :: Int -> Double
    unitstep :: Int -> Double
unitstep Int
i = Double
1024.0 Double -> Int -> Double
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
i
    render :: Text -> Double -> Text
    render :: Text -> Double -> Text
render Text
unit Double
unitsize =
      String -> Text
forall a b. ConvertText a b => a -> b
toS (String -> Double -> String
forall r. PrintfType r => String -> r
printf String
"%.2f" Double
unitsize :: Prelude.String) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
unit