module Data.EventList.Relative.BodyTimePrivate where
import qualified Data.AlternatingList.List.Disparate as Disp
import qualified Data.AlternatingList.List.Mixed as Mixed
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 Data.Monoid (Monoid, mempty, mappend, )
import Data.Semigroup (Semigroup, (<>), )
import Test.QuickCheck (Arbitrary(arbitrary, shrink))
newtype T time body = Cons {forall time body. T time body -> T body time
decons :: Disp.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 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
$c== :: forall time body.
(Eq body, Eq time) =>
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 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
min :: 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
max :: T time body -> T time body -> T time body
$cmax :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> T time body
>= :: 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
$c< :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> Bool
compare :: T time body -> T time body -> Ordering
$ccompare :: forall time body.
(Ord body, Ord time) =>
T time body -> T time body -> Ordering
Ord)
instance (Show time, Show body) => Show (T time body) where
showsPrec :: Int -> T time body -> ShowS
showsPrec Int
p = forall a b.
(Show a, Show b) =>
String -> String -> Int -> T a b -> ShowS
Disp.format String
" ./ " String
" /. " Int
p forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T time body -> T body time
decons
instance (Arbitrary time, Arbitrary body) =>
Arbitrary (T time body) where
arbitrary :: Gen (T time body)
arbitrary = 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 a. Arbitrary a => Gen a
arbitrary
shrink :: T time body -> [T time body]
shrink = forall (m :: * -> *) body0 time0 body1 time1.
Monad m =>
(T body0 time0 -> m (T body1 time1))
-> T time0 body0 -> m (T time1 body1)
liftM forall a. Arbitrary a => a -> [a]
shrink
instance Semigroup (T time body) where
Cons T body time
x <> :: T time body -> T time body -> T time body
<> Cons T body time
y = forall time body. T body time -> T time body
Cons (forall a b. T a b -> T a b -> T a b
Disp.append T body time
x T body time
y)
instance Monoid (T time body) where
mempty :: T time body
mempty = forall time body. T body time -> T time body
Cons forall a b. T a b
Disp.empty
mappend :: T time body -> T time body -> T time body
mappend = forall a. Semigroup a => a -> a -> a
(<>)
instance Functor (T time) where
fmap :: forall a b. (a -> b) -> T time a -> T time b
fmap a -> b
f (Cons T a time
x) = forall time body. T body time -> T time body
Cons (forall a0 a1 b. (a0 -> a1) -> T a0 b -> T a1 b
Disp.mapFirst a -> b
f T a time
x)
instance Fold.Foldable (T time) where
foldMap :: forall m a. Monoid m => (a -> m) -> T time a -> m
foldMap = 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 =
forall (f :: * -> *) a b. Applicative f => (a -> b) -> f a -> f b
App.liftA forall time body. T body time -> T time body
Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a0 a1 b0 b1.
Applicative m =>
(a0 -> m a1) -> (b0 -> m b1) -> T a0 b0 -> m (T a1 b1)
Disp.traverse a -> f b
f forall (f :: * -> *) a. Applicative f => a -> f a
App.pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T time body -> T body time
decons
infixl 5 $*~
($*~) :: (Disp.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 ::
(Disp.T body0 time0 -> Disp.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 :: App.Applicative m =>
(Disp.T body0 time0 -> m (Disp.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
App.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 =>
(Disp.T body0 time0 -> m (Disp.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
unlift ::
(T time0 body0 -> T time1 body1) ->
(Disp.T body0 time0 -> Disp.T body1 time1)
unlift :: forall time0 body0 time1 body1.
(T time0 body0 -> T time1 body1) -> T body0 time0 -> T body1 time1
unlift T time0 body0 -> T time1 body1
f = forall time body. T time body -> T body time
decons forall b c a. (b -> c) -> (a -> b) -> a -> c
. T time0 body0 -> T time1 body1
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall time body. T body time -> T time body
Cons
concat ::
[T time body] -> T time body
concat :: forall time body. [T time body] -> T time body
concat =
forall time body. T body time -> T time body
Cons forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. [T a b] -> T a b
Disp.concat forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> b) -> [a] -> [b]
map forall time body. T time body -> T body time
decons
cycle ::
T time body -> T time body
cycle :: forall time body. T time body -> T time body
cycle = forall body0 time0 body1 time1.
(T body0 time0 -> T body1 time1) -> T time0 body0 -> T time1 body1
lift forall a b. T a b -> T a b
Disp.cycle
mapTimeLast ::
(time -> time) ->
T time body -> T time body
mapTimeLast :: forall time body. (time -> time) -> T time body -> T time body
mapTimeLast = forall body0 time0 body1 time1.
(T body0 time0 -> T body1 time1) -> T time0 body0 -> T time1 body1
lift forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (a -> a) -> T b a -> T b a
Mixed.mapFirstLast