module HaskellWorks.Control.Monad.Lazy
  ( interleaveSequenceIO
  , interleaveSequenceM
  ) where

import Control.Monad.IO.Unlift

import qualified System.IO.Unsafe as IO

interleaveSequenceIO :: [IO a] -> IO [a]
interleaveSequenceIO []       = return []
interleaveSequenceIO (fa:fas) = do
  a <- fa
  as <- IO.unsafeInterleaveIO (interleaveSequenceIO fas)
  return (a:as)

interleaveSequenceM :: MonadUnliftIO m => [m a] -> m [a]
interleaveSequenceM as = do
  f <- askUnliftIO
  liftIO $ interleaveSequenceIO (fmap (unliftIO f) as)