5 changed files with 55 additions and 1 deletions
@ -0,0 +1,37 @@
@@ -0,0 +1,37 @@
|
||||
{-# LANGUAGE MultiWayIf #-} |
||||
|
||||
module ATrade.Price ( |
||||
Price(..), |
||||
fromDouble, |
||||
toDouble |
||||
) where |
||||
|
||||
import Data.Int |
||||
|
||||
data Price = Price { |
||||
priceQuants :: !Int64 |
||||
} deriving (Eq, Show, Ord) |
||||
|
||||
giga :: Int64 |
||||
giga = 1000000000 |
||||
|
||||
instance Num Price where |
||||
a + b = Price { |
||||
priceQuants = priceQuants a + priceQuants b } |
||||
|
||||
a * b = Price { |
||||
priceQuants = (priceQuants a * priceQuants b) `div` giga } |
||||
|
||||
abs a = a { priceQuants = abs (priceQuants a) } |
||||
|
||||
signum a = a { priceQuants = signum (priceQuants a)} |
||||
|
||||
fromInteger int = Price { priceQuants = giga * fromInteger int} |
||||
|
||||
negate a = a { priceQuants = negate (priceQuants a) } |
||||
|
||||
toDouble :: Price -> Double |
||||
toDouble p = fromIntegral (priceQuants p) / fromIntegral giga |
||||
|
||||
fromDouble :: Double -> Price |
||||
fromDouble d = Price { priceQuants = truncate (d * fromIntegral giga) } |
||||
Loading…
Reference in new issue