module Data.EventList.Absolute.TimeTimePrivate where
import qualified Data.EventList.Absolute.TimeBodyPrivate as TimeBodyList
import Data.EventList.Absolute.TimeBodyPrivate (($~))
import qualified Data.AlternatingList.List.Uniform as Uniform
import qualified Data.AlternatingList.List.Mixed as Mixed
import Data.Tuple.HT (mapFst, )
import qualified Control.Monad as Monad
import qualified Control.Applicative as Applicative
import Control.Applicative (Applicative, )
newtype T time body = Cons {decons :: Uniform.T body time}
deriving (Eq, Ord, Show)
infixl 5 $*
($*) :: (Uniform.T body time -> a) -> (T time body -> a)
($*) f = f . decons
lift ::
(Uniform.T body0 time0 -> Uniform.T body1 time1) ->
(T time0 body0 -> T time1 body1)
lift f = Cons . f . decons
liftA :: Applicative m =>
(Uniform.T body0 time0 -> m (Uniform.T body1 time1)) ->
(T time0 body0 -> m (T time1 body1))
liftA f = Applicative.liftA Cons . f . decons
liftM :: Monad m =>
(Uniform.T body0 time0 -> m (Uniform.T body1 time1)) ->
(T time0 body0 -> m (T time1 body1))
liftM f = Monad.liftM Cons . f . decons
snocBody :: T time body -> body -> TimeBodyList.T time body
snocBody xs =
TimeBodyList.Cons . (Mixed.snocFirst $* xs)
snocTime :: TimeBodyList.T time body -> time -> T time body
snocTime xs =
Cons . (Mixed.snocSecond $~ xs)
viewTimeR :: T time body -> (TimeBodyList.T time body, time)
viewTimeR =
mapFst TimeBodyList.Cons . Mixed.viewSecondR . decons
viewBodyR :: TimeBodyList.T time body -> Maybe (T time body, body)
viewBodyR =
fmap (mapFst Cons) . Mixed.viewFirstR . TimeBodyList.decons
switchTimeR :: (TimeBodyList.T time body -> time -> a) -> T time body -> a
switchTimeR f =
Mixed.switchSecondR (f . TimeBodyList.Cons) . decons
switchBodyR :: a -> (T time body -> body -> a) -> TimeBodyList.T time body -> a
switchBodyR f g =
Mixed.switchFirstR f (g . Cons) . TimeBodyList.decons
mapTimeInit ::
(TimeBodyList.T time body0 -> TimeBodyList.T time body1) ->
T time body0 -> T time body1
mapTimeInit f = uncurry snocTime . mapFst f . viewTimeR