module Haskore.RealTime.EventList.TimeTime
(T,
mapBody, mapTime, mapM, mapM_,
BodyTimeList.empty, pause,
merge, insert, decreaseStart, delay, filter, foldr,
viewTimeL, viewBodyL, viewTimeR, viewBodyR,
cons, consBody, consTime,
snoc, snocBody, snocTime,
mapTimeL, mapTimeHead, mapTimeTail,
mapBodyL, mapBodyHead, mapBodyTail,
mapTimeR, mapTimeLast, mapTimeInit,
mapBodyR, mapBodyLast, mapBodyInit,
catMaybes,
append,
concat, concatNaive, resample,
toAbsoluteEventList,
run, runTimeStamp, runTimeStampGrouped, runRelative,
collectCoincident, flatten, mapCoincident,
) where
import Data.EventList.Relative.TimeTime
import Data.EventList.Relative.MixedTime
import Data.EventList.Relative.TimeMixed
import qualified Data.EventList.Relative.BodyTime as BodyTimeList
import qualified Data.EventList.Absolute.TimeTime as AbsList
import qualified Data.EventList.Absolute.TimeMixed as AbsListMix
import qualified Haskore.RealTime.Timer as Timer
import qualified Haskore.RealTime.EventList.TimeBody as TimeList
import qualified Numeric.NonNegative.Class as NonNeg
import qualified Control.Monad as Monad
import Prelude hiding (concat, filter, foldr, mapM, mapM_)
runRelative :: (NonNeg.C time, RealFrac time, Monad m) =>
Timer.T m -> (body -> m a) -> T time body -> m [a]
runRelative timer action =
Monad.liftM getBodies .
mapM (Timer.wait timer) action .
resample (fromIntegral $ Timer.resolution timer)
run :: (RealFrac time, Monad m) =>
Timer.T m -> (body -> m a) -> T time body -> m [a]
run timer action = runTimeStamp timer (const action)
runTimeStamp :: (RealFrac time, Monad m) =>
Timer.T m -> (time -> body -> m a) -> T time body -> m [a]
runTimeStamp =
runCore id
runTimeStampGrouped :: (RealFrac time, Monad m) =>
Timer.T m -> (time -> [body] -> m a) -> T time body -> m [a]
runTimeStampGrouped =
runCore AbsList.collectCoincident
runCore :: (Fractional time0, RealFrac time1, Monad m) =>
(AbsList.T time0 body0 -> AbsList.T time1 body1) ->
Timer.T m -> (time1 -> body1 -> m a) -> T time0 body0 -> m [a]
runCore convertAbs timer action evs =
Monad.liftM AbsList.getBodies .
AbsList.mapM
(Timer.waitUntilSeconds timer)
(uncurry action) .
attachTime .
convertAbs .
flip toAbsoluteEventList evs =<<
Timer.getTimeSeconds timer
attachTime :: AbsList.T time body -> AbsList.T time (time, body)
attachTime =
AbsListMix.mapTimeInit TimeList.attachTime