module Control.Etage.Propagate (
propagate
) where
import Control.Monad
import Data.Typeable
import Control.Etage.Internals
import Control.Etage.Externals
data PropagateNeuron from for = PropagateNeuron (PropagateOptions from for) deriving (Typeable)
type PropagateOptions from for = NeuronOptions (PropagateNeuron from for)
instance (Impulse from, Impulse for) => Neuron (PropagateNeuron from for) where
type NeuronFromImpulse (PropagateNeuron from for) = from
type NeuronForImpulse (PropagateNeuron from for) = for
data NeuronOptions (PropagateNeuron from for) = PropagateOptions {
for ::[TranslatableFor for]
}
mkDefaultOptions = return PropagateOptions {
for = undefined
}
grow options = return $ PropagateNeuron options
live nerve (PropagateNeuron PropagateOptions { for }) = forever $ do
i <- getForNeuron nerve
mapM_ (\(TranslatableFor n) -> translateAndSend n i) for
propagate :: forall from for forConductivity. (Impulse from, Impulse for) => Nerve from AxonConductive for forConductivity -> [TranslatableFor from] -> IO ()
propagate _ [] = return ()
propagate from for = do
_ <- attach (\o -> o { for } :: NeuronOptions (PropagateNeuron for from)) (cross from)
return ()