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.
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. –
In realtà, penso che fare "IO" sia l'unica cosa in cui è importante semanticamente. –
Penso che 'fmap (traverse (clone> => build)) :: Event [Project] -> Event (IO())' lo farebbe, no? –