diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -86,9 +86,10 @@
 
 module Example where
 
-import qualified Data.ByteString.Lazy              as LBS
-import qualified Data.Vector                       as DV
-import qualified HaskellWorks.Data.Dsv.Lazy.Cursor as SVL
+import qualified Data.ByteString.Lazy                   as LBS
+import qualified Data.Vector                            as DV
+import qualified HaskellWorks.Data.Dsv.Lazy.Cursor      as SVL
+import qualified HaskellWorks.Data.Dsv.Lazy.Cursor.Lazy as SVL
 
 example :: IO ()
 example = do
diff --git a/app/App/Commands.hs b/app/App/Commands.hs
--- a/app/App/Commands.hs
+++ b/app/App/Commands.hs
@@ -8,6 +8,8 @@
 import App.Commands.RangeJoin
 import Options.Applicative
 
+{- HLINT ignore "Monoid law, left identity" -}
+
 commands :: Parser (IO ())
 commands = commandsGeneral <|> commandsDebugging
 
diff --git a/app/App/Commands/Generate.hs b/app/App/Commands/Generate.hs
--- a/app/App/Commands/Generate.hs
+++ b/app/App/Commands/Generate.hs
@@ -7,11 +7,11 @@
 
 import Control.Lens
 import Data.Generics.Product.Any
-import Data.List
 import Options.Applicative       hiding (columns)
 
 import qualified App.Commands.Options.Type as Z
 import qualified App.Gen                   as G
+import qualified Data.List                 as L
 import qualified Hedgehog.Gen              as G
 import qualified Hedgehog.Range            as R
 
@@ -29,7 +29,7 @@
 
   csv <- G.sample (G.list (R.singleton rows) (G.list (R.singleton fields) G.field)) :: IO [[String]]
 
-  putStr $ unlines $ map (intercalate "," . map printField) csv
+  putStr $ unlines $ map (L.intercalate "," . map printField) csv
 
   return ()
 
diff --git a/app/App/Commands/QueryLazy.hs b/app/App/Commands/QueryLazy.hs
--- a/app/App/Commands/QueryLazy.hs
+++ b/app/App/Commands/QueryLazy.hs
@@ -16,7 +16,6 @@
 import Control.Monad.IO.Class       (liftIO)
 import Control.Monad.Trans.Resource
 import Data.Generics.Product.Any
-import Data.List
 import Options.Applicative          hiding (columns)
 
 import qualified App.Commands.Options.Type                as Z
@@ -25,6 +24,7 @@
 import qualified Data.ByteString                          as BS
 import qualified Data.ByteString.Builder                  as B
 import qualified Data.ByteString.Lazy                     as LBS
+import qualified Data.List                                as L
 import qualified Data.Vector                              as DV
 import qualified HaskellWorks.Data.Dsv.Lazy.Cursor        as SVL
 import qualified HaskellWorks.Data.Dsv.Lazy.Cursor.Lazy   as SVLL
@@ -32,6 +32,8 @@
 import qualified System.Exit                              as IO
 import qualified System.IO                                as IO
 
+{- HLINT ignore "Reduce duplication" -}
+
 defaultMethod :: String
 defaultMethod = "lazy-traverse"
 
@@ -57,7 +59,7 @@
     forM_ rows $ \row -> do
       let fieldStrings = columnToFieldString row <$> (opts ^.. the @"columns" . each . the @"number")
 
-      liftIO $ B.hPutBuilder hOut $ mconcat (intersperse outDelimiterBuilder fieldStrings) <> B.word8 10
+      liftIO $ B.hPutBuilder hOut $ mconcat (L.intersperse outDelimiterBuilder fieldStrings) <> B.word8 10
 
       return ()
   return ()
@@ -79,7 +81,7 @@
     forM_ rows $ \row -> do
       let fieldStrings = columnToFieldString row <$> (opts ^.. the @"columns" . each . the @"number")
 
-      liftIO $ B.hPutBuilder hOut $ mconcat (intersperse outDelimiterBuilder fieldStrings) <> B.word8 10
+      liftIO $ B.hPutBuilder hOut $ mconcat (L.intersperse outDelimiterBuilder fieldStrings) <> B.word8 10
 
       return ()
   return ()
@@ -102,7 +104,7 @@
     forM_ rows $ \row -> do
       let fieldStrings = fmap B.lazyByteString row
 
-      liftIO $ B.hPutBuilder hOut $ mconcat (intersperse outDelimiterBuilder fieldStrings) <> B.word8 10
+      liftIO $ B.hPutBuilder hOut $ mconcat (L.intersperse outDelimiterBuilder fieldStrings) <> B.word8 10
 
       return ()
   return ()
