module Data.EventList.Relative.BodyBodyPrivate where
import qualified Data.AlternatingList.List.Uniform as Uniform
import qualified Control.Monad as Monad
import qualified Data.Foldable as Fold
import qualified Data.Traversable as Trav
import qualified Control.Applicative as App
import Test.QuickCheck (Arbitrary(arbitrary, shrink))
newtype T time body = Cons {forall time body. T time body -> T time body
decons :: Uniform.T time body}
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 body, Eq time) =>
T time body -> T time body -> Bool
$c== :: forall time body.
(Eq body, Eq time) =>
T time body -> T time body -> Bool
== :: T time body -> T time body -> Bool
$c/= :: forall time body.
(Eq body, Eq time) =>
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 body, Ord time) => Eq (T time body)
forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> Bool
forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> Ordering
forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> T time body
$ccompare :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> Ordering
compare :: T time body -> T time body -> Ordering
$c< :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> Bool
< :: T time body -> T time body -> Bool
$c<= :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> Bool
<= :: T time body -> T time body -> Bool
$c> :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> Bool
> :: T time body -> T time body -> Bool
$c>= :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> Bool
>= :: T time body -> T time body -> Bool
$cmax :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> T time body
max :: T time body -> T time body -> T time body
$cmin :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> T time body
min :: T time body -> T time body -> T time body
Ord)
instance (Show time, Show body) => Show (T time body) where
showsPrec :: Int -> T time body -> ShowS
showsPrec Int
p = String -> String -> Int -> T time body -> ShowS
forall a b.
(Show a, Show b) =>
String -> String -> Int -> T a b -> ShowS
Uniform.format String
" /. " String
" ./ " Int
p (T time body -> ShowS)
-> (T time body -> T time body) -> T time body -> ShowS
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
decons
instance (Arbitrary time, Arbitrary body) =>
Arbitrary (T time body) where
arbitrary :: Gen (T time body)
arbitrary = (T time body -> T time body)
-> Gen (T time body) -> Gen (T time body)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
Monad.liftM T time body -> T time body
forall time body. T time body -> T time body
Cons Gen (T time body)
forall a. Arbitrary a => Gen a
arbitrary
shrink :: T time body -> [T time body]
shrink = (T time body -> [T time body]) -> T time body -> [T time body]
forall (m :: * -> *) time0 body0 time1 body1.
Monad m =>
(T time0 body0 -> m (T time1 body1))
-> T time0 body0 -> m (T time1 body1)
liftM T time body -> [T time body]
forall a. Arbitrary a => a -> [a]
shrink
instance Functor (T time) where
fmap :: forall a b. (a -> b) -> T time a -> T time b
fmap a -> b
f (Cons T time a
x) = T time b -> T time b
forall time body. T time body -> T time body
Cons ((a -> b) -> T time a -> T time b
forall b0 b1 a. (b0 -> b1) -> T a b0 -> T a b1
Uniform.mapSecond a -> b
f T time a
x)
instance Fold.Foldable (T time) where
foldMap :: forall m a. Monoid m => (a -> m) -> T time a -> m
foldMap = (a -> m) -> T time a -> m
forall (t :: * -> *) m a.
(Traversable t, Monoid m) =>
(a -> m) -> t a -> m
Trav.foldMapDefault
instance Trav.Traversable (T time) where
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> T time a -> f (T time b)
traverse a -> f b
f =
(T time b -> T time b) -> f (T time b) -> f (T time b)
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
App.liftA T time b -> T time b
forall time body. T time body -> T time body
Cons (f (T time b) -> f (T time b))
-> (T time a -> f (T time b)) -> T time a -> f (T time b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (time -> f time) -> (a -> f b) -> T time a -> f (T time b)
forall (m :: * -> *) a0 a1 b0 b1.
Applicative m =>
(a0 -> m a1) -> (b0 -> m b1) -> T a0 b0 -> m (T a1 b1)
Uniform.traverse time -> f time
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
App.pure a -> f b
f (T time a -> f (T time b))
-> (T time a -> T time a) -> T time a -> f (T time b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time a -> T time a
forall time body. T time body -> T time body
decons
infixl 5 $**
($**) :: (Uniform.T time body -> a) -> (T time body -> a)
$** :: forall time body a. (T time body -> a) -> T time body -> a
($**) T time body -> a
f = T time body -> a
f (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
decons
lift ::
(Uniform.T time0 body0 -> Uniform.T time1 body1) ->
(T time0 body0 -> T time1 body1)
lift :: forall time0 body0 time1 body1.
(T time0 body0 -> T time1 body1) -> T time0 body0 -> T time1 body1
lift T time0 body0 -> T time1 body1
f = T time1 body1 -> T time1 body1
forall time body. T time body -> T time body
Cons (T time1 body1 -> T time1 body1)
-> (T time0 body0 -> T time1 body1)
-> T time0 body0
-> T time1 body1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> T time1 body1
f (T time0 body0 -> T time1 body1)
-> (T time0 body0 -> T time0 body0)
-> T time0 body0
-> T time1 body1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> T time0 body0
forall time body. T time body -> T time body
decons
liftM :: Monad m =>
(Uniform.T time0 body0 -> m (Uniform.T time1 body1)) ->
(T time0 body0 -> m (T time1 body1))
liftM :: forall (m :: * -> *) time0 body0 time1 body1.
Monad m =>
(T time0 body0 -> m (T time1 body1))
-> T time0 body0 -> m (T time1 body1)
liftM T time0 body0 -> m (T time1 body1)
f = (T time1 body1 -> T time1 body1)
-> m (T time1 body1) -> m (T time1 body1)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
Monad.liftM T time1 body1 -> T time1 body1
forall time body. T time body -> T time body
Cons (m (T time1 body1) -> m (T time1 body1))
-> (T time0 body0 -> m (T time1 body1))
-> T time0 body0
-> m (T time1 body1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> m (T time1 body1)
f (T time0 body0 -> m (T time1 body1))
-> (T time0 body0 -> T time0 body0)
-> T time0 body0
-> m (T time1 body1)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> T time0 body0
forall time body. T time body -> T time body
decons
unlift ::
(T time0 body0 -> T time1 body1) ->
(Uniform.T time0 body0 -> Uniform.T time1 body1)
unlift :: forall time0 body0 time1 body1.
(T time0 body0 -> T time1 body1) -> T time0 body0 -> T time1 body1
unlift T time0 body0 -> T time1 body1
f = T time1 body1 -> T time1 body1
forall time body. T time body -> T time body
decons (T time1 body1 -> T time1 body1)
-> (T time0 body0 -> T time1 body1)
-> T time0 body0
-> T time1 body1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> T time1 body1
f (T time0 body0 -> T time1 body1)
-> (T time0 body0 -> T time0 body0)
-> T time0 body0
-> T time1 body1
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> T time0 body0
forall time body. T time body -> T time body
Cons