diff --git a/hlint.cabal b/hlint.cabal
--- a/hlint.cabal
+++ b/hlint.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.6
 build-type:         Simple
 name:               hlint
-version:            1.6
+version:            1.6.1
 license:            GPL
 license-file:       LICENSE
 category:           Development
@@ -44,6 +44,7 @@
         Type
         Test
         Util
+        Parallel
         HSE.All
         HSE.Bracket
         HSE.Evaluate
diff --git a/src/Parallel.hs b/src/Parallel.hs
new file mode 100644
--- /dev/null
+++ b/src/Parallel.hs
@@ -0,0 +1,37 @@
+
+module Parallel(parallel) where
+
+import System.IO.Unsafe(unsafeInterleaveIO)
+import GHC.Conc(numCapabilities)
+import Control.Concurrent
+import Control.Monad
+
+
+parallel :: [IO a] -> IO [a]
+parallel = if numCapabilities <= 1 then parallel1 else parallelN
+
+
+parallel1 :: [IO a] -> IO [a]
+parallel1 [] = return []
+parallel1 (x:xs) = do
+    x2 <- x
+    xs2 <- unsafeInterleaveIO $ parallel1 xs
+    return $ x2:xs2
+
+
+parallelN :: [IO a] -> IO [a]
+parallelN xs = do
+    ms <- mapM (const newEmptyMVar) xs
+    chan <- newChan
+    mapM (writeChan chan . Just) $ zip ms xs
+    replicateM_ numCapabilities (writeChan chan Nothing >> forkIO (f chan))
+    parallel1 $ map takeMVar ms
+    where
+        f chan = do
+            v <- readChan chan
+            case v of
+                Nothing -> return ()
+                Just (m,x) -> do
+                    x' <- x
+                    putMVar m x'
+                    f chan
