summaryrefslogtreecommitdiff
path: root/DataUnits.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-03-26 14:37:39 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-03-26 14:37:39 -0400
commit8bcdf42b99675d507813205f097ab7b64b30f514 (patch)
tree0c489557e80de0ae1dd86e6cc0ca102a3d67dc14 /DataUnits.hs
parentceb9593a9cbd39b00daf57ce52724eb40d85f1e0 (diff)
annex.diskreserve can be given in arbitrary units (ie "0.5 gigabytes")
Diffstat (limited to 'DataUnits.hs')
-rw-r--r--DataUnits.hs17
1 files changed, 11 insertions, 6 deletions
diff --git a/DataUnits.hs b/DataUnits.hs
index d8c8d3149..37b0fa429 100644
--- a/DataUnits.hs
+++ b/DataUnits.hs
@@ -11,7 +11,8 @@ module DataUnits (
memoryUnits,
oldSchoolUnits,
roughSize,
- compareSizes
+ compareSizes,
+ readSize
) where
import Data.List
@@ -53,6 +54,7 @@ data Unit = Unit ByteSize Abbrev Name
- progress?
-}
+dataUnits :: [Unit]
dataUnits = storageUnits ++ memoryUnits
{- Storage units are (stupidly) powers of ten. -}
@@ -69,6 +71,7 @@ storageUnits =
, Unit (p 0) "B" "byte"
]
where
+ p :: Integer -> Integer
p n = 1000^n
{- Memory units are (stupidly named) powers of 2. -}
@@ -85,12 +88,14 @@ memoryUnits =
, Unit (p 0) "B" "byte"
]
where
+ p :: Integer -> Integer
p n = 2^(n*10)
{- Do you yearn for the days when men were men and megabytes were megabytes? -}
+oldSchoolUnits :: [Unit]
oldSchoolUnits = map mingle $ zip storageUnits memoryUnits
where
- mingle (Unit s a n, Unit s' a' n') = Unit s' a n
+ mingle (Unit _ a n, Unit s' _ _) = Unit s' a n
{- approximate display of a particular number of bytes -}
roughSize :: [Unit] -> Bool -> ByteSize -> String
@@ -124,8 +129,8 @@ compareSizes units abbrev old new
| otherwise = "same"
{- Parses strings like "10 kilobytes" or "0.5tb". -}
-readSize :: String -> [Unit] -> Maybe ByteSize
-readSize s units
+readSize :: [Unit] -> String -> Maybe ByteSize
+readSize units input
| null parsednum = Nothing
| null parsedunit = Nothing
| otherwise = Just $ round $ number * (fromIntegral multiplier)
@@ -133,14 +138,14 @@ readSize s units
(number, rest) = head parsednum
multiplier = head $ parsedunit
- parsednum = reads s :: [(Double, String)]
+ parsednum = reads input :: [(Double, String)]
parsedunit = lookupUnit units unit
unit = takeWhile isAlpha $ dropWhile isSpace rest
lookupUnit _ [] = [1] -- no unit given, assume bytes
lookupUnit [] _ = []
- lookupUnit (u@(Unit s a n):us) v
+ lookupUnit (Unit s a n:us) v
| a ~~ v || n ~~ v = [s]
| plural n ~~ v || a ~~ byteabbrev v = [s]
| otherwise = lookupUnit us v