diff --git a/app/App/Commands/QueryStrict.hs b/app/App/Commands/QueryStrict.hs
--- a/app/App/Commands/QueryStrict.hs
+++ b/app/App/Commands/QueryStrict.hs
@@ -16,13 +16,13 @@
 import Control.Monad.IO.Class       (liftIO)
 import Control.Monad.Trans.Resource
 import Data.Generics.Product.Any
-import Data.List
 import Options.Applicative
 
 import qualified App.Commands.Options.Type           as Z
 import qualified App.IO                              as IO
 import qualified Data.ByteString                     as BS
 import qualified Data.ByteString.Builder             as B
+import qualified Data.List                           as L
 import qualified Data.Vector                         as DV
 import qualified HaskellWorks.Data.Dsv.Strict.Cursor as SVS
 
@@ -41,7 +41,7 @@
     forM_ rows $ \row -> do
       let fieldStrings = columnToFieldString row <$> (opts ^. the @"columns")
 
-      liftIO $ B.hPutBuilder hOut $ mconcat (intersperse outDelimiterBuilder fieldStrings) <> B.word8 10
+      liftIO $ B.hPutBuilder hOut $ mconcat (L.intersperse outDelimiterBuilder fieldStrings) <> B.word8 10
 
       return ()
   return ()
diff --git a/app/App/Commands/RangeJoin.hs b/app/App/Commands/RangeJoin.hs
--- a/app/App/Commands/RangeJoin.hs
+++ b/app/App/Commands/RangeJoin.hs
@@ -16,8 +16,7 @@
 import Control.Monad.IO.Class       (liftIO)
 import Control.Monad.Trans.Resource
 import Data.Generics.Product.Any
-import Data.List
-import Data.Maybe                   (catMaybes)
+import Data.Maybe                   (fromMaybe, mapMaybe)
 import Data.Word
 import Options.Applicative          hiding (columns)
 import Text.Read                    (readMaybe)
@@ -27,6 +26,7 @@
 import qualified App.IO                                 as IO
 import qualified Data.ByteString.Builder                as B
 import qualified Data.ByteString.Lazy                   as LBS
+import qualified Data.List                              as L
 import qualified Data.Text                              as T
 import qualified Data.Text.Encoding                     as T
 import qualified Data.Vector                            as DV
@@ -35,7 +35,7 @@
 
 rangeJoin :: (DV.Vector LBS.ByteString -> DV.Vector LBS.ByteString -> [LBS.ByteString])
   -> Int -> Int -> [DV.Vector LBS.ByteString] -> Int -> Int -> [DV.Vector LBS.ByteString] -> [[LBS.ByteString]]
-rangeJoin f aa az as ba bz bs = rangeJoin' f (catMaybes (fmap (mkEntry aa az) as)) (catMaybes (fmap (mkEntry ba bz) bs))
+rangeJoin f aa az as ba bz bs = rangeJoin' f (mapMaybe (mkEntry aa az) as) (mapMaybe (mkEntry ba bz) bs)
 
 mkEntry :: Int -> Int -> DV.Vector LBS.ByteString -> Maybe (Word32, Word32, DV.Vector LBS.ByteString)
 mkEntry a z v = (,, v) <$> lookupWord32 a v <*> lookupWord32 z v
@@ -50,15 +50,15 @@
   -> [(Word32, Word32, DV.Vector LBS.ByteString)] -> [(Word32, Word32, DV.Vector LBS.ByteString)] -> [[LBS.ByteString]]
 rangeJoin' f ((ua, uz, u):us) ((va, vz, v):vs) = if
   | uz < va   -> ("L":encodeWord32 ua:encodeWord32  uz     :f u e):rangeJoin' f                  us  ((va    , vz, v):vs)
-  | vz < ua   -> ("R":encodeWord32 va:encodeWord32  vz     :f e v):rangeJoin' f ((ua    , uz, u):us) (                vs)
+  | vz < ua   -> ("R":encodeWord32 va:encodeWord32  vz     :f e v):rangeJoin' f ((ua    , uz, u):us)                  vs
   | ua < va   -> ("L":encodeWord32 ua:encodeWord32 (va - 1):f u e):rangeJoin' f ((va    , uz, u):us) ((va    , vz, v):vs)
   | va < ua   -> ("R":encodeWord32 va:encodeWord32 (ua - 1):f e v):rangeJoin' f ((ua    , uz, u):us) ((ua    , vz, v):vs)
   | uz < vz   -> ("B":encodeWord32 ua:encodeWord32  uz     :f u v):rangeJoin' f                  us  ((uz + 1, vz, v):vs)
   | vz < uz   -> ("B":encodeWord32 va:encodeWord32  vz     :f u v):rangeJoin' f ((vz + 1, uz, u):us)                  vs
   | otherwise -> ("B":encodeWord32 va:encodeWord32  vz     :f u v):rangeJoin' f                  us                   vs
   where e = DV.empty
-rangeJoin' f ((ua, uz, _):us) []                = ("L":encodeWord32 ua:encodeWord32 uz:[]):rangeJoin' f us []
-rangeJoin' f []               ((va, vz, _):vs)  = ("R":encodeWord32 va:encodeWord32 vz:[]):rangeJoin' f [] vs
+rangeJoin' f ((ua, uz, _):us) []                = ["L", encodeWord32 ua, encodeWord32 uz]:rangeJoin' f us []
+rangeJoin' f []               ((va, vz, _):vs)  = ["R", encodeWord32 va, encodeWord32 vz]:rangeJoin' f [] vs
 rangeJoin' _ []               []                = []
 
 encodeWord32 :: Word32 -> LBS.ByteString
@@ -67,8 +67,8 @@
 mkColumnSelector :: [Z.RangeJoinColumn] -> DV.Vector LBS.ByteString -> DV.Vector LBS.ByteString -> [LBS.ByteString]
 mkColumnSelector []     _ _ = []
 mkColumnSelector (c:cs) u v = case c of
-  Z.LtColumn n -> (maybe "" id (u DV.!? n)):mkColumnSelector cs u v
-  Z.RtColumn n -> (maybe "" id (v DV.!? n)):mkColumnSelector cs u v
+  Z.LtColumn n -> fromMaybe "" (u DV.!? n):mkColumnSelector cs u v
+  Z.RtColumn n -> fromMaybe "" (v DV.!? n):mkColumnSelector cs u v
 
 runRangeJoin :: Z.RangeJoinOptions -> IO ()
 runRangeJoin opts = do
@@ -95,7 +95,7 @@
     (_, hOut) <- IO.openOutputFile outputFilePath Nothing
     let outLbsss  = rangeJoin columnSelector input1StartColumn input1StopColumn rows1 input2StartColumn input2StopColumn rows2
     let outBss    = fmap (fmap B.lazyByteString) outLbsss
-    let outB      = mconcat (intersperse outNewlineBuilder (fmap (mconcat . intersperse outDelimiterBuilder) outBss))
+    let outB      = mconcat (L.intersperse outNewlineBuilder (fmap (mconcat . L.intersperse outDelimiterBuilder) outBss))
     liftIO $ B.hPutBuilder hOut outB
   return ()
 
diff --git a/app/App/Data/ColumnDesc.hs b/app/App/Data/ColumnDesc.hs
--- a/app/App/Data/ColumnDesc.hs
+++ b/app/App/Data/ColumnDesc.hs
@@ -35,7 +35,7 @@
   Nothing          -> lbs
 
 realiseColumnDescLazy :: ColumnDesc Text -> ColumnDesc (LBS.ByteString -> LBS.ByteString)
-realiseColumnDescLazy cd = fmap realise cd
+realiseColumnDescLazy = fmap realise
   where realise :: Text -> LBS.ByteString -> LBS.ByteString
         realise t = case t of
           "id"             -> id
diff --git a/bench/Main.hs b/bench/Main.hs
--- a/bench/Main.hs
+++ b/bench/Main.hs
@@ -6,7 +6,6 @@
 import Control.Monad
 import Criterion.Main
 import Data.ByteString                     (ByteString)
-import Data.List
 import Data.Vector                         (Vector)
 import Data.Word
 import HaskellWorks.Data.Dsv.Internal.Char (comma, pipe)
@@ -15,6 +14,7 @@
 import qualified Data.ByteString.Lazy                                   as LBS
 import qualified Data.Csv                                               as CSV
 import qualified Data.Csv.Streaming                                     as CSS
+import qualified Data.List                                              as L
 import qualified Data.Vector.Storable                                   as DVS
 import qualified HaskellWorks.Data.Dsv.Lazy.Cursor                      as SVL
 import qualified HaskellWorks.Data.Dsv.Lazy.Cursor.Lazy                 as SVLL
@@ -24,6 +24,9 @@
 import qualified HaskellWorks.Data.FromForeignRegion                    as IO
 import qualified HaskellWorks.Data.RankSelect.CsPoppy                   as RS
 
+{- HLINT ignore "Reduce duplication"        -}
+{- HLINT ignore "Monoid law, left identity" -}
+
 loadCassavaStrict :: FilePath -> IO (Vector (Vector ByteString))
 loadCassavaStrict filePath = do
   !bs <- LBS.readFile filePath
@@ -39,8 +42,7 @@
   pure r
 
 loadHwsvStrictIndex :: FilePath -> IO (SVS.DsvCursor ByteString RS.CsPoppy)
-loadHwsvStrictIndex filePath =
-  SVS.mmapCursor comma True filePath
+loadHwsvStrictIndex = SVS.mmapCursor comma True
 
 loadHwsvStrict :: FilePath -> IO (Vector (Vector ByteString))
 loadHwsvStrict filePath = SVS.toVectorVector <$> SVS.mmapCursor comma True filePath
@@ -63,13 +65,12 @@
 makeBenchCsv :: IO [Benchmark]
 makeBenchCsv = do
   entries <- listDirectory "data/bench"
-  let files = ("data/bench/" ++) <$> (".csv" `isSuffixOf`) `filter` entries
+  let files = ("data/bench/" ++) <$> (".csv" `L.isSuffixOf`) `filter` entries
   benchmarks <- forM files $ \file -> return $ mempty
     <> [bench ("cassava/decode/via-strict/"       <> file) (nfIO (loadCassavaStrict    file))]
     <> [bench ("cassava/decode/via-streaming/"    <> file) (nfIO (loadCassavaStreaming file))]
     <> [bench ("hw-dsv/decode/via-strict/"        <> file) (nfIO (loadHwsvStrict       file))]
     <> [bench ("hw-dsv/decode/via-lazy/"          <> file) (nfIO (loadHwsvLazy         file))]
-
     <> [bench ("hw-dsv/decode/via-strict/index/"  <> file) (nfIO (loadHwsvStrictIndex  file))]
     <> [bench ("hw-dsv/decode/via-lazy/index/"    <> file) (nfIO (loadHwsvLazyIndex    file))]
   return (join benchmarks)
@@ -77,7 +78,7 @@
 makeBenchW64s :: IO [Benchmark]
 makeBenchW64s = do
   entries <- listDirectory "data/bench"
-  let files = ("data/bench/" ++) <$> (".csv" `isSuffixOf`) `filter` entries
+  let files = ("data/bench/" ++) <$> (".csv" `L.isSuffixOf`) `filter` entries
   benchmarks <- forM files $ \file -> return
     [ env (IO.mmapFromForeignRegion file) $ \v -> bgroup "Creating bit index from mmaped file" $ mempty
       <> [bench ("mkIbVector                  with sum" <> file) (whnf (DVS.foldl (+) 0 . SVS.mkIbVector comma) v)]
@@ -87,7 +88,7 @@
 makeBenchMkInterestBits :: IO [Benchmark]
 makeBenchMkInterestBits = do
   entries <- listDirectory "data/bench"
-  let files = ("data/bench/" ++) <$> (".csv" `isSuffixOf`) `filter` entries
+  let files = ("data/bench/" ++) <$> (".csv" `L.isSuffixOf`) `filter` entries
   benchmarks <- forM files $ \file -> return
     [ env (IO.mmapFromForeignRegion file) $ \(v :: DVS.Vector Word64) -> bgroup "Loading lazy byte string into Word64s" $ mempty
       <> [bench ("mkIbVector                  with sum" <> file) (whnf (DVS.foldr (+) 0 . SVS.mkIbVector        pipe) v)]
diff --git a/hw-dsv.cabal b/hw-dsv.cabal
--- a/hw-dsv.cabal
+++ b/hw-dsv.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name:                   hw-dsv
-version:                0.4.1.0
+version:                0.4.1.1
 synopsis:               Unbelievably fast streaming DSV file parser
 description:            Please see the README on Github at <https://github.com/haskell-works/hw-dsv#readme>
 category:               Text, CSV, SIMD, Succinct Data Structures, Data Structures
@@ -12,7 +12,7 @@
 copyright:              2018-2020 John Ky
 license:                BSD-3-Clause
 license-file:           LICENSE
-tested-with:            GHC == 8.10.1, GHC == 8.8.3, GHC == 8.6.5, GHC == 8.4.4
+tested-with:            GHC == 9.2.2, GHC == 9.0.2, GHC == 8.10.7, GHC == 8.8.4, GHC == 8.6.5
 build-type:             Simple
 extra-source-files:     README.md
                         ChangeLog.md
@@ -41,30 +41,30 @@
 
 common appar                      { build-depends: appar                      >= 0.1.8      && < 0.2    }
 common bits-extra                 { build-depends: bits-extra                 >= 0.0.1.2    && < 0.1    }
-common bytestring                 { build-depends: bytestring                 >= 0.10       && < 0.11   }
+common bytestring                 { build-depends: bytestring                 >= 0.10       && < 0.12   }
 common cassava                    { build-depends: cassava                    >= 0.5.1.0    && < 0.6    }
 common criterion                  { build-depends: criterion                  >= 1.4.1.0    && < 1.6    }
 common deepseq                    { build-depends: deepseq                    >= 1.4        && < 1.5    }
 common directory                  { build-depends: directory                  >= 1.2.2      && < 1.4    }
-common doctest                    { build-depends: doctest                    >= 0.16.2     && < 0.17   }
+common doctest                    { build-depends: doctest                    >= 0.16.2     && < 0.21   }
 common doctest-discover           { build-depends: doctest-discover           >= 0.2        && < 0.3    }
-common generic-lens               { build-depends: generic-lens               >= 1.2.0.1    && < 1.3    }
-common ghc-prim                   { build-depends: ghc-prim                   >= 0.4        && < 0.7    }
-common hedgehog                   { build-depends: hedgehog                   >= 0.5        && < 1.1    }
+common generic-lens               { build-depends: generic-lens               >= 2.2        && < 2.3    }
+common ghc-prim                   { build-depends: ghc-prim                   >= 0.4        && < 0.9    }
+common hedgehog                   { build-depends: hedgehog                   >= 0.5        && < 1.2    }
 common hspec                      { build-depends: hspec                      >= 2.4        && < 3      }
 common hw-bits                    { build-depends: hw-bits                    >= 0.7.0.2    && < 0.8    }
-common hw-ip                      { build-depends: hw-ip                      >= 2.3.4.2    && < 2.5    }
 common hw-hspec-hedgehog          { build-depends: hw-hspec-hedgehog          >= 0.1.0.4    && < 0.2    }
+common hw-ip                      { build-depends: hw-ip                      >= 2.3.4.2    && < 2.5    }
 common hw-prim                    { build-depends: hw-prim                    >= 0.6.2.14   && < 0.7    }
 common hw-rankselect              { build-depends: hw-rankselect              >= 0.12.0.2   && < 0.14   }
 common hw-rankselect-base         { build-depends: hw-rankselect-base         >= 0.3.2.0    && < 0.4    }
 common hw-simd                    { build-depends: hw-simd                    >= 0.1.1.3    && < 0.2    }
-common lens                       { build-depends: lens                       >= 4.15       && < 5      }
+common lens                       { build-depends: lens                       >= 4.15       && < 6      }
 common mmap                       { build-depends: mmap                       >= 0.5.9      && < 0.6    }
-common optparse-applicative       { build-depends: optparse-applicative       >= 0.13       && < 0.16   }
+common optparse-applicative       { build-depends: optparse-applicative       >= 0.13       && < 0.18   }
 common resourcet                  { build-depends: resourcet                  >= 1.1        && < 1.3    }
 common text                       { build-depends: text                       >= 1.2.2      && < 2.0    }
-common transformers               { build-depends: transformers               >= 0.4        && < 0.6    }
+common transformers               { build-depends: transformers               >= 0.4        && < 0.7    }
 common vector                     { build-depends: vector                     >= 0.12.0.1   && < 0.13   }
 common weigh                      { build-depends: weigh                      >= 0.0.6      && < 0.1    }
 
@@ -177,6 +177,7 @@
                       , vector
                       , weigh
   type:                 exitcode-stdio-1.0
+  ghc-options:          -threaded -rtsopts -with-rtsopts=-N
   main-is:              Space.hs
   build-depends:        hw-dsv
   hs-source-dirs:       weigh
@@ -240,7 +241,7 @@
                       , hw-dsv
   default-language:     Haskell2010
   type:                 exitcode-stdio-1.0
-  ghc-options:          -threaded
+  ghc-options:          -threaded -rtsopts -with-rtsopts=-N
   main-is:              DoctestDriver.hs
   HS-Source-Dirs:       doctest
   build-tool-depends:   doctest-discover:doctest-discover
diff --git a/src/HaskellWorks/Data/Dsv/Lazy/Cursor.hs b/src/HaskellWorks/Data/Dsv/Lazy/Cursor.hs
--- a/src/HaskellWorks/Data/Dsv/Lazy/Cursor.hs
+++ b/src/HaskellWorks/Data/Dsv/Lazy/Cursor.hs
@@ -11,7 +11,6 @@
 
 import Data.Function
 import Data.Word
-import GHC.Word                                   (Word8)
 import HaskellWorks.Data.Dsv.Lazy.Cursor.Internal
 import HaskellWorks.Data.Dsv.Lazy.Cursor.Type
 import HaskellWorks.Data.Vector.AsVector64s
diff --git a/src/HaskellWorks/Data/Dsv/Lazy/Cursor/Lazy.hs b/src/HaskellWorks/Data/Dsv/Lazy/Cursor/Lazy.hs
--- a/src/HaskellWorks/Data/Dsv/Lazy/Cursor/Lazy.hs
+++ b/src/HaskellWorks/Data/Dsv/Lazy/Cursor/Lazy.hs
@@ -23,6 +23,8 @@
 import qualified Data.List            as L
 import qualified Data.Vector          as DV
 
+{- HLINT ignore "Reduce duplication" -}
+
 snippet :: DsvCursor -> LBS.ByteString
 snippet c = LBS.take (len `max` 0) $ LBS.drop posC $ dsvCursorText c
   where d = nextField c
diff --git a/src/HaskellWorks/Data/Dsv/Lazy/Cursor/Strict.hs b/src/HaskellWorks/Data/Dsv/Lazy/Cursor/Strict.hs
--- a/src/HaskellWorks/Data/Dsv/Lazy/Cursor/Strict.hs
+++ b/src/HaskellWorks/Data/Dsv/Lazy/Cursor/Strict.hs
@@ -22,8 +22,10 @@
 import qualified Data.List            as L
 import qualified Data.Vector          as DV
 
+{- HLINT ignore "Reduce duplication" -}
+
 snippet :: DsvCursor -> Int -> BS.ByteString -> BS.ByteString
-snippet c offset bs = BS.take (len `max` 0) $ BS.drop posC $ bs
+snippet c offset bs = BS.take (len `max` 0) $ BS.drop posC bs
   where d = nextField c
         posC = fromIntegral (dsvCursorPosition c) - offset
         posD = fromIntegral (dsvCursorPosition d) - offset
diff --git a/src/HaskellWorks/Data/Dsv/Strict/Cursor.hs b/src/HaskellWorks/Data/Dsv/Strict/Cursor.hs
--- a/src/HaskellWorks/Data/Dsv/Strict/Cursor.hs
+++ b/src/HaskellWorks/Data/Dsv/Strict/Cursor.hs
@@ -1,5 +1,4 @@
 {-# LANGUAGE BangPatterns        #-}
-{-# LANGUAGE MultiWayIf          #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
 module HaskellWorks.Data.Dsv.Strict.Cursor
diff --git a/src/HaskellWorks/Data/Dsv/Strict/Cursor/Internal.hs b/src/HaskellWorks/Data/Dsv/Strict/Cursor/Internal.hs
--- a/src/HaskellWorks/Data/Dsv/Strict/Cursor/Internal.hs
+++ b/src/HaskellWorks/Data/Dsv/Strict/Cursor/Internal.hs
@@ -1,11 +1,10 @@
-{-# LANGUAGE ExplicitForAll      #-}
 {-# LANGUAGE FlexibleContexts    #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
 module HaskellWorks.Data.Dsv.Strict.Cursor.Internal where
 
 import Control.Monad.ST
-import Data.Bits                                  (popCount)
+import Data.Bits                                 (popCount)
 import Data.Word
 import HaskellWorks.Data.AtIndex
 import HaskellWorks.Data.Bits.BitWise
@@ -21,7 +20,7 @@
 import qualified Data.Vector.Storable.Mutable               as DVSM
 import qualified HaskellWorks.Data.Dsv.Internal.Char.Word64 as CW
 
-{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
+{- HLINT ignore "Reduce duplication" -}
 
 makeIndexes :: Word8 -> DVS.Vector Word64 -> (DVS.Vector Word64, DVS.Vector Word64)
 makeIndexes delimiter ws = case DVS.createT $ makeIndexes' CW.doubleQuote CW.newline (fillWord64 delimiter) ws of
diff --git a/src/HaskellWorks/Data/Dsv/Strict/Cursor/Internal/Reference.hs b/src/HaskellWorks/Data/Dsv/Strict/Cursor/Internal/Reference.hs
--- a/src/HaskellWorks/Data/Dsv/Strict/Cursor/Internal/Reference.hs
+++ b/src/HaskellWorks/Data/Dsv/Strict/Cursor/Internal/Reference.hs
@@ -1,10 +1,9 @@
-{-# LANGUAGE ExplicitForAll      #-}
 {-# LANGUAGE FlexibleContexts    #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 
 module HaskellWorks.Data.Dsv.Strict.Cursor.Internal.Reference where
 
-import Data.Bits                                  (popCount)
+import Data.Bits                                 (popCount)
 import Data.Word
 import HaskellWorks.Data.AtIndex
 import HaskellWorks.Data.Bits.BitWise
@@ -18,7 +17,8 @@
 import qualified Data.Vector.Storable                       as DVS
 import qualified HaskellWorks.Data.Dsv.Internal.Char.Word64 as CW
 
-{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
+{- HLINT ignore "Reduce duplication"  -}
+{- HLINT ignore "Redundant guard"     -}
 
 unsafeIndex :: DVS.Vector Word64 -> Int -> Word64
 unsafeIndex v i | i < 0                           = error $ "Invalid index: " <> show i <> " for vector sized " <> show (DVS.length v)
@@ -181,7 +181,7 @@
                 in unsafeIndex u (ui - 1) + fromIntegral (popCount w)
 
 mkDsvIbNlFromStriped :: DVS.Vector Word64 -> DVS.Vector Word64 -> DVS.Vector Word64
-mkDsvIbNlFromStriped sv cpcs = DVS.generate ((DVS.length sv) `div` 3) go
+mkDsvIbNlFromStriped sv cpcs = DVS.generate (DVS.length sv `div` 3) go
   where go :: Int -> Word64
         go u = let ui = fromIntegral u in if ui > 1
           then  let svi = ui * 2
@@ -198,7 +198,7 @@
                 in wnl .&. m
 
 mkDsvIbDlFromStriped :: DVS.Vector Word64 -> DVS.Vector Word64 -> DVS.Vector Word64
-mkDsvIbDlFromStriped sv cpcs = DVS.generate ((DVS.length sv) `div` 3) go
+mkDsvIbDlFromStriped sv cpcs = DVS.generate (DVS.length sv `div` 3) go
   where go :: Int -> Word64
         go u = let ui = fromIntegral u in if ui > 1
           then  let svi = ui * 2
diff --git a/test/HaskellWorks/Data/Dsv/BroadwordSpec.hs b/test/HaskellWorks/Data/Dsv/BroadwordSpec.hs
--- a/test/HaskellWorks/Data/Dsv/BroadwordSpec.hs
+++ b/test/HaskellWorks/Data/Dsv/BroadwordSpec.hs
@@ -12,9 +12,9 @@
 import Hedgehog
 import Test.Hspec
 
-{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
-{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
-{-# ANN module ("HLint: ignore Redundant bracket"   :: String) #-}
+{- HLINT ignore "Redundant do"        -}
+{- HLINT ignore "Reduce duplication"  -}
+{- HLINT ignore "Redundant bracket"   -}
 
 spec :: Spec
 spec = describe "HaskellWorks.Data.Dsv.BroadwordSpec" $ do
diff --git a/test/HaskellWorks/Data/Dsv/Lazy/CursorSpec.hs b/test/HaskellWorks/Data/Dsv/Lazy/CursorSpec.hs
--- a/test/HaskellWorks/Data/Dsv/Lazy/CursorSpec.hs
+++ b/test/HaskellWorks/Data/Dsv/Lazy/CursorSpec.hs
@@ -14,9 +14,9 @@
 import qualified HaskellWorks.Data.Dsv.Lazy.Cursor      as SVL
 import qualified HaskellWorks.Data.Dsv.Lazy.Cursor.Lazy as SVLL
 
-{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
-{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
-{-# ANN module ("HLint: ignore Redundant bracket"   :: String) #-}
+{- HLINT ignore "Redundant do"        -}
+{- HLINT ignore "Reduce duplication"  -}
+{- HLINT ignore "Redundant bracket"   -}
 
 subjectEmpty, subjectSS, subjectSM, subjectMS, subjectMM :: LBS.ByteString
 expectedEmpty, expectedSS, expectedSM, expectedMS, expectedMM :: [DV.Vector LBS.ByteString]
diff --git a/test/HaskellWorks/Data/Dsv/Strict/Cursor/InternalSpec.hs b/test/HaskellWorks/Data/Dsv/Strict/Cursor/InternalSpec.hs
--- a/test/HaskellWorks/Data/Dsv/Strict/Cursor/InternalSpec.hs
+++ b/test/HaskellWorks/Data/Dsv/Strict/Cursor/InternalSpec.hs
@@ -8,7 +8,6 @@
 import Control.Monad.IO.Class
 import Data.ByteString                           (ByteString)
 import Data.Char
-import Data.List                                 (isSuffixOf)
 import HaskellWorks.Data.Bits.PopCount.PopCount1
 import HaskellWorks.Data.Dsv.Internal.Char       (pipe)
 import HaskellWorks.Data.FromByteString
@@ -17,6 +16,7 @@
 import Test.Hspec
 
 import qualified Data.ByteString                                        as BS
+import qualified Data.List                                              as L
 import qualified Data.Text                                              as T
 import qualified Data.Text.Encoding                                     as T
 import qualified Data.Vector.Storable                                   as DVS
@@ -27,15 +27,15 @@
 import qualified Hedgehog.Range                                         as R
 import qualified System.Directory                                       as IO
 
-{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
-{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
-{-# ANN module ("HLint: ignore Redundant bracket"   :: String) #-}
+{- HLINT ignore "Redundant do"        -}
+{- HLINT ignore "Reduce duplication"  -}
+{- HLINT ignore "Redundant bracket"   -}
 
 spec :: Spec
 spec = describe "HaskellWorks.Data.Dsv.Strict.Cursor.InternalSpec" $ do
   it "Case 1" $ requireTest $ do
     entries <- liftIO $ IO.listDirectory "data/bench"
-    let files = ("data/bench/" ++) <$> (".csv" `isSuffixOf`) `filter` entries
+    let files = ("data/bench/" ++) <$> (".csv" `L.isSuffixOf`) `filter` entries
     forM_ files $ \file -> do
       v <- liftIO $ IO.mmapFromForeignRegion file
       let !actual   = DVS.foldr (\a b -> popCount1 a + b) 0 (fst $  SVS.makeIndexes pipe v)
@@ -68,7 +68,7 @@
     u === expected
   it "Case 6" $ requireTest $ do
     entries <- liftIO $ IO.listDirectory "data/bench"
-    let files = ("data/bench/" ++) <$> (".csv" `isSuffixOf`) `filter` entries
+    let files = ("data/bench/" ++) <$> (".csv" `L.isSuffixOf`) `filter` entries
     forM_ files $ \file -> do
       v <- liftIO $ IO.mmapFromForeignRegion file
       let !actual   = fst $ SVS.makeIndexes pipe v
diff --git a/test/HaskellWorks/Data/DsvSpec.hs b/test/HaskellWorks/Data/DsvSpec.hs
--- a/test/HaskellWorks/Data/DsvSpec.hs
+++ b/test/HaskellWorks/Data/DsvSpec.hs
@@ -13,9 +13,9 @@
 
 import qualified HaskellWorks.Data.Dsv.Strict.Cursor.Internal.Reference as SVS
 
-{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
-{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
-{-# ANN module ("HLint: ignore Redundant bracket"   :: String) #-}
+{- HLINT ignore "Redundant do"        -}
+{- HLINT ignore "Reduce duplication"  -}
+{- HLINT ignore "Redundant bracket"   -}
 
 spec :: Spec
 spec = describe "HaskellWorks.Data.DsvSpec" $ do
diff --git a/weigh/Space.hs b/weigh/Space.hs
--- a/weigh/Space.hs
+++ b/weigh/Space.hs
@@ -14,7 +14,7 @@
 import qualified HaskellWorks.Data.Dsv.Lazy.Cursor.Lazy as SVLL
 import qualified HaskellWorks.Data.Dsv.Strict.Cursor    as SVS
 
-{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
+{- HLINT ignore "Redundant do"        -}
 
 repeatedly :: (a -> Maybe a) -> a -> [a]
 repeatedly f a = a:case f a of
@@ -47,11 +47,7 @@
             Right v -> pure v
       , action "cassava streaming" $ do
           fmap (F.toList . CSS.decode CSS.HasHeader) (LBS.readFile infp) :: IO [Vector ByteString]
-      , action "hw-dsv strict" $ do
-          v <- loadCsvStrict infp :: IO (Vector (Vector ByteString))
-          pure v
-      , action "hw-dsv lazy" $ do
-          v <- loadCsvLazy infp :: IO [Vector LBS.ByteString]
-          pure v
+      , action "hw-dsv strict" (loadCsvStrict infp  :: IO (Vector (Vector ByteString)))
+      , action "hw-dsv lazy"   (loadCsvLazy infp    :: IO [Vector LBS.ByteString])
       ]
   return ()
