module Sound.OSC.Time where
import Control.Concurrent
import Control.Monad
import Control.Monad.IO.Class
import Data.Word
import qualified Data.Time as T
import qualified Data.Time.Clock.POSIX as T
import Sound.OSC.Coding.Convert
type NTP64 = Word64
type Time = Double
immediately :: Time
immediately :: Time
immediately = Time
1 forall a. Fractional a => a -> a -> a
/ Time
2forall a b. (Num a, Integral b) => a -> b -> a
^(Int
32::Int)
type UT = Double
ntpr_to_ntpi :: Time -> NTP64
ntpr_to_ntpi :: Time -> NTP64
ntpr_to_ntpi Time
t = forall a b. (RealFrac a, Integral b) => a -> b
round (Time
t forall a. Num a => a -> a -> a
* (Time
2 forall a b. (Num a, Integral b) => a -> b -> a
^ (Int
32::Int)))
ntpi_to_ntpr :: NTP64 -> Time
ntpi_to_ntpr :: NTP64 -> Time
ntpi_to_ntpr NTP64
t = NTP64 -> Time
word64_to_double NTP64
t forall a. Fractional a => a -> a -> a
/ Time
2forall a b. (Num a, Integral b) => a -> b -> a
^(Int
32::Int)
ntp_ut_epoch_diff :: Num n => n
ntp_ut_epoch_diff :: forall n. Num n => n
ntp_ut_epoch_diff = (n
70 forall a. Num a => a -> a -> a
* n
365 forall a. Num a => a -> a -> a
+ n
17) forall a. Num a => a -> a -> a
* n
24 forall a. Num a => a -> a -> a
* n
60 forall a. Num a => a -> a -> a
* n
60
ut_to_ntpi :: UT -> NTP64
ut_to_ntpi :: Time -> NTP64
ut_to_ntpi Time
t = Time -> NTP64
ntpr_to_ntpi (Time
t forall a. Num a => a -> a -> a
+ forall n. Num n => n
ntp_ut_epoch_diff)
ut_to_ntpr :: Num n => n -> n
ut_to_ntpr :: forall n. Num n => n -> n
ut_to_ntpr = forall a. Num a => a -> a -> a
(+) forall n. Num n => n
ntp_ut_epoch_diff
ntpr_to_ut :: Num n => n -> n
ntpr_to_ut :: forall n. Num n => n -> n
ntpr_to_ut = forall a. Num a => a -> a -> a
(+) (forall n. Num n => n -> n
negate forall n. Num n => n
ntp_ut_epoch_diff)
ntpi_to_ut :: NTP64 -> UT
ntpi_to_ut :: NTP64 -> Time
ntpi_to_ut = forall n. Num n => n -> n
ntpr_to_ut forall b c a. (b -> c) -> (a -> b) -> a -> c
. NTP64 -> Time
ntpi_to_ntpr
ntpr_to_posixtime :: Time -> T.POSIXTime
ntpr_to_posixtime :: Time -> POSIXTime
ntpr_to_posixtime = forall a b. (Real a, Fractional b) => a -> b
realToFrac forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. Num n => n -> n
ntpr_to_ut
posixtime_to_ntpr :: T.POSIXTime -> Time
posixtime_to_ntpr :: POSIXTime -> Time
posixtime_to_ntpr = forall n. Num n => n -> n
ut_to_ntpr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Real a, Fractional b) => a -> b
realToFrac
ut_epoch :: T.UTCTime
ut_epoch :: UTCTime
ut_epoch =
let d :: Day
d = Year -> Int -> Int -> Day
T.fromGregorian Year
1970 Int
1 Int
1
s :: DiffTime
s = Year -> DiffTime
T.secondsToDiffTime Year
0
in Day -> DiffTime -> UTCTime
T.UTCTime Day
d DiffTime
s
utc_to_ut :: Fractional n => T.UTCTime -> n
utc_to_ut :: forall n. Fractional n => UTCTime -> n
utc_to_ut UTCTime
t = forall a b. (Real a, Fractional b) => a -> b
realToFrac (UTCTime -> UTCTime -> POSIXTime
T.diffUTCTime UTCTime
t UTCTime
ut_epoch)
time :: MonadIO m => m Time
time :: forall (m :: * -> *). MonadIO m => m Time
time = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap POSIXTime -> Time
posixtime_to_ntpr IO POSIXTime
T.getPOSIXTime)
pauseThreadLimit :: Fractional n => n
pauseThreadLimit :: forall n. Fractional n => n
pauseThreadLimit = forall a b. (Integral a, Num b) => a -> b
fromIntegral (forall a. Bounded a => a
maxBound::Int) forall a. Fractional a => a -> a -> a
/ n
1e6
pauseThread :: (MonadIO m,RealFrac n) => n -> m ()
pauseThread :: forall (m :: * -> *) n. (MonadIO m, RealFrac n) => n -> m ()
pauseThread n
n = forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (n
n forall a. Ord a => a -> a -> Bool
> n
0) (forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (Int -> IO ()
threadDelay (forall a b. (RealFrac a, Integral b) => a -> b
floor (n
n forall a. Num a => a -> a -> a
* n
1e6))))
wait :: MonadIO m => Double -> m ()
wait :: forall (m :: * -> *). MonadIO m => Time -> m ()
wait = forall (m :: * -> *) n. (MonadIO m, RealFrac n) => n -> m ()
pauseThread
pauseThreadUntil :: MonadIO m => Time -> m ()
pauseThreadUntil :: forall (m :: * -> *). MonadIO m => Time -> m ()
pauseThreadUntil Time
t = forall (m :: * -> *) n. (MonadIO m, RealFrac n) => n -> m ()
pauseThread forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Time
t forall a. Num a => a -> a -> a
-) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> *). MonadIO m => m Time
time
sleepThread :: (RealFrac n, MonadIO m) => n -> m ()
sleepThread :: forall n (m :: * -> *). (RealFrac n, MonadIO m) => n -> m ()
sleepThread n
n =
if n
n forall a. Ord a => a -> a -> Bool
>= forall n. Fractional n => n
pauseThreadLimit
then let n' :: n
n' = forall n. Fractional n => n
pauseThreadLimit forall a. Num a => a -> a -> a
- n
1
in forall (m :: * -> *) n. (MonadIO m, RealFrac n) => n -> m ()
pauseThread n
n forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> forall n (m :: * -> *). (RealFrac n, MonadIO m) => n -> m ()
sleepThread (n
n forall a. Num a => a -> a -> a
- n
n')
else forall (m :: * -> *) n. (MonadIO m, RealFrac n) => n -> m ()
pauseThread n
n
sleepThreadUntil :: MonadIO m => Time -> m ()
sleepThreadUntil :: forall (m :: * -> *). MonadIO m => Time -> m ()
sleepThreadUntil Time
t = forall n (m :: * -> *). (RealFrac n, MonadIO m) => n -> m ()
sleepThread forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Time
t forall a. Num a => a -> a -> a
-) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall (m :: * -> *). MonadIO m => m Time
time
iso_8601_fmt :: String
iso_8601_fmt :: String
iso_8601_fmt = String
"%Y-%m-%dT%H:%M:%S,%q+0000"
iso_8601_to_utctime :: String -> Maybe T.UTCTime
iso_8601_to_utctime :: String -> Maybe UTCTime
iso_8601_to_utctime = forall (m :: * -> *) t.
(MonadFail m, ParseTime t) =>
Bool -> TimeLocale -> String -> String -> m t
T.parseTimeM Bool
True TimeLocale
T.defaultTimeLocale String
iso_8601_fmt
utctime_to_iso_8601 :: T.UTCTime -> String
utctime_to_iso_8601 :: UTCTime -> String
utctime_to_iso_8601 = forall t. FormatTime t => TimeLocale -> String -> t -> String
T.formatTime TimeLocale
T.defaultTimeLocale String
iso_8601_fmt
ntpr_to_iso_8601 :: Time -> String
ntpr_to_iso_8601 :: Time -> String
ntpr_to_iso_8601 = UTCTime -> String
utctime_to_iso_8601 forall b c a. (b -> c) -> (a -> b) -> a -> c
. POSIXTime -> UTCTime
T.posixSecondsToUTCTime forall b c a. (b -> c) -> (a -> b) -> a -> c
. Time -> POSIXTime
ntpr_to_posixtime
iso_8601_to_ntpr :: String -> Maybe Time
iso_8601_to_ntpr :: String -> Maybe Time
iso_8601_to_ntpr = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (POSIXTime -> Time
posixtime_to_ntpr forall b c a. (b -> c) -> (a -> b) -> a -> c
. UTCTime -> POSIXTime
T.utcTimeToPOSIXSeconds) forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Maybe UTCTime
iso_8601_to_utctime
time_pp :: Time -> String
time_pp :: Time -> String
time_pp = Time -> String
ntpr_to_iso_8601