module BuildBox.Data.Physical ( Seconds (..) , Bytes (..)) where import BuildBox.Data.Dividable import BuildBox.Pretty import Data.Maybe -- | Seconds of time, pretty printed in engineering format. data Seconds = Seconds Double deriving (Read, Show, Ord, Eq) instance Real Seconds where toRational (Seconds s1) = toRational s1 instance Dividable Seconds where divide (Seconds s1) (Seconds s2) = Seconds (s1 / s2) instance Num Seconds where (+) (Seconds f1) (Seconds f2) = Seconds (f1 + f2) (-) (Seconds f1) (Seconds f2) = Seconds (f1 - f2) (*) (Seconds f1) (Seconds f2) = Seconds (f1 * f2) abs (Seconds f1) = Seconds (abs f1) signum (Seconds f1) = Seconds (signum f1) fromInteger i = Seconds (fromInteger i) instance Pretty Seconds where ppr (Seconds f) = fromMaybe (text (show f)) $ pprEngDouble "s" f -- | Bytes of data, pretty printed in engineering format. data Bytes = Bytes Integer deriving (Read, Show, Ord, Eq) instance Real Bytes where toRational (Bytes b1) = toRational b1 instance Dividable Bytes where divide (Bytes s1) (Bytes s2) = Bytes (s1 `div` s2) instance Num Bytes where (+) (Bytes f1) (Bytes f2) = Bytes (f1 + f2) (-) (Bytes f1) (Bytes f2) = Bytes (f1 - f2) (*) (Bytes f1) (Bytes f2) = Bytes (f1 * f2) abs (Bytes f1) = Bytes (abs f1) signum (Bytes f1) = Bytes (signum f1) fromInteger i = Bytes (fromInteger i) instance Pretty Bytes where ppr (Bytes b) = fromMaybe (text (show b)) $ pprEngInteger "B" b