2016-04-29 19 views
6

Sto cercando qualcosa di simile flatten :: Event [a] -> Event a (swap [] con Foldable f => f se volete) che genererebbe un evento separato per ogni a in un Event L 'elenco, come split in an old version of sodium.ricerca di `appiattire :: Evento [a] -> a` Evento in reattiva Banana

Ho il sospetto che questo sia in qualche modo possibile con switchE, ma poi avrei bisogno di una funzione di tipo [a] -> Event a.

Probabilmente potrei realizzarlo da solo con newEvent, ma è presente una funzione integrata in reactive-banana?

Edit:

In realtà, io non sono così sicuro di poter attuare tale con newEvent dopo tutto.

flatten :: Foldable f => f a -> Banana.MomentIO (Banana.Event a) 
flatten xs = do 
    (event, fire) <- Banana.newEvent 
    liftIO $ forkIO $ mapM_ fire xs 
    return event 

Will fire blocco fino a quando non ci sono abbonati o saranno semplicemente restituire immediatamente se non ce ne sono?

Edit 2:

Guardando il implementation of newAddHandler mia implementazione di cui sopra non funzionerà, perché tutti gli eventi sono forse sparati prima di eventuali gestori possono registrarsi.

risposta

6

Questo sembra essere impossibile. Secondo the notes in Heinrich Apfelmus's blog, Event non supporta occorrenze simultanee. Questo è un cambiamento relativamente recente; il post è datato agosto dell'anno scorso e v1.0 è stato rilasciato a ottobre. Certamente non è stato il caso in cui originariamente ho imparato Reactive Banana alcuni anni fa.

Ma Event [a] sembra un modo ragionevole per rappresentare un insieme di eventi casuali in primo luogo. Perché hai bisogno di appiattirlo?

+0

Voglio eseguire un'azione 'IO' per ognuno di quei' a's (repository git fetch/clone) e quindi eseguire il codice downstream dopo ognuno (ad esempio, costruire e confrontare il progetto). Preferirei farlo in un 'depth-first' (eseguendo fetch e build consecutivi) piuttosto che in modalità 'ampiezza' (eseguendo tutti i recuperi, quindi eseguendo tutte le build). Ci sono anche altre fonti di eventi che producono singoli 'a's, ma potrei avvolgerlo nelle liste dei singoli, naturalmente. –

+0

In realtà, penso che fare "IO" sia l'unica cosa in cui è importante semanticamente. –

+0

Penso che 'fmap (traverse (clone> => build)) :: Event [Project] -> Event (IO())' lo farebbe, no? –