module Sound.ALSA.Sequencer.RealTime
  ( RealTime.T(..)
  , fromDouble, fromFractional, fromInteger
  , toDouble, toFractional, toInteger
  ) where

import qualified Sound.ALSA.Sequencer.Marshal.RealTime as RealTime

import Prelude hiding (fromInteger, toInteger, )


nanoPerSecond :: Num a => a
nanoPerSecond :: forall a. Num a => a
nanoPerSecond = a
10forall a b. (Num a, Integral b) => a -> b -> a
^(Int
9::Int)

-- | Convert number of nanoseconds to 'RealTime.T'
fromInteger :: Integer -> RealTime.T
fromInteger :: Integer -> T
fromInteger Integer
t =
   let (Integer
s,Integer
n) = forall a. Integral a => a -> a -> (a, a)
divMod Integer
t forall a. Num a => a
nanoPerSecond
   in  Word32 -> Word32 -> T
RealTime.Cons (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
s) (forall a b. (Integral a, Num b) => a -> b
fromIntegral Integer
n)

{- |
Convert fractional number of seconds to 'RealTime.T'
Time must be non-negative.
-}
fromDouble :: Double -> RealTime.T
fromDouble :: Double -> T
fromDouble = forall a. RealFrac a => a -> T
fromFractional

fromFractional :: (RealFrac a) => a -> RealTime.T
fromFractional :: forall a. RealFrac a => a -> T
fromFractional a
t =
   let (Word32
s,a
n) = forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction a
t
   in  Word32 -> Word32 -> T
RealTime.Cons Word32
s (forall a b. (RealFrac a, Integral b) => a -> b
floor forall a b. (a -> b) -> a -> b
$ a
n forall a. Num a => a -> a -> a
* forall a. Num a => a
nanoPerSecond)

-- | Convert number of nanoseconds to 'RealTime.T'
toInteger :: RealTime.T -> Integer
toInteger :: T -> Integer
toInteger (RealTime.Cons Word32
s Word32
n) =
   forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
s forall a. Num a => a -> a -> a
* forall a. Num a => a
nanoPerSecond forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
n

-- | Convert fractional number of seconds to 'RealTime.T'
toDouble :: RealTime.T -> Double
toDouble :: T -> Double
toDouble = forall a. RealFrac a => T -> a
toFractional

toFractional :: (RealFrac a) => RealTime.T -> a
toFractional :: forall a. RealFrac a => T -> a
toFractional (RealTime.Cons Word32
s Word32
n) =
   forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
s forall a. Num a => a -> a -> a
+ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
n forall a. Fractional a => a -> a -> a
/ forall a. Num a => a
nanoPerSecond