Я ищу что-то вроде flatten :: Event [a] -> Event a
(поменяйте местами []
на Foldable f => f
, если хотите), которое будет генерировать отдельное событие для каждого a
в списке Event
, например split
в старой версии sodium
.
Я подозреваю, что это как-то возможно с switchE
, но тогда мне понадобилась бы функция типа [a] -> Event a
.
Я мог бы сделать это сам с помощью newEvent
, но есть ли встроенная функция в reactive-banana
?
Изменить:
На самом деле, я не уверен, что смогу реализовать это с помощью newEvent
.
flatten :: Foldable f => f a -> Banana.MomentIO (Banana.Event a)
flatten xs = do
(event, fire) <- Banana.newEvent
liftIO $ forkIO $ mapM_ fire xs
return event
Будет ли fire
блокироваться до тех пор, пока не появятся подписчики, или сразу вернется, если их нет?
Редактировать 2:
Глядя на реализации newAddHandler
моя реализация выше не будет работать, потому что все события, возможно, запускаются до того, как какие-либо обработчики смогут зарегистрироваться.