2014-09-29 9 views
7

Esiste qualcosa come la funzione reactive-bananasunion in elerea?Come unisco due o più segnali in elerea?

union :: Signal a -> Signal a -> Signal a 

Ciò consente di unire i due segnali in un unico flusso. Idealmente mi sto cercando un'unione efficiente di un gran numero (14k) di segnali:

unions :: [Signal a] -> Signal a 

Non sembra essere nulla nella documentazione, né v'è nulla che io possa riconoscere come un blocco di costruzione Perciò .


Edit: eccetto forse per questo:

unionSignal :: a -> Signal a -> Signal a -> SignalGen p (Signal a) 
unionSignal initial a b = do 
    (s,f) <- execute $ external initial 
    _ <- effectful1 f a 
    _ <- effectful1 f b 
    return s 

Ma ... che è solo brutto e non cattura l'idea di union.

risposta

4

Non c'è niente come union per il segnale di Elerea a causa di come viene modellata una rete elerea. Un segnale elerea contiene esattamente un valore per ogni fase, quindi non esiste un modo sensato per combinare valori arbitrari allo stesso tempo. Tuttavia, esistono diversi modi per combinare i segnali, a seconda di come i valori devono essere combinati.

unions :: [Signal a] -> Signal [a] 
unions = sequence -- or Data.Traversable.sequenceA 

o si può piegare direttamente sopra gli ingressi

foldS :: (a -> b -> b) -> b -> [Signal a] -> Signal b 
foldS f b signals = foldr (\signal acc -> f <$> signal <*> acc) (return b) signals 
-- I think a right fold is more efficient, but it depends on elerea's internals and I'm not sure 

Se in realtà non interessa il valore e desidera solo per assicurarsi che il segnale viene attivato, è possibile utilizzare

unions_ :: [Signal a] -> Signal() 
unions_ = sequence_ 
Problemi correlati