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