diff --git a/hw-prim.cabal b/hw-prim.cabal
--- a/hw-prim.cabal
+++ b/hw-prim.cabal
@@ -1,7 +1,7 @@
 cabal-version:  2.2
 
 name:           hw-prim
-version:        0.6.2.29
+version:        0.6.2.30
 synopsis:       Primitive functions and data types
 description:    Primitive functions and data types.
 category:       Data
@@ -42,6 +42,7 @@
 common semigroups           { build-depends: semigroups           >= 0.8.4      && < 0.20   }
 common transformers         { build-depends: transformers         >= 0.4        && < 0.6    }
 common vector               { build-depends: vector               >= 0.12       && < 0.13   }
+common unliftio-core        { build-depends: unliftio-core        >= 0.1.2.0    && < 0.2    }
 
 common common
   default-language:   Haskell2010
@@ -57,8 +58,10 @@
           , mmap
           , semigroups
           , transformers
+          , unliftio-core
           , vector
   exposed-modules:
+    HaskellWorks.Control.Monad.Lazy
     HaskellWorks.Data.AtIndex
     HaskellWorks.Data.Branchless
     HaskellWorks.Data.ByteString
diff --git a/src/HaskellWorks/Control/Monad/Lazy.hs b/src/HaskellWorks/Control/Monad/Lazy.hs
new file mode 100644
--- /dev/null
+++ b/src/HaskellWorks/Control/Monad/Lazy.hs
@@ -0,0 +1,20 @@
+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)
