module Data.EventList.Relative.TimeTimePrivate where
import qualified Data.EventList.Relative.TimeBodyPrivate as TimeBodyList
import qualified Data.EventList.Relative.TimeBodyPrivate as TimeBodyPriv
import qualified Data.EventList.Relative.BodyTimePrivate as BodyTimeList
import qualified Data.EventList.Relative.BodyTimePrivate as BodyTimePriv
import qualified Data.AlternatingList.List.Uniform as Uniform
import qualified Data.AlternatingList.List.Mixed as Mixed
import Data.EventList.Utility (mapFst, mapSnd)
import qualified Control.Monad as Monad
import Test.QuickCheck (Arbitrary(..))
newtype T time body = Cons {decons :: Uniform.T body time}
deriving (Eq, Ord)
instance (Show time, Show body) => Show (T time body) where
showsPrec p = Uniform.format " ./ " " /. " p . decons
instance (Arbitrary time, Arbitrary body) =>
Arbitrary (T time body) where
arbitrary = Monad.liftM Cons arbitrary
coarbitrary = undefined
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
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
unlift ::
(T time0 body0 -> T time1 body1) ->
(Uniform.T body0 time0 -> Uniform.T body1 time1)
unlift f = decons . f . Cons
consBody :: body -> T time body -> BodyTimeList.T time body
consBody b = BodyTimePriv.Cons . Mixed.consFirst b . decons
consTime :: time -> BodyTimeList.T time body -> T time body
consTime t = Cons . Mixed.consSecond t . BodyTimePriv.decons
viewTimeL :: T time body -> (time, BodyTimeList.T time body)
viewTimeL = mapSnd BodyTimePriv.Cons . Mixed.viewSecondL . decons
viewBodyL :: BodyTimeList.T time body -> Maybe (body, T time body)
viewBodyL = fmap (mapSnd Cons) . Mixed.viewFirstL . BodyTimePriv.decons
viewTimeR :: T time body -> (TimeBodyList.T time body, time)
viewTimeR = mapFst TimeBodyPriv.Cons . Mixed.viewSecondR . decons
viewBodyR :: TimeBodyList.T time body -> Maybe (T time body, body)
viewBodyR = fmap (mapFst Cons) . Mixed.viewFirstR . TimeBodyPriv.decons
mapTimeL ::
(time -> time, BodyTimeList.T time body0 -> BodyTimeList.T time body1) ->
T time body0 -> T time body1
mapTimeL = lift . Mixed.mapSecondL . mapSnd BodyTimePriv.unlift
mapTimeHead ::
(time -> time) ->
T time body -> T time body
mapTimeHead = lift . Mixed.mapSecondHead
mapTimeTail ::
(BodyTimeList.T time body0 -> BodyTimeList.T time body1) ->
T time body0 -> T time body1
mapTimeTail = lift . Mixed.mapSecondTail . BodyTimePriv.unlift
mapTimeR ::
(TimeBodyList.T time body0 -> TimeBodyList.T time body1, time -> time) ->
T time body0 -> T time body1
mapTimeR = lift . Mixed.mapSecondR . mapFst TimeBodyPriv.unlift
mapTimeLast ::
(time -> time) ->
T time body -> T time body
mapTimeLast = lift . Mixed.mapSecondLast
mapTimeInit ::
(TimeBodyList.T time body0 -> TimeBodyList.T time body1) ->
T time body0 -> T time body1
mapTimeInit = lift . Mixed.mapSecondInit . TimeBodyPriv.unlift