module Data.Time.Ebeats
( EbeatsTime(..)
, getEbeatsTime
, toEbeatsTime
)
where
import Data.Fixed (Fixed, E2)
import Data.Time (UTCTime(..), getCurrentTime)
import Data.Time.LocalTime (TimeOfDay(..), timeToTimeOfDay)
newtype EbeatsTime = EbeatsTime { ebeatsTimeValue :: Fixed E2 }
deriving (Eq, Ord)
instance Show EbeatsTime where
show = ('@':) . show . ebeatsTimeValue
getEbeatsTime :: IO EbeatsTime
getEbeatsTime = toEbeatsTime `fmap` getCurrentTime
toEbeatsTime :: UTCTime -> EbeatsTime
toEbeatsTime utct =
let TimeOfDay h m s = timeToTimeOfDay $ utctDayTime utct
!ebeats = realToFrac $ s * 5/432 + realToFrac m * 25/36 + realToFrac h * 125/3
in EbeatsTime ebeats