module Units
( toSAT
, toUBTC
, toMBTC
, toBTC
, Bitcoin(..)
) where
data Bitcoin a = SAT Double
| UBTC Double
| MBTC Double
| BTC Double
deriving(Show)
instance Eq (Bitcoin a) where
x == y = toSATVal x == (toSATVal y)
instance Ord (Bitcoin a) where
x >= y = toSATVal x >= (toSATVal y)
x <= y = toSATVal x <= (toSATVal y)
instance Num (Bitcoin a) where
SAT x + (SAT y) = SAT (x + y)
x + y = toSAT x + toSAT y
x y = x + (negate y)
negate (SAT x) = SAT (negate x)
negate x = negate (toSAT x)
getVal :: Bitcoin a -> Double
getVal (SAT x) = x
toSATVal :: Bitcoin a -> Double
toSATVal = getVal . toSAT
toSAT :: Bitcoin a -> Bitcoin a
toSAT (SAT x) = SAT x
toSAT (UBTC x) = SAT $ x * 100
toSAT (MBTC x) = SAT $ x * 100000
toSAT (BTC x) = SAT $ x * 100000000
toUBTC :: Bitcoin a -> Bitcoin a
toUBTC (SAT x) = UBTC $ x / 100
toUBTC x = toUBTC $ toSAT x
toMBTC :: Bitcoin a -> Bitcoin a
toMBTC (SAT x) = MBTC $ x / 100000
toMBTC x = toMBTC $ toSAT x
toBTC :: Bitcoin a -> Bitcoin a
toBTC (SAT x) = BTC $ x / 100000000
toBTC x = toBTC $ toSAT x