{- |
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.MixedBody
   (consBody, consTime, (/.), (./), empty,
    viewTimeL,   viewBodyL,
    switchTimeL, switchBodyL,
    mapTimeL, mapTimeHead, mapTimeTail,
   ) where

import Data.EventList.Relative.TimeBody (empty)

import qualified Data.EventList.Relative.TimeBody as TimeBodyList
import qualified Data.EventList.Relative.BodyBody as BodyBodyList

import qualified Data.EventList.Relative.TimeBodyPrivate as TimeBodyPriv
import qualified Data.EventList.Relative.BodyBodyPrivate as BodyBodyPriv

import Data.EventList.Relative.TimeBodyPrivate (mapTimeL, mapTimeHead, mapTimeTail,)

-- 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, )


consBody, (./) :: body -> TimeBodyList.T time body -> BodyBodyList.T time body
consBody :: forall body time. body -> T time body -> T time body
consBody body
b = T time body -> T time body
forall time body. T time body -> T time body
BodyBodyPriv.Cons (T time body -> T time body)
-> (T time body -> T time body) -> T time body -> T time body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. body -> T time body -> T time body
forall b a. b -> T a b -> T a b
Mixed.consSecond body
b (T time body -> T time body)
-> (T time body -> T time body) -> T time body -> T time body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T time body
forall time body. T time body -> T time body
TimeBodyPriv.decons

consTime, (/.) :: time -> BodyBodyList.T time body -> TimeBodyList.T time body
consTime :: forall time body. time -> T time body -> T time body
consTime time
t = T time body -> T time body
forall time body. T time body -> T time body
TimeBodyPriv.Cons (T time body -> T time body)
-> (T time body -> T time body) -> T time body -> T time body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. time -> T time body -> T time body
forall a b. a -> T a b -> T a b
Mixed.consFirst time
t (T time body -> T time body)
-> (T time body -> T time body) -> T time body -> T time body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T time body
forall time body. T time body -> T time body
BodyBodyPriv.decons

infixr 5 /. , ./

./ :: 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

/. :: 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

viewTimeL :: TimeBodyList.T time body -> Maybe (time, BodyBodyList.T time body)
viewTimeL :: forall time body. T time body -> Maybe (time, T time body)
viewTimeL =
   ((time, T time body) -> (time, T time body))
-> Maybe (time, T time body) -> Maybe (time, T time body)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((T time body -> T time body)
-> (time, T time body) -> (time, T time body)
forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd T time body -> T time body
forall time body. T time body -> T time body
BodyBodyPriv.Cons) (Maybe (time, T time body) -> Maybe (time, T time body))
-> (T time body -> Maybe (time, T time body))
-> T time body
-> Maybe (time, T time body)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> Maybe (time, T time body)
forall a b. T a b -> Maybe (a, T a b)
Mixed.viewFirstL (T time body -> Maybe (time, T time body))
-> (T time body -> T time body)
-> T time body
-> Maybe (time, T time body)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T time body
forall time body. T time body -> T time body
TimeBodyPriv.decons

viewBodyL :: BodyBodyList.T time body -> (body, TimeBodyList.T time body)
viewBodyL :: forall time body. T time body -> (body, T time body)
viewBodyL = (T time body -> T time body)
-> (body, T time body) -> (body, T time body)
forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd T time body -> T time body
forall time body. T time body -> T time body
TimeBodyPriv.Cons ((body, T time body) -> (body, T time body))
-> (T time body -> (body, T time body))
-> T time body
-> (body, T time body)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> (body, T time body)
forall a b. T a b -> (b, T a b)
Mixed.viewSecondL (T time body -> (body, T time body))
-> (T time body -> T time body)
-> T time body
-> (body, T time body)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T time body
forall time body. T time body -> T time body
BodyBodyPriv.decons


{-# INLINE switchTimeL #-}
switchTimeL :: a -> (time -> BodyBodyList.T time body -> a) -> TimeBodyList.T time body -> a
switchTimeL :: forall a time body.
a -> (time -> T time body -> a) -> T time body -> a
switchTimeL a
f time -> T time body -> a
g =
   a -> (time -> T time body -> a) -> T time body -> a
forall c a b. c -> (a -> T a b -> c) -> T a b -> c
Mixed.switchFirstL a
f (\time
t -> time -> T time body -> a
g time
t (T time body -> a)
-> (T time body -> T time body) -> T time body -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T time body
forall time body. T time body -> T time body
BodyBodyPriv.Cons) (T time body -> a)
-> (T time body -> T time body) -> T time body -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T time body
forall time body. T time body -> T time body
TimeBodyPriv.decons

{-# INLINE switchBodyL #-}
switchBodyL :: (body -> TimeBodyList.T time body -> a) -> BodyBodyList.T time body -> a
switchBodyL :: forall body time a. (body -> T time body -> a) -> T time body -> a
switchBodyL body -> T time body -> a
f =
   (body -> T time body -> a) -> T time body -> a
forall b a c. (b -> T a b -> c) -> T a b -> c
Mixed.switchSecondL (\body
b -> body -> T time body -> a
f body
b (T time body -> a)
-> (T time body -> T time body) -> T time body -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T time body
forall time body. T time body -> T time body
TimeBodyPriv.Cons) (T time body -> a)
-> (T time body -> T time body) -> T time body -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T time body
forall time body. T time body -> T time body
BodyBodyPriv.decons