-- | Extra utilities for chans. module Control.Concurrent.Chan.Extra (readAvailableChan) where import Control.Concurrent.Chan readAvailableChan :: Chan a -> IO [a] readAvailableChan chan = do v <- readChan chan vs <- rest return (v:vs) where rest = do empty <- isEmptyChan chan if empty then return [] else do v <- readChan chan vs <- rest return (v:vs)