module Cachix.Client.HumanSize where

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

humanSize :: Double -> Text
humanSize :: Double -> Text
humanSize size :: Double
size
  | Double
size Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Int -> Double
unitstep 1 = Text -> Double -> Text
render "B" Double
size
  | Double
size Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Int -> Double
unitstep 2 = Text -> Double -> Text
render "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 1
  | Double
size Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Int -> Double
unitstep 3 = Text -> Double -> Text
render "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 2
  | Double
size Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
< Int -> Double
unitstep 4 = Text -> Double -> Text
render "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 3
  | Bool
otherwise = Text -> Double -> Text
render "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 4
  where
    unitstep :: Int -> Double
    unitstep :: Int -> Double
unitstep i :: Int
i = 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 unit :: Text
unit unitsize :: Double
unitsize =
      String -> Text
forall a b. StringConv a b => a -> b
toS (String -> Double -> String
forall r. PrintfType r => String -> r
printf "%.2f" Double
unitsize :: Prelude.String) Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> " " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
unit