module Data.Hashrate where
import Data.Money (ScalableAdditive(..))
import Data.Typeable
data SHA256 = SHA256 deriving (Show, Eq)
data Scrypt = Scrypt deriving (Show, Eq)
data ETHASH = ETHASH deriving (Show, Eq)
data X11 = X11 deriving (Show, Eq)
data EQUIHASH = EQUIHASH deriving (Show, Eq)
class (Show a, Eq a, Typeable a) => MiningAlgorithm a
instance MiningAlgorithm SHA256
instance MiningAlgorithm Scrypt
instance MiningAlgorithm ETHASH
instance MiningAlgorithm X11
instance MiningAlgorithm EQUIHASH
data Hashrate a = Hashrate
{ algorithm :: a
, rate :: Double
} deriving (Show)
makeHashrate :: (MiningAlgorithm a) => a -> Double -> Hashrate a
makeHashrate = Hashrate
instance ScalableAdditive (Hashrate a) where
(Hashrate a hr1) ^+^ (Hashrate _ hr2) = Hashrate a (hr1 + hr2)
(Hashrate a hr1) ^-^ (Hashrate _ hr2) = Hashrate a (hr1 hr2)
(Hashrate a hr) ^* c = Hashrate a $ hr * c
kilo = 10.0 ^ 3
mega = 10.0 ^ 6
giga = 10.0 ^ 9
tera = 10.0 ^ 12