{- |
Copyright   :  (c) Henning Thielemann 2007-2009

Maintainer  :  haskell@henning-thielemann.de
Stability   :  stable
Portability :  Haskell 98
-}
module Data.EventList.Absolute.TimeTimePrivate where

import qualified Data.EventList.Absolute.TimeBodyPrivate as TimeBodyList

import Data.EventList.Absolute.TimeBodyPrivate (($~))

-- 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.Tuple.HT (mapFst, )

import qualified Control.Monad as Monad
import qualified Control.Applicative as Applicative

import Control.Applicative (Applicative, )


newtype T time body = Cons {forall time body. T time body -> T body time
decons :: Uniform.T body time}
   deriving (T time body -> T time body -> Bool
(T time body -> T time body -> Bool)
-> (T time body -> T time body -> Bool) -> Eq (T time body)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall time body.
(Eq time, Eq body) =>
T time body -> T time body -> Bool
$c== :: forall time body.
(Eq time, Eq body) =>
T time body -> T time body -> Bool
== :: T time body -> T time body -> Bool
$c/= :: forall time body.
(Eq time, Eq body) =>
T time body -> T time body -> Bool
/= :: T time body -> T time body -> Bool
Eq, Eq (T time body)
Eq (T time body) =>
(T time body -> T time body -> Ordering)
-> (T time body -> T time body -> Bool)
-> (T time body -> T time body -> Bool)
-> (T time body -> T time body -> Bool)
-> (T time body -> T time body -> Bool)
-> (T time body -> T time body -> T time body)
-> (T time body -> T time body -> T time body)
-> Ord (T time body)
T time body -> T time body -> Bool
T time body -> T time body -> Ordering
T time body -> T time body -> T time body
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall time body. (Ord time, Ord body) => Eq (T time body)
forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> Bool
forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> Ordering
forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> T time body
$ccompare :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> Ordering
compare :: T time body -> T time body -> Ordering
$c< :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> Bool
< :: T time body -> T time body -> Bool
$c<= :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> Bool
<= :: T time body -> T time body -> Bool
$c> :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> Bool
> :: T time body -> T time body -> Bool
$c>= :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> Bool
>= :: T time body -> T time body -> Bool
$cmax :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> T time body
max :: T time body -> T time body -> T time body
$cmin :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> T time body
min :: T time body -> T time body -> T time body
Ord, Int -> T time body -> ShowS
[T time body] -> ShowS
T time body -> String
(Int -> T time body -> ShowS)
-> (T time body -> String)
-> ([T time body] -> ShowS)
-> Show (T time body)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall time body.
(Show body, Show time) =>
Int -> T time body -> ShowS
forall time body. (Show body, Show time) => [T time body] -> ShowS
forall time body. (Show body, Show time) => T time body -> String
$cshowsPrec :: forall time body.
(Show body, Show time) =>
Int -> T time body -> ShowS
showsPrec :: Int -> T time body -> ShowS
$cshow :: forall time body. (Show body, Show time) => T time body -> String
show :: T time body -> String
$cshowList :: forall time body. (Show body, Show time) => [T time body] -> ShowS
showList :: [T time body] -> ShowS
Show)

infixl 5 $*

($*) :: (Uniform.T body time -> a) -> (T time body -> a)
$* :: forall body time a. (T body time -> a) -> T time body -> a
($*) T body time -> a
f = T body time -> a
f (T body time -> a)
-> (T time body -> T body time) -> T time body -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T body time
forall time body. T time body -> T body time
decons


lift ::
   (Uniform.T body0 time0 -> Uniform.T body1 time1) ->
   (T time0 body0 -> T time1 body1)
lift :: forall body0 time0 body1 time1.
(T body0 time0 -> T body1 time1) -> T time0 body0 -> T time1 body1
lift T body0 time0 -> T body1 time1
f = T body1 time1 -> T time1 body1
forall time body. T body time -> T time body
Cons (T body1 time1 -> T time1 body1)
-> (T time0 body0 -> T body1 time1)
-> T time0 body0
-> T time1 body1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T body0 time0 -> T body1 time1
f (T body0 time0 -> T body1 time1)
-> (T time0 body0 -> T body0 time0)
-> T time0 body0
-> T body1 time1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> T body0 time0
forall time body. T time body -> T body time
decons

liftA :: Applicative m =>
   (Uniform.T body0 time0 -> m (Uniform.T body1 time1)) ->
   (T time0 body0 -> m (T time1 body1))
liftA :: forall (m :: * -> *) body0 time0 body1 time1.
Applicative m =>
(T body0 time0 -> m (T body1 time1))
-> T time0 body0 -> m (T time1 body1)
liftA T body0 time0 -> m (T body1 time1)
f = (T body1 time1 -> T time1 body1)
-> m (T body1 time1) -> m (T time1 body1)
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
Applicative.liftA T body1 time1 -> T time1 body1
forall time body. T body time -> T time body
Cons (m (T body1 time1) -> m (T time1 body1))
-> (T time0 body0 -> m (T body1 time1))
-> T time0 body0
-> m (T time1 body1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T body0 time0 -> m (T body1 time1)
f (T body0 time0 -> m (T body1 time1))
-> (T time0 body0 -> T body0 time0)
-> T time0 body0
-> m (T body1 time1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> T body0 time0
forall time body. T time body -> T body time
decons

liftM :: Monad m =>
   (Uniform.T body0 time0 -> m (Uniform.T body1 time1)) ->
   (T time0 body0 -> m (T time1 body1))
liftM :: forall (m :: * -> *) body0 time0 body1 time1.
Monad m =>
(T body0 time0 -> m (T body1 time1))
-> T time0 body0 -> m (T time1 body1)
liftM T body0 time0 -> m (T body1 time1)
f = (T body1 time1 -> T time1 body1)
-> m (T body1 time1) -> m (T time1 body1)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
Monad.liftM T body1 time1 -> T time1 body1
forall time body. T body time -> T time body
Cons (m (T body1 time1) -> m (T time1 body1))
-> (T time0 body0 -> m (T body1 time1))
-> T time0 body0
-> m (T time1 body1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T body0 time0 -> m (T body1 time1)
f (T body0 time0 -> m (T body1 time1))
-> (T time0 body0 -> T body0 time0)
-> T time0 body0
-> m (T body1 time1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> T body0 time0
forall time body. T time body -> T body time
decons


snocBody :: T time body -> body -> TimeBodyList.T time body
snocBody :: forall time body. T time body -> body -> T time body
snocBody T time body
xs =
   T time body -> T time body
forall time body. T time body -> T time body
TimeBodyList.Cons (T time body -> T time body)
-> (body -> T time body) -> body -> T time body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (T body time -> body -> T time body
forall a b. T a b -> a -> T b a
Mixed.snocFirst (T body time -> body -> T time body)
-> T time body -> body -> T time body
forall body time a. (T body time -> a) -> T time body -> a
$* T time body
xs)

snocTime :: TimeBodyList.T time body -> time -> T time body
snocTime :: forall time body. T time body -> time -> T time body
snocTime T time body
xs =
   T body time -> T time body
forall time body. T body time -> T time body
Cons (T body time -> T time body)
-> (time -> T body time) -> time -> T time body
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (T time body -> time -> T body time
forall b a. T b a -> b -> T a b
Mixed.snocSecond (T time body -> time -> T body time)
-> T time body -> time -> T body time
forall time body a. (T time body -> a) -> T time body -> a
$~ T time body
xs)


viewTimeR :: T time body -> (TimeBodyList.T time body, time)
viewTimeR :: forall time body. T time body -> (T time body, time)
viewTimeR =
   (T time body -> T time body)
-> (T time body, time) -> (T time body, time)
forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst T time body -> T time body
forall time body. T time body -> T time body
TimeBodyList.Cons ((T time body, time) -> (T time body, time))
-> (T time body -> (T time body, time))
-> T time body
-> (T time body, time)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T body time -> (T time body, time)
forall a b. T a b -> (T b a, b)
Mixed.viewSecondR (T body time -> (T time body, time))
-> (T time body -> T body time)
-> T time body
-> (T time body, time)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T body time
forall time body. T time body -> T body time
decons

viewBodyR :: TimeBodyList.T time body -> Maybe (T time body, body)
viewBodyR :: forall time body. T time body -> Maybe (T time body, body)
viewBodyR =
   ((T body time, body) -> (T time body, body))
-> Maybe (T body time, body) -> Maybe (T time body, body)
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((T body time -> T time body)
-> (T body time, body) -> (T time body, body)
forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst T body time -> T time body
forall time body. T body time -> T time body
Cons) (Maybe (T body time, body) -> Maybe (T time body, body))
-> (T time body -> Maybe (T body time, body))
-> T time body
-> Maybe (T time body, body)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> Maybe (T body time, body)
forall b a. T b a -> Maybe (T a b, a)
Mixed.viewFirstR (T time body -> Maybe (T body time, body))
-> (T time body -> T time body)
-> T time body
-> Maybe (T body 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
TimeBodyList.decons


{-# INLINE switchTimeR #-}
switchTimeR :: (TimeBodyList.T time body -> time -> a) -> T time body -> a
switchTimeR :: forall time body a. (T time body -> time -> a) -> T time body -> a
switchTimeR T time body -> time -> a
f =
   (T time body -> time -> a) -> T body time -> a
forall b a c. (T b a -> b -> c) -> T a b -> c
Mixed.switchSecondR (T time body -> time -> a
f (T time body -> time -> a)
-> (T time body -> T time body) -> T time body -> time -> 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
TimeBodyList.Cons) (T body time -> a)
-> (T time body -> T body time) -> T time body -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body -> T body time
forall time body. T time body -> T body time
decons

{-# INLINE switchBodyR #-}
switchBodyR :: a -> (T time body -> body -> a) -> TimeBodyList.T time body -> a
switchBodyR :: forall a time body.
a -> (T time body -> body -> a) -> T time body -> a
switchBodyR a
f T time body -> body -> a
g =
   a -> (T body time -> body -> a) -> T time body -> a
forall c a b. c -> (T a b -> a -> c) -> T b a -> c
Mixed.switchFirstR a
f (T time body -> body -> a
g (T time body -> body -> a)
-> (T body time -> T time body) -> T body time -> body -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T body time -> T time body
forall time body. T body time -> T time body
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
TimeBodyList.decons


mapTimeInit ::
   (TimeBodyList.T time body0 -> TimeBodyList.T time body1) ->
   T time body0 -> T time body1
mapTimeInit :: forall time body0 body1.
(T time body0 -> T time body1) -> T time body0 -> T time body1
mapTimeInit T time body0 -> T time body1
f = (T time body1 -> time -> T time body1)
-> (T time body1, time) -> T time body1
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry T time body1 -> time -> T time body1
forall time body. T time body -> time -> T time body
snocTime ((T time body1, time) -> T time body1)
-> (T time body0 -> (T time body1, time))
-> T time body0
-> T time body1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (T time body0 -> T time body1)
-> (T time body0, time) -> (T time body1, time)
forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst T time body0 -> T time body1
f ((T time body0, time) -> (T time body1, time))
-> (T time body0 -> (T time body0, time))
-> T time body0
-> (T time body1, time)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time body0 -> (T time body0, time)
forall time body. T time body -> (T time body, time)
viewTimeR