{- |
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 = forall time body. T time body -> T time body
BodyBodyPriv.Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b a. b -> T a b -> T a b
Mixed.consSecond body
b forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall time body. T time body -> T time body
TimeBodyPriv.Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. a -> T a b -> T a b
Mixed.consFirst time
t forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T time body -> T time body
BodyBodyPriv.decons

infixr 5 /. , ./

./ :: forall body time. 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
(/.) = 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 =
   forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd forall time body. T time body -> T time body
BodyBodyPriv.Cons) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. T a b -> Maybe (a, T a b)
Mixed.viewFirstL forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall b c a. (b -> c) -> (a, b) -> (a, c)
mapSnd forall time body. T time body -> T time body
TimeBodyPriv.Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. T a b -> (b, T a b)
Mixed.viewSecondL forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 =
   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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T time body -> T time body
BodyBodyPriv.Cons) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 =
   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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T time body -> T time body
TimeBodyPriv.Cons) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T time body -> T time body
BodyBodyPriv.decons