module Simulation.Aivika.Channel
(
Channel(..),
delayChannel,
delayChannelM,
sinkSignal,
traceChannel) where
import qualified Control.Category as C
import Control.Monad
import Simulation.Aivika.Simulation
import Simulation.Aivika.Dynamics
import Simulation.Aivika.Event
import Simulation.Aivika.Signal
import Simulation.Aivika.Composite
newtype Channel a b =
Channel { forall a b. Channel a b -> Signal a -> Composite (Signal b)
runChannel :: Signal a -> Composite (Signal b)
}
instance C.Category Channel where
id :: forall a. Channel a a
id = forall a b. (Signal a -> Composite (Signal b)) -> Channel a b
Channel forall (m :: * -> *) a. Monad m => a -> m a
return
(Channel Signal b -> Composite (Signal c)
g) . :: forall b c a. Channel b c -> Channel a b -> Channel a c
. (Channel Signal a -> Composite (Signal b)
f) =
forall a b. (Signal a -> Composite (Signal b)) -> Channel a b
Channel forall a b. (a -> b) -> a -> b
$ \Signal a
a -> Signal a -> Composite (Signal b)
f Signal a
a forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Signal b -> Composite (Signal c)
g
delayChannel :: Double
-> Channel a a
delayChannel :: forall a. Double -> Channel a a
delayChannel Double
delay =
forall a b. (Signal a -> Composite (Signal b)) -> Channel a b
Channel forall a b. (a -> b) -> a -> b
$ \Signal a
a -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. Double -> Signal a -> Signal a
delaySignal Double
delay Signal a
a
delayChannelM :: Event Double
-> Channel a a
delayChannelM :: forall a. Event Double -> Channel a a
delayChannelM Event Double
delay =
forall a b. (Signal a -> Composite (Signal b)) -> Channel a b
Channel forall a b. (a -> b) -> a -> b
$ \Signal a
a -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ forall a. Event Double -> Signal a -> Signal a
delaySignalM Event Double
delay Signal a
a
sinkSignal :: Signal a -> Composite ()
sinkSignal :: forall a. Signal a -> Composite ()
sinkSignal Signal a
a =
do DisposableEvent
h <- forall (m :: * -> *) a. EventLift m => Event a -> m a
liftEvent forall a b. (a -> b) -> a -> b
$
forall a. Signal a -> (a -> Event ()) -> Event DisposableEvent
handleSignal Signal a
a forall a b. (a -> b) -> a -> b
$
forall a b. a -> b -> a
const forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) a. Monad m => a -> m a
return ()
DisposableEvent -> Composite ()
disposableComposite DisposableEvent
h
traceChannel :: String -> Channel a b -> Channel a b
traceChannel :: forall a b. String -> Channel a b -> Channel a b
traceChannel String
message (Channel Signal a -> Composite (Signal b)
f) =
forall a b. (Signal a -> Composite (Signal b)) -> Channel a b
Channel forall a b. (a -> b) -> a -> b
$ \Signal a
a ->
do Signal b
b <- Signal a -> Composite (Signal b)
f Signal a
a
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$
forall a. String -> Signal a -> Signal a
traceSignal String
message Signal b
b