{- |
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
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
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
$c== :: forall time body.
(Eq time, Eq body) =>
T time body -> T time body -> Bool
Eq, 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
min :: 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
max :: T time body -> T time body -> T time body
$cmax :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> T time body
>= :: 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
$c< :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> Bool
compare :: T time body -> T time body -> Ordering
$ccompare :: forall time body.
(Ord time, Ord body) =>
T time body -> T time body -> Ordering
Ord, Int -> T time body -> ShowS
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
showList :: [T time body] -> ShowS
$cshowList :: forall time body. (Show body, Show time) => [T time body] -> ShowS
show :: T time body -> String
$cshow :: forall time body. (Show body, Show time) => T time body -> String
showsPrec :: Int -> T time body -> ShowS
$cshowsPrec :: forall time body.
(Show body, Show time) =>
Int -> 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 forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall time body. T body time -> T time body
Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. T body0 time0 -> T body1 time1
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
Applicative.liftA forall time body. T body time -> T time body
Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. T body0 time0 -> m (T body1 time1)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
Monad.liftM forall time body. T body time -> T time body
Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. T body0 time0 -> m (T body1 time1)
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 =
   forall time body. T time body -> T time body
TimeBodyList.Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a b. T a b -> a -> T b a
Mixed.snocFirst 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 =
   forall time body. T body time -> T time body
Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall b a. T b a -> b -> T a b
Mixed.snocSecond 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 =
   forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst forall time body. T time body -> T time body
TimeBodyList.Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. T a b -> (T b a, b)
Mixed.viewSecondR forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 =
   forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst forall time body. T body time -> T time body
Cons) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b a. T b a -> Maybe (T a b, a)
Mixed.viewFirstR forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 =
   forall b a c. (T b a -> b -> c) -> T a b -> c
Mixed.switchSecondR (T time body -> time -> a
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T time body -> T time body
TimeBodyList.Cons) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 =
   forall c a b. c -> (T a b -> a -> c) -> T b a -> c
Mixed.switchFirstR a
f (T time body -> body -> a
g forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T body time -> T time body
Cons) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 = forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall time body. T time body -> time -> T time body
snocTime forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a c b. (a -> c) -> (a, b) -> (c, b)
mapFst T time body0 -> T time body1
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T time body -> (T time body, time)
viewTimeR