{- |
Copyright   :  (c) Henning Thielemann 2007

Maintainer  :  haskell@henning-thielemann.de
Stability   :  stable
Portability :  Haskell 98


Event lists starting with a body and ending with a time difference.

-}
module Data.EventList.Relative.MixedTime
   (consBody, consTime, (/.), (./), empty,
    viewTimeL,   viewBodyL,
    switchTimeL, switchBodyL,
    mapTimeL, mapTimeHead, mapTimeTail,
    mapBodyL, mapBodyHead, mapBodyTail,
   ) where

import qualified Data.EventList.Relative.BodyTimePrivate as BodyTimePriv
import           Data.EventList.Relative.TimeTimePrivate as TimeTimePriv

import qualified Data.EventList.Relative.BodyTime as BodyTimeList
import qualified Data.EventList.Relative.TimeTime as TimeTimeList

import Data.EventList.Relative.BodyTime (empty)

-- import qualified Data.AlternatingList.List.Disparate as Disp
-- import qualified Data.AlternatingList.List.Uniform as Uniform
import qualified Data.AlternatingList.List.Mixed as Mixed

-- import Data.AlternatingList.List.Mixed ((/.), (./))

import Data.Tuple.HT (mapSnd, )

import Prelude hiding
   (null, foldr, map, filter, concat, cycle, sequence, sequence_, mapM, mapM_)


infixr 5 /. , ./

(./) :: body -> TimeTimeList.T time body -> BodyTimeList.T time body
./ :: forall body time. body -> T time body -> T time body
(./) = body -> T time body -> T time body
forall body time. body -> T time body -> T time body
consBody

(/.) :: time -> BodyTimeList.T time body -> TimeTimeList.T time body
/. :: forall time body. time -> T time body -> T time body
(/.) = time -> T time body -> T time body
forall time body. time -> T time body -> T time body
consTime

mapBodyL ::
   (body -> body, TimeTimeList.T time0 body -> TimeTimeList.T time1 body) ->
   BodyTimeList.T time0 body -> BodyTimeList.T time1 body
mapBodyL :: forall body time0 time1.
(body -> body, T time0 body -> T time1 body)
-> T time0 body -> T time1 body
mapBodyL = (T body time0 -> T body time1) -> T time0 body -> T time1 body
forall body0 time0 body1 time1.
(T body0 time0 -> T body1 time1) -> T time0 body0 -> T time1 body1
BodyTimePriv.lift ((T body time0 -> T body time1) -> T time0 body -> T time1 body)
-> ((body -> body, T time0 body -> T time1 body)
    -> T body time0 -> T body time1)
-> (body -> body, T time0 body -> T time1 body)
-> T time0 body
-> T time1 body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (body -> body, T body time0 -> T body time1)
-> T body time0 -> T body time1
forall a b0 b1. (a -> a, T a b0 -> T a b1) -> T a b0 -> T a b1
Mixed.mapFirstL ((body -> body, T body time0 -> T body time1)
 -> T body time0 -> T body time1)
-> ((body -> body, T time0 body -> T time1 body)
    -> (body -> body, T body time0 -> T body time1))
-> (body -> body, T time0 body -> T time1 body)
-> T body time0
-> T body time1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((T time0 body -> T time1 body) -> T body time0 -> T body time1)
-> (body -> body, T time0 body -> T time1 body)
-> (body -> body, T body time0 -> T body time1)
forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd (T time0 body -> T time1 body) -> T body time0 -> T body time1
forall time0 body0 time1 body1.
(T time0 body0 -> T time1 body1) -> T body0 time0 -> T body1 time1
TimeTimePriv.unlift

mapBodyHead ::
   (body -> body) ->
   BodyTimeList.T time body -> BodyTimeList.T time body
mapBodyHead :: forall body time. (body -> body) -> T time body -> T time body
mapBodyHead = (T body time -> T body time) -> T time body -> T time body
forall body0 time0 body1 time1.
(T body0 time0 -> T body1 time1) -> T time0 body0 -> T time1 body1
BodyTimePriv.lift ((T body time -> T body time) -> T time body -> T time body)
-> ((body -> body) -> T body time -> T body time)
-> (body -> body)
-> T time body
-> T time body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (body -> body) -> T body time -> T body time
forall a b. (a -> a) -> T a b -> T a b
Mixed.mapFirstHead

mapBodyTail ::
   (TimeTimeList.T time0 body -> TimeTimeList.T time1 body) ->
   BodyTimeList.T time0 body -> BodyTimeList.T time1 body
mapBodyTail :: forall time0 body time1.
(T time0 body -> T time1 body) -> T time0 body -> T time1 body
mapBodyTail = (T body time0 -> T body time1) -> T time0 body -> T time1 body
forall body0 time0 body1 time1.
(T body0 time0 -> T body1 time1) -> T time0 body0 -> T time1 body1
BodyTimePriv.lift ((T body time0 -> T body time1) -> T time0 body -> T time1 body)
-> ((T time0 body -> T time1 body) -> T body time0 -> T body time1)
-> (T time0 body -> T time1 body)
-> T time0 body
-> T time1 body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (T body time0 -> T body time1) -> T body time0 -> T body time1
forall a b0 b1. (T a b0 -> T a b1) -> T a b0 -> T a b1
Mixed.mapFirstTail ((T body time0 -> T body time1) -> T body time0 -> T body time1)
-> ((T time0 body -> T time1 body) -> T body time0 -> T body time1)
-> (T time0 body -> T time1 body)
-> T body time0
-> T body time1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (T time0 body -> T time1 body) -> T body time0 -> T body time1
forall time0 body0 time1 body1.
(T time0 body0 -> T time1 body1) -> T body0 time0 -> T body1 time1
TimeTimePriv.unlift