Using these stubs for Event and pollEvent
data Event = NoEvent | SomeEvent deriving (Show,Eq) instance Random Event where randomIO = randomRIO (0,1) >>= return . ([NoEvent,SomeEvent] !!) pollEvent :: IO Event pollEvent = randomIO
and a combinator, borrowed and adapted from an earlier answer, that stops evaluating the first time the predicate fails
spanM :: (Monad m) => (a -> Bool) -> m a -> m [a] spanM p a = do x <- a if p x then do xs <- spanM p a return (x:xs) else return [x]
allows this ghci session, for example:
*Main> spanM (/= NoEvent) pollEvent [SomeEvent,SomeEvent,NoEvent]