From 9771be3357809fcff1d343c46e550ac12331c747 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 20:37:32 -0400 Subject: [PATCH 01/19] Follow hlint suggestion: use <$> --- .hlint.yaml | 1 - .../src/Distribution/InstalledPackageInfo.hs | 4 ++-- .../src/Distribution/Types/CondTree.hs | 3 +-- .../Types/GenericPackageDescription/Lens.hs | 3 +-- .../Distribution/Types/PackageDescription.hs | 10 +++++----- .../src/Distribution/Simple/GHC/Build/Link.hs | 2 +- Cabal/src/Distribution/Simple/GHCJS.hs | 2 +- Cabal/src/Distribution/Simple/InstallDirs.hs | 5 ++--- Cabal/src/Distribution/Simple/Register.hs | 7 +++---- .../Distribution/Simple/SetupHooks/Errors.hs | 3 +-- Cabal/src/Distribution/Simple/Test/LibV09.hs | 6 ++---- .../src/Distribution/Solver/Modular/Explore.hs | 2 +- .../src/Distribution/Client/CmdClean.hs | 2 +- .../src/Distribution/Client/Config.hs | 2 +- .../src/Distribution/Client/Dependency.hs | 2 +- .../src/Distribution/Client/FileMonitor.hs | 6 ++---- .../src/Distribution/Client/Freeze.hs | 3 +-- .../src/Distribution/Client/Install.hs | 2 +- .../src/Distribution/Client/InstallSymlink.hs | 3 +-- .../src/Distribution/Client/JobControl.hs | 2 +- .../Client/ProjectBuilding/UnpackedPackage.hs | 3 +-- .../Client/ProjectConfig/Legacy.hs | 8 ++++---- .../Client/ProjectConfig/Parsec.hs | 2 +- .../src/Distribution/Client/ProjectFlags.hs | 2 +- .../Client/ProjectOrchestration.hs | 18 ++++++------------ .../Distribution/Client/ProjectPlanOutput.hs | 3 +-- .../src/Distribution/Client/ProjectPlanning.hs | 10 ++++------ .../Client/Sandbox/PackageEnvironment.hs | 3 +-- .../src/Distribution/Client/SetupWrapper.hs | 2 +- .../src/Distribution/Client/SourceFiles.hs | 2 +- .../src/Distribution/Client/Utils/Parsec.hs | 3 +-- .../Distribution/Client/InstallPlan.hs | 6 ++---- .../Distribution/Client/ProjectConfig.hs | 6 ++---- .../PackageTests/Configure/cabal.test.hs | 2 +- .../PackageTests/Configure/setup.test.hs | 2 +- .../PreProcess/Hsc2HsOptionsCC/setup.test.hs | 2 +- cabal-testsuite/src/Test/Cabal/Monad.hs | 3 +-- 37 files changed, 59 insertions(+), 88 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index a711cb638d0..d36e0e82057 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -11,7 +11,6 @@ - ignore: {name: "Redundant return"} # 7 hints - ignore: {name: "Use ++"} # 4 hints - ignore: {name: "Use :"} # 30 hints -- ignore: {name: "Use <$>"} # 83 hints - ignore: {name: "Use Down"} # 3 hints - ignore: {name: "Use camelCase"} # 92 hints - ignore: {name: "Use const"} # 36 hints diff --git a/Cabal-syntax/src/Distribution/InstalledPackageInfo.hs b/Cabal-syntax/src/Distribution/InstalledPackageInfo.hs index 350b9fee757..74a31acd280 100644 --- a/Cabal-syntax/src/Distribution/InstalledPackageInfo.hs +++ b/Cabal-syntax/src/Distribution/InstalledPackageInfo.hs @@ -134,11 +134,11 @@ showFullInstalledPackageInfo = P.showFields (const NoComment) . prettyFieldGramm -- Just "maintainer: Tester" showInstalledPackageInfoField :: String -> Maybe (InstalledPackageInfo -> String) showInstalledPackageInfoField fn = - fmap (\g -> Disp.render . ppField fn . g) $ fieldDescrPretty ipiFieldGrammar (toUTF8BS fn) + (\g -> Disp.render . ppField fn . g) <$> fieldDescrPretty ipiFieldGrammar (toUTF8BS fn) showSimpleInstalledPackageInfoField :: String -> Maybe (InstalledPackageInfo -> String) showSimpleInstalledPackageInfoField fn = - fmap (Disp.renderStyle myStyle .) $ fieldDescrPretty ipiFieldGrammar (toUTF8BS fn) + (Disp.renderStyle myStyle .) <$> fieldDescrPretty ipiFieldGrammar (toUTF8BS fn) where myStyle = Disp.style{Disp.mode = Disp.LeftMode} diff --git a/Cabal-syntax/src/Distribution/Types/CondTree.hs b/Cabal-syntax/src/Distribution/Types/CondTree.hs index cefae9e53df..ce817b1f91e 100644 --- a/Cabal-syntax/src/Distribution/Types/CondTree.hs +++ b/Cabal-syntax/src/Distribution/Types/CondTree.hs @@ -119,8 +119,7 @@ traverseCondTreeV f (CondNode a ifs) = -- | @@Traversal@@ for the data traverseCondBranchA :: L.Traversal (CondBranch v a) (CondBranch v b) a b traverseCondBranchA f (CondBranch cnd t me) = - pure (CondBranch cnd) - <*> traverseCondTreeA f t + (CondBranch cnd <$> traverseCondTreeA f t) <*> traverse (traverseCondTreeA f) me -- | @@Traversal@@ for the variables diff --git a/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs b/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs index a2a5da07cf0..bb771538942 100644 --- a/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs +++ b/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs @@ -79,8 +79,7 @@ allCondTrees -> GenericPackageDescription -> f GenericPackageDescription allCondTrees f (GenericPackageDescription p v a1 x1 x2 x3 x4 x5 x6) = - pure (GenericPackageDescription p) - <*> pure v + (GenericPackageDescription p <$> pure v) <*> pure a1 <*> traverse f x1 <*> (traverse . _2) f x2 diff --git a/Cabal-syntax/src/Distribution/Types/PackageDescription.hs b/Cabal-syntax/src/Distribution/Types/PackageDescription.hs index 87c5dca81a8..f824604e155 100644 --- a/Cabal-syntax/src/Distribution/Types/PackageDescription.hs +++ b/Cabal-syntax/src/Distribution/Types/PackageDescription.hs @@ -428,15 +428,15 @@ enabledComponents pkg enabled = filter (componentEnabled enabled) $ pkgBuildable lookupComponent :: PackageDescription -> ComponentName -> Maybe Component lookupComponent pkg (CLibName name) = - fmap CLib $ find ((name ==) . libName) (allLibraries pkg) + CLib <$> find ((name ==) . libName) (allLibraries pkg) lookupComponent pkg (CFLibName name) = - fmap CFLib $ find ((name ==) . foreignLibName) (foreignLibs pkg) + CFLib <$> find ((name ==) . foreignLibName) (foreignLibs pkg) lookupComponent pkg (CExeName name) = - fmap CExe $ find ((name ==) . exeName) (executables pkg) + CExe <$> find ((name ==) . exeName) (executables pkg) lookupComponent pkg (CTestName name) = - fmap CTest $ find ((name ==) . testName) (testSuites pkg) + CTest <$> find ((name ==) . testName) (testSuites pkg) lookupComponent pkg (CBenchName name) = - fmap CBench $ find ((name ==) . benchmarkName) (benchmarks pkg) + CBench <$> find ((name ==) . benchmarkName) (benchmarks pkg) getComponent :: PackageDescription -> ComponentName -> Component getComponent pkg cname = fromMaybe missingComponent (lookupComponent pkg cname) diff --git a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs index 52245a2760b..f5ff3fbe04c 100644 --- a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs +++ b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs @@ -521,7 +521,7 @@ linkFLib flib bi lbi linkerOpts (way, buildOpts) targetDir runGhcProg = do { ghcOptLinkNoHsMain = toFlag True , ghcOptShared = toFlag True , ghcOptFPic = toFlag True - , ghcOptLinkModDefFiles = toNubListR $ fmap getSymbolicPath $ foreignLibModDefFile flib + , ghcOptLinkModDefFiles = toNubListR $ (getSymbolicPath <$> foreignLibModDefFile flib) } ForeignLibNativeStatic -> -- this should be caught by buildFLib diff --git a/Cabal/src/Distribution/Simple/GHCJS.hs b/Cabal/src/Distribution/Simple/GHCJS.hs index 74c64276ed5..2bb7a8e847a 100644 --- a/Cabal/src/Distribution/Simple/GHCJS.hs +++ b/Cabal/src/Distribution/Simple/GHCJS.hs @@ -1554,7 +1554,7 @@ gbuild verbosity numJobs pkg_descr lbi bm clbi = do , ghcOptLinkLibs = rtsOptLinkLibs , ghcOptLinkLibPath = toNubListR $ map makeSymbolicPath $ rtsLibPaths rtsInfo , ghcOptFPic = toFlag True - , ghcOptLinkModDefFiles = toNubListR $ fmap getSymbolicPath $ gbuildModDefFiles bm + , ghcOptLinkModDefFiles = toNubListR $ (getSymbolicPath <$> gbuildModDefFiles bm) } ForeignLibNativeStatic -> -- this should be caught by buildFLib diff --git a/Cabal/src/Distribution/Simple/InstallDirs.hs b/Cabal/src/Distribution/Simple/InstallDirs.hs index 0ccd1ef6e3a..2fb19abf81d 100644 --- a/Cabal/src/Distribution/Simple/InstallDirs.hs +++ b/Cabal/src/Distribution/Simple/InstallDirs.hs @@ -209,8 +209,7 @@ defaultInstallDirs' False comp userInstall _hasLibs = do Windows -> return "$prefix" _ -> return ("$prefix" "lib") return $ - fmap toPathTemplate $ - InstallDirs + (toPathTemplate <$> InstallDirs { prefix = installPrefix , bindir = "$prefix" "bin" , libdir = installLibDir @@ -247,7 +246,7 @@ defaultInstallDirs' False comp userInstall _hasLibs = do , sysconfdir = case buildOS of Haiku -> "boot" "system" "settings" _other -> "$prefix" "etc" - } + }) -- --------------------------------------------------------------------------- -- Converting directories, absolute or prefix-relative diff --git a/Cabal/src/Distribution/Simple/Register.hs b/Cabal/src/Distribution/Simple/Register.hs index 7b35a5d0583..0d9327eef8c 100644 --- a/Cabal/src/Distribution/Simple/Register.hs +++ b/Cabal/src/Distribution/Simple/Register.hs @@ -327,9 +327,9 @@ abiHash abiHash verbosity pkg distPref lbi lib clbi = case compilerFlavor comp of GHC -> do - fmap mkAbiHash $ GHC.libAbiHash verbosity pkg lbi' lib clbi + mkAbiHash <$> GHC.libAbiHash verbosity pkg lbi' lib clbi GHCJS -> do - fmap mkAbiHash $ GHCJS.libAbiHash verbosity pkg lbi' lib clbi + mkAbiHash <$> GHCJS.libAbiHash verbosity pkg lbi' lib clbi _ -> return (mkAbiHash "") where comp = compiler lbi @@ -713,8 +713,7 @@ relocatableInstalledPackageInfo pkg abi_hash lib lbi clbi pkgroot = bi = libBuildInfo lib installDirs = - fmap (("${pkgroot}" ) . shortRelativePath (getSymbolicPath pkgroot)) $ - absoluteComponentInstallDirs pkg lbi (componentUnitId clbi) NoCopyDest + (("${pkgroot}" ) . shortRelativePath (getSymbolicPath pkgroot)) <$> absoluteComponentInstallDirs pkg lbi (componentUnitId clbi) NoCopyDest -- ----------------------------------------------------------------------------- -- Unregistration diff --git a/Cabal/src/Distribution/Simple/SetupHooks/Errors.hs b/Cabal/src/Distribution/Simple/SetupHooks/Errors.hs index c763cda21dc..aeee139108c 100644 --- a/Cabal/src/Distribution/Simple/SetupHooks/Errors.hs +++ b/Cabal/src/Distribution/Simple/SetupHooks/Errors.hs @@ -123,8 +123,7 @@ rulesExceptionMessage = \case showCycle (r, rs) = unlines . map (" " ++) . lines $ Tree.drawTree $ - fmap show $ - Tree.Node r rs + (show <$> Tree.Node r rs) CantFindSourceForRuleDependencies _r deps -> unlines $ ("Pre-build rules: can't find source for rule " ++ what ++ ":") diff --git a/Cabal/src/Distribution/Simple/Test/LibV09.hs b/Cabal/src/Distribution/Simple/Test/LibV09.hs index 5f3541e82e0..d02704e70e5 100644 --- a/Cabal/src/Distribution/Simple/Test/LibV09.hs +++ b/Cabal/src/Distribution/Simple/Test/LibV09.hs @@ -156,13 +156,11 @@ runTest verbHandles pkg_descr lbi clbi hpcMarkupInfo flags suite = do -- Generate TestSuiteLog from executable exit code and a machine- -- readable test log suiteLog <- - fmap - ( \s -> + ( \s -> (\l -> l{logFile = finalLogName l}) . fromMaybe (error $ "panic! read @TestSuiteLog " ++ show s) $ readMaybe s -- TODO: eradicateNoParse - ) - $ readFile tempLog + ) <$> readFile tempLog -- Write summary notice to log file indicating start of test suite appendFile (logFile suiteLog) $ summarizeSuiteStart testName' diff --git a/cabal-install-solver/src/Distribution/Solver/Modular/Explore.hs b/cabal-install-solver/src/Distribution/Solver/Modular/Explore.hs index b6a1c476ebf..7daca9cf9b6 100644 --- a/cabal-install-solver/src/Distribution/Solver/Modular/Explore.hs +++ b/cabal-install-solver/src/Distribution/Solver/Modular/Explore.hs @@ -299,7 +299,7 @@ exploreLog mbj enableBj fineGrainedConflicts (CountConflicts countConflicts) idx -- set to say that the reverse dependency also excluded this -- version. Just $ CS.singletonWithConflict (P reverseDep) (CS.VersionConstraintConflict currentQPN v) - in fmap CS.unions $ traverse couldBeResolved (S.toList conflicts) + in (CS.unions <$> traverse couldBeResolved (S.toList conflicts)) logSkippedPackage :: QPN -> POption -> ConflictSet -> ExploreState -> ConflictSetLog a logSkippedPackage qpn pOption cs es = diff --git a/cabal-install/src/Distribution/Client/CmdClean.hs b/cabal-install/src/Distribution/Client/CmdClean.hs index e1261f9dacb..7abd8efb2b9 100644 --- a/cabal-install/src/Distribution/Client/CmdClean.hs +++ b/cabal-install/src/Distribution/Client/CmdClean.hs @@ -156,7 +156,7 @@ cleanAction :: (ProjectFlags, CleanFlags) -> [String] -> GlobalFlags -> IO () cleanAction (ProjectFlags{..}, CleanFlags{..}) extraArgs _ = do let verbosity = mkVerbosity defaultVerbosityHandles $ fromFlagOrDefault normal cleanVerbosity saveConfig = fromFlagOrDefault False cleanSaveConfig - mdistDirectory = fmap getSymbolicPath $ flagToMaybe cleanDistDir + mdistDirectory = getSymbolicPath <$> flagToMaybe cleanDistDir mprojectDir = flagToMaybe flagProjectDir mprojectFile = flagToMaybe flagProjectFile diff --git a/cabal-install/src/Distribution/Client/Config.hs b/cabal-install/src/Distribution/Client/Config.hs index c4c5a5dfba5..94fc0799e16 100644 --- a/cabal-install/src/Distribution/Client/Config.hs +++ b/cabal-install/src/Distribution/Client/Config.hs @@ -1019,7 +1019,7 @@ data ConfigFileSource -- | Returns the config file path, without checking that the file exists. -- The order of precedence is: input flag, CABAL_CONFIG, default location. getConfigFilePath :: Verbosity -> Flag FilePath -> IO FilePath -getConfigFilePath verbosity configFilePath = fmap snd $ getConfigFilePathAndSource verbosity configFilePath +getConfigFilePath verbosity configFilePath = snd <$> getConfigFilePathAndSource verbosity configFilePath getConfigFilePathAndSource :: Verbosity -> Flag FilePath -> IO (ConfigFileSource, FilePath) getConfigFilePathAndSource verbosity configFileFlag = diff --git a/cabal-install/src/Distribution/Client/Dependency.hs b/cabal-install/src/Distribution/Client/Dependency.hs index fc447247d69..afc77c032aa 100644 --- a/cabal-install/src/Distribution/Client/Dependency.hs +++ b/cabal-install/src/Distribution/Client/Dependency.hs @@ -1050,7 +1050,7 @@ planPackagesProblems platform cinfo pkgs = , not (null packageProblems) ] ++ [ DuplicatePackageSolverId (Graph.nodeKey aDup) dups - | dups <- fmap toList $ duplicatesBy (comparing Graph.nodeKey) pkgs + | dups <- toList <$> duplicatesBy (comparing Graph.nodeKey) pkgs , aDup <- case dups of [] -> [] (ad : _) -> [ad] diff --git a/cabal-install/src/Distribution/Client/FileMonitor.hs b/cabal-install/src/Distribution/Client/FileMonitor.hs index e4fceac694f..9fc8e25d97a 100644 --- a/cabal-install/src/Distribution/Client/FileMonitor.hs +++ b/cabal-install/src/Distribution/Client/FileMonitor.hs @@ -580,8 +580,7 @@ probeMonitorStateFiles -- directory modification time changed: -- a matching file may have been added or deleted matches <- - return . filter (matchGlobPieces glob) - =<< liftIO (listDirectory (root dirName)) + filter (matchGlobPieces glob) <$> liftIO (listDirectory (root dirName)) traverse_ probeMergeResult $ mergeBy @@ -784,8 +783,7 @@ probeMonitorStateGlobRel -- directory modification time changed: -- a matching file may have been added or deleted matches <- - return . filter (matchGlobPieces glob) - =<< liftIO (listDirectory (root dirName)) + filter (matchGlobPieces glob) <$> liftIO (listDirectory (root dirName)) traverse_ probeMergeResult $ mergeBy diff --git a/cabal-install/src/Distribution/Client/Freeze.hs b/cabal-install/src/Distribution/Client/Freeze.hs index 94c27746920..888a1d87f28 100644 --- a/cabal-install/src/Distribution/Client/Freeze.hs +++ b/cabal-install/src/Distribution/Client/Freeze.hs @@ -300,8 +300,7 @@ pruneInstallPlan installPlan pkgSpecifiers = freezePackages :: Package pkg => Verbosity -> GlobalFlags -> [pkg] -> IO () freezePackages verbosity globalFlags pkgs = do pkgEnv <- - fmap (createPkgEnv . addFrozenConstraints) $ - loadUserConfig + (createPkgEnv . addFrozenConstraints) <$> loadUserConfig verbosity "" (flagToMaybe . globalConstraintsFile $ globalFlags) diff --git a/cabal-install/src/Distribution/Client/Install.hs b/cabal-install/src/Distribution/Client/Install.hs index 98082ca86f0..4aba13b223e 100644 --- a/cabal-install/src/Distribution/Client/Install.hs +++ b/cabal-install/src/Distribution/Client/Install.hs @@ -2031,7 +2031,7 @@ installUnpackedPackage traverse (readPkgConf (getSymbolicPath pkgConfDest)) . sort . filter notHidden =<< listDirectory (getSymbolicPath pkgConfDest) - else fmap (: []) $ readPkgConf "." (getSymbolicPath pkgConfDest) + else (: []) <$> readPkgConf "." (getSymbolicPath pkgConfDest) readPkgConf :: FilePath diff --git a/cabal-install/src/Distribution/Client/InstallSymlink.hs b/cabal-install/src/Distribution/Client/InstallSymlink.hs index 58d5d5cf94f..319161a3343 100644 --- a/cabal-install/src/Distribution/Client/InstallSymlink.hs +++ b/cabal-install/src/Distribution/Client/InstallSymlink.hs @@ -146,8 +146,7 @@ symlinkBinaries publicBinDir <- canonicalizePath symlinkBinDir -- TODO: do we want to do this here? : -- createDirectoryIfMissing True publicBinDir - fmap catMaybes $ - sequenceA + catMaybes <$> sequenceA [ do privateBinDir <- pkgBinDir pkg ipid ok <- diff --git a/cabal-install/src/Distribution/Client/JobControl.hs b/cabal-install/src/Distribution/Client/JobControl.hs index 4ca471976d3..3cb2162581f 100644 --- a/cabal-install/src/Distribution/Client/JobControl.hs +++ b/cabal-install/src/Distribution/Client/JobControl.hs @@ -268,7 +268,7 @@ withJobLimit (JobLimit sem) = newtype Lock = Lock (MVar ()) newLock :: IO Lock -newLock = fmap Lock $ newMVar () +newLock = Lock <$> newMVar () criticalSection :: Lock -> IO a -> IO a criticalSection (Lock lck) act = bracket_ (takeMVar lck) (putMVar lck ()) act diff --git a/cabal-install/src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs b/cabal-install/src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs index 10cba75bb16..30d235bbcde 100644 --- a/cabal-install/src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs +++ b/cabal-install/src/Distribution/Client/ProjectBuilding/UnpackedPackage.hs @@ -659,8 +659,7 @@ buildInplaceUnpackedPackage let listSimple = execRebuild (getSymbolicPath srcdir) (needElaboratedConfiguredPackage pkg) listSdist = - fmap (map monitorFileHashed) $ - allPackageSourceFiles verbosity (getSymbolicPath srcdir) + map monitorFileHashed <$> allPackageSourceFiles verbosity (getSymbolicPath srcdir) ifNullThen m m' = do xs <- m if null xs then m' else return xs diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs index bf47efd8a2e..29579076125 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Legacy.hs @@ -779,10 +779,10 @@ convertLegacyPerPackageFlags , configRelocatable = packageConfigRelocatable , configCoverageFor = _ } = configFlags - packageConfigExtraLibDirs = fmap getSymbolicPath $ configExtraLibDirs configFlags - packageConfigExtraLibDirsStatic = fmap getSymbolicPath $ configExtraLibDirsStatic configFlags - packageConfigExtraFrameworkDirs = fmap getSymbolicPath $ configExtraFrameworkDirs configFlags - packageConfigExtraIncludeDirs = fmap getSymbolicPath $ configExtraIncludeDirs configFlags + packageConfigExtraLibDirs = getSymbolicPath <$> configExtraLibDirs configFlags + packageConfigExtraLibDirsStatic = getSymbolicPath <$> configExtraLibDirsStatic configFlags + packageConfigExtraFrameworkDirs = getSymbolicPath <$> configExtraFrameworkDirs configFlags + packageConfigExtraIncludeDirs = getSymbolicPath <$> configExtraIncludeDirs configFlags packageConfigProgramPaths = MapLast (Map.fromList configProgramPaths) packageConfigProgramArgs = MapMappend (Map.fromListWith (++) configProgramArgs) diff --git a/cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs b/cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs index 742cf4f0981..075d72e457c 100644 --- a/cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs +++ b/cabal-install/src/Distribution/Client/ProjectConfig/Parsec.hs @@ -141,7 +141,7 @@ parseProjectSkeleton cacheDir httpTransport verbosity projectDir source (Project (parseImport pos importLines) (Section (Name pos "if") args xs') -> do subpcs <- go [] xs' - let fs = fmap singletonProjectConfigSkeleton $ fieldsToConfig source (reverse acc) + let fs = singletonProjectConfigSkeleton <$> fieldsToConfig source (reverse acc) (elseClauses, rest) <- parseElseClauses xs let condNode = (\c pcs e -> CondNode mempty [CondBranch c pcs e]) diff --git a/cabal-install/src/Distribution/Client/ProjectFlags.hs b/cabal-install/src/Distribution/Client/ProjectFlags.hs index 1003a58add4..d33afd8b9b4 100644 --- a/cabal-install/src/Distribution/Client/ProjectFlags.hs +++ b/cabal-install/src/Distribution/Client/ProjectFlags.hs @@ -98,7 +98,7 @@ projectFlagsOptions showOrParseArgs = "Set the parser to use for the project file" flagProjectFileParser (\pf flags -> flags{flagProjectFileParser = pf}) - (reqArg "PARSER" (fmap Flag $ ReadE parseProjectFileParser) projectFileParserPrinter) + (reqArg "PARSER" (Flag <$> ReadE parseProjectFileParser) projectFileParserPrinter) ] parseProjectFileParser :: String -> Either String ProjectFileParser diff --git a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs index cecea153f39..799b8932401 100644 --- a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs +++ b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs @@ -455,8 +455,7 @@ runProjectBuildPhase verbosity ProjectBaseContext{..} ProjectBuildContext{..} = - fmap (Map.union (previousBuildOutcomes pkgsBuildStatus)) $ - rebuildTargets + Map.union (previousBuildOutcomes pkgsBuildStatus) <$> rebuildTargets verbosity projectConfig distDirLayout @@ -709,10 +708,8 @@ resolveTargets -- We can ask to build any whole package, project-local or a dependency checkTarget bt@(TargetPackage _ (ordNub -> [pkgid]) mkfilter) | Just ats <- - fmap (maybe id filterTargetsKind mkfilter) $ - Map.lookup pkgid availableTargetsByPackageId = - fmap (componentTargets WholeComponent) $ - selectPackageTargets bt ats + maybe id filterTargetsKind mkfilter <$> Map.lookup pkgid availableTargetsByPackageId = + componentTargets WholeComponent <$> selectPackageTargets bt ats | otherwise = Left (TargetProblemNoSuchPackage pkgid) checkTarget (TargetPackage _ pkgids _) = @@ -739,8 +736,7 @@ resolveTargets Map.lookup (pkgid, cname) availableTargetsByPackageIdAndComponentName = - fmap (componentTargets subtarget) $ - selectComponentTargets subtarget ats + componentTargets subtarget <$> selectComponentTargets subtarget ats | Map.member pkgid availableTargetsByPackageId = Left (TargetProblemNoSuchComponent pkgid cname) | otherwise = @@ -755,16 +751,14 @@ resolveTargets Map.lookup (pkgname, cname) availableTargetsByPackageNameAndComponentName = - fmap (componentTargets subtarget) $ - selectComponentTargets subtarget ats + componentTargets subtarget <$> selectComponentTargets subtarget ats | Map.member pkgname availableTargetsByPackageName = Left (TargetProblemUnknownComponent pkgname ecname) | otherwise = Left (TargetNotInProject pkgname) checkTarget bt@(TargetPackageNamed pkgname mkfilter) | Just ats <- - fmap (maybe id filterTargetsKind mkfilter) $ - Map.lookup pkgname availableTargetsByPackageName = + maybe id filterTargetsKind mkfilter <$> Map.lookup pkgname availableTargetsByPackageName = fmap (componentTargets WholeComponent) . selectPackageTargets bt $ ats diff --git a/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs b/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs index 5008de76471..bf32b15eac1 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs @@ -854,8 +854,7 @@ writePlanGhcEnvironment | compilerFlavor compiler == GHC , supportsPkgEnvFiles (getImplInfo compiler) = -- TODO: check ghcjs compat - fmap Just $ - writeGhcEnvironmentFile + Just <$> writeGhcEnvironmentFile path platform (compilerVersion compiler) diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index d87a79c34eb..443f0d4d823 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -1262,8 +1262,7 @@ getPackageSourceHashes verbosity withRepoCtx solverPlan = do -- hashesFromRepoMetadata <- Sec.uncheckClientErrors $ -- TODO: [code cleanup] wrap in our own exceptions - fmap (Map.fromList . concat) $ - sequence + ((Map.fromList . concat) <$> sequence -- Reading the repo index is expensive so we group the packages by repo [ repoContextWithSecureRepo repoctx repo $ \secureRepo -> Sec.withIndex secureRepo $ \repoIndex -> @@ -1284,7 +1283,7 @@ getPackageSourceHashes verbosity withRepoCtx solverPlan = do . NE.groupBy ((==) `on` (repoName . fst)) . sortBy (compare `on` (repoName . fst)) $ repoTarballPkgsWithMetadata - ] + ]) -- For tarballs from repos that do not have hashes available, download -- the ones we previously determined we need. @@ -1315,13 +1314,12 @@ getPackageSourceHashes verbosity withRepoCtx solverPlan = do ++ repoTarballPkgsNewlyDownloaded hashesFromTarballFiles <- liftIO $ - fmap Map.fromList $ - sequence + (Map.fromList <$> sequence [ do srchash <- readFileHashValue tarball return (pkgid, srchash) | (pkgid, tarball) <- allTarballFilePkgs - ] + ]) monitorFiles [ monitorFile tarball | (_pkgid, tarball) <- allTarballFilePkgs diff --git a/cabal-install/src/Distribution/Client/Sandbox/PackageEnvironment.hs b/cabal-install/src/Distribution/Client/Sandbox/PackageEnvironment.hs index e10227f39b6..afcc9e52c43 100644 --- a/cabal-install/src/Distribution/Client/Sandbox/PackageEnvironment.hs +++ b/cabal-install/src/Distribution/Client/Sandbox/PackageEnvironment.hs @@ -152,8 +152,7 @@ userPackageEnvironment verbosity pkgEnvDir globalConfigLocation = do -- | Same as @userPackageEnvironmentFile@, but returns a SavedConfig. loadUserConfig :: Verbosity -> FilePath -> Maybe FilePath -> IO SavedConfig loadUserConfig verbosity pkgEnvDir globalConfigLocation = - fmap pkgEnvSavedConfig $ - userPackageEnvironment verbosity pkgEnvDir globalConfigLocation + pkgEnvSavedConfig <$> userPackageEnvironment verbosity pkgEnvDir globalConfigLocation -- | Descriptions of all fields in the package environment file. pkgEnvFieldDescrs :: ConstraintSource -> [FieldDescr PackageEnvironment] diff --git a/cabal-install/src/Distribution/Client/SetupWrapper.hs b/cabal-install/src/Distribution/Client/SetupWrapper.hs index cd7b9741990..69b9b2dc980 100644 --- a/cabal-install/src/Distribution/Client/SetupWrapper.hs +++ b/cabal-install/src/Distribution/Client/SetupWrapper.hs @@ -788,7 +788,7 @@ invoke verbosity path args options = do let loggingHandle = maybe Inherit UseHandle (useLoggingHandle options) cp = (proc path args) - { Process.cwd = fmap getSymbolicPath $ useWorkingDir options + { Process.cwd = getSymbolicPath <$> useWorkingDir options , Process.env = env , Process.std_out = loggingHandle , Process.std_err = loggingHandle diff --git a/cabal-install/src/Distribution/Client/SourceFiles.hs b/cabal-install/src/Distribution/Client/SourceFiles.hs index bc52fd6e531..bc046e329c1 100644 --- a/cabal-install/src/Distribution/Client/SourceFiles.hs +++ b/cabal-install/src/Distribution/Client/SourceFiles.hs @@ -192,7 +192,7 @@ needBuildInfo pkg_descr bi modules = do , map getSymbolicPath expandedExtraSrcFiles ] for_ - (fmap getSymbolicPath $ installIncludes bi) + (getSymbolicPath <$> installIncludes bi) ( findFileMonitored ("." : fmap getSymbolicPath (includeDirs bi)) >=> maybe (return ()) need ) diff --git a/cabal-install/src/Distribution/Client/Utils/Parsec.hs b/cabal-install/src/Distribution/Client/Utils/Parsec.hs index 684a9d42fa2..3ab7d4192a5 100644 --- a/cabal-install/src/Distribution/Client/Utils/Parsec.hs +++ b/cabal-install/src/Distribution/Client/Utils/Parsec.hs @@ -78,8 +78,7 @@ instance (Newtype a b, Sep sep, Pretty b) => Pretty (NubList' sep b a) where remoteRepoGrammar :: RepoName -> ParsecFieldGrammar RemoteRepo RemoteRepo remoteRepoGrammar name = - pure (RemoteRepo name) - <*> uniqueFieldAla "url" URI_NT remoteRepoURILens + (RemoteRepo name <$> uniqueFieldAla "url" URI_NT remoteRepoURILens) <*> optionalField "secure" remoteRepoSecureLens <*> monoidalFieldAla "root-keys" (alaList' FSep Token) remoteRepoRootKeysLens <*> optionalFieldDefAla "key-threshold" KeyThreshold remoteRepoKeyThresholdLens 0 diff --git a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs index db2a9680e5e..805d49a32b2 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs @@ -234,11 +234,9 @@ arbitraryInstallPlan -> Gen (InstallPlan.GenericInstallPlan ipkg srcpkg) arbitraryInstallPlan mkIPkg mkSrcPkg ipkgProportion graph = do (ipkgvs, srcpkgvs) <- - fmap - ( bimap (map fst) (map fst) + ( bimap (map fst) (map fst) . partition snd - ) - $ sequenceA + ) <$> sequenceA [ do isipkg <- if isRoot diff --git a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs index b442ea2e5a9..6eac8a04fa6 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs @@ -630,8 +630,7 @@ instance Arbitrary ProjectConfigShared where shrink ProjectConfigShared{..} = runShrinker $ - pure ProjectConfigShared - <*> shrinker projectConfigDistDir + (ProjectConfigShared <$> shrinker projectConfigDistDir) <*> shrinker projectConfigConfigFile <*> shrinker projectConfigProjectDir <*> shrinker projectConfigProjectFile @@ -975,8 +974,7 @@ instance f ~ [] => Arbitrary (SourceRepositoryPackage f) where shrink SourceRepositoryPackage{..} = runShrinker $ - pure SourceRepositoryPackage - <*> shrinker srpType + (SourceRepositoryPackage <$> shrinker srpType) <*> shrinkerAla ShortToken srpLocation <*> shrinkerAla (fmap ShortToken) srpTag <*> shrinkerAla (fmap ShortToken) srpBranch diff --git a/cabal-testsuite/PackageTests/Configure/cabal.test.hs b/cabal-testsuite/PackageTests/Configure/cabal.test.hs index cd419e8cee2..a58fa11360d 100644 --- a/cabal-testsuite/PackageTests/Configure/cabal.test.hs +++ b/cabal-testsuite/PackageTests/Configure/cabal.test.hs @@ -21,7 +21,7 @@ main = cabalTest $ do void $ shell "C:\\msys64\\usr\\bin\\bash.exe" [ "-l", "-c", "cd $(cygpath -m '" <> testTmpDir env <> "') && autoreconf -i"] cabal "v2-build" [] else do - hasAutoreconf <- liftIO $ fmap isJust $ findExecutable "autoreconf" + hasAutoreconf <- liftIO $ (isJust <$> findExecutable "autoreconf") skipUnless "no autoreconf" hasAutoreconf _ <- shell "autoreconf" ["-i"] cabal "v2-build" [] diff --git a/cabal-testsuite/PackageTests/Configure/setup.test.hs b/cabal-testsuite/PackageTests/Configure/setup.test.hs index 5eaea387fe6..bb3b289a122 100644 --- a/cabal-testsuite/PackageTests/Configure/setup.test.hs +++ b/cabal-testsuite/PackageTests/Configure/setup.test.hs @@ -20,7 +20,7 @@ main = setupTest $ void $ shell "C:\\msys64\\usr\\bin\\bash.exe" [ "-l", "-c", "cd $(cygpath -m '" <> testTmpDir env <> "') && autoreconf -i"] setup_build [] else do - hasAutoreconf <- liftIO $ fmap isJust $ findExecutable "autoreconf" + hasAutoreconf <- liftIO $ (isJust <$> findExecutable "autoreconf") skipUnless "no autoreconf" hasAutoreconf _ <- shell "autoreconf" ["-i"] setup_build [] diff --git a/cabal-testsuite/PackageTests/PreProcess/Hsc2HsOptionsCC/setup.test.hs b/cabal-testsuite/PackageTests/PreProcess/Hsc2HsOptionsCC/setup.test.hs index eb3a5eb255e..e1e40af5ae1 100644 --- a/cabal-testsuite/PackageTests/PreProcess/Hsc2HsOptionsCC/setup.test.hs +++ b/cabal-testsuite/PackageTests/PreProcess/Hsc2HsOptionsCC/setup.test.hs @@ -18,7 +18,7 @@ main = setupAndCabalTest $ do . resultOutput <$> runProgramM ghcProgram ["--print-libdir"] Nothing else do - hasGxx <- liftIO $ fmap isJust $ findExecutable "g++" + hasGxx <- liftIO $ (isJust <$> findExecutable "g++") skipUnless "g++" hasGxx pure "g++" diff --git a/cabal-testsuite/src/Test/Cabal/Monad.hs b/cabal-testsuite/src/Test/Cabal/Monad.hs index c8f1bd31ae1..adc3de9470d 100644 --- a/cabal-testsuite/src/Test/Cabal/Monad.hs +++ b/cabal-testsuite/src/Test/Cabal/Monad.hs @@ -783,8 +783,7 @@ requireProgramM program = do needProgramM :: String -> TestM (Maybe ConfiguredProgram) needProgramM program = do - env <- getTestEnv - return $ lookupProgramByName program (testProgramDb env) + lookupProgramByName program . testProgramDb <$> getTestEnv programPathM :: Program -> TestM FilePath programPathM program = do From 8c874d092a7d3fb3d338fc5d10be385b131c1f24 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 20:40:02 -0400 Subject: [PATCH 02/19] Use <$>, avoiding explicit return --- Cabal-syntax/src/Distribution/Backpack.hs | 3 +-- Cabal-syntax/src/Distribution/SPDX/LicenseExpression.hs | 3 +-- Cabal-syntax/src/Distribution/System.hs | 3 +-- Cabal-syntax/src/Distribution/Types/AbiDependency.hs | 3 +-- Cabal-syntax/src/Distribution/Types/Mixin.hs | 3 +-- Cabal-syntax/src/Distribution/Types/Module.hs | 3 +-- .../src/Distribution/Types/VersionRange/Internal.hs | 6 ++---- Cabal-syntax/src/Distribution/Utils/MD5.hs | 3 +-- .../src/Distribution/Client/IndexUtils/ActiveRepos.hs | 3 +-- 9 files changed, 10 insertions(+), 20 deletions(-) diff --git a/Cabal-syntax/src/Distribution/Backpack.hs b/Cabal-syntax/src/Distribution/Backpack.hs index 6671b9fa053..e69f31c63ac 100644 --- a/Cabal-syntax/src/Distribution/Backpack.hs +++ b/Cabal-syntax/src/Distribution/Backpack.hs @@ -183,8 +183,7 @@ instance Parsec OpenModule where parsecOpenModule = do uid <- parsec _ <- P.char ':' - mod_name <- parsec - return (OpenModule uid mod_name) + OpenModule uid <$> parsec parsecModuleVar = do _ <- P.char '<' diff --git a/Cabal-syntax/src/Distribution/SPDX/LicenseExpression.hs b/Cabal-syntax/src/Distribution/SPDX/LicenseExpression.hs index 3e5e0e13c22..0e3c49c3346 100644 --- a/Cabal-syntax/src/Distribution/SPDX/LicenseExpression.hs +++ b/Cabal-syntax/src/Distribution/SPDX/LicenseExpression.hs @@ -114,8 +114,7 @@ instance Parsec LicenseExpression where simple = do s <- parsec - exc <- exception - return $ ELicense s exc + ELicense s <$> exception exception = P.optional $ P.try (spaces1 *> P.string "WITH" *> spaces1) *> parsec diff --git a/Cabal-syntax/src/Distribution/System.hs b/Cabal-syntax/src/Distribution/System.hs index 793fe22c396..625dd797bac 100644 --- a/Cabal-syntax/src/Distribution/System.hs +++ b/Cabal-syntax/src/Distribution/System.hs @@ -297,8 +297,7 @@ instance Parsec Platform where parsec = do arch <- parsecDashlessArch _ <- P.char '-' - os <- parsec - return (Platform arch os) + Platform arch <$> parsec where parsecDashlessArch = classifyArch Strict <$> dashlessIdent diff --git a/Cabal-syntax/src/Distribution/Types/AbiDependency.hs b/Cabal-syntax/src/Distribution/Types/AbiDependency.hs index 90f182939c6..97990946565 100644 --- a/Cabal-syntax/src/Distribution/Types/AbiDependency.hs +++ b/Cabal-syntax/src/Distribution/Types/AbiDependency.hs @@ -34,8 +34,7 @@ instance Parsec AbiDependency where parsec = do uid <- parsec _ <- P.char '=' - abi <- parsec - return (AbiDependency uid abi) + AbiDependency uid <$> parsec instance Binary AbiDependency instance Structured AbiDependency diff --git a/Cabal-syntax/src/Distribution/Types/Mixin.hs b/Cabal-syntax/src/Distribution/Types/Mixin.hs index 5a68f187a0e..ef41e49ad80 100644 --- a/Cabal-syntax/src/Distribution/Types/Mixin.hs +++ b/Cabal-syntax/src/Distribution/Types/Mixin.hs @@ -62,8 +62,7 @@ instance Parsec Mixin where versionGuardMultilibs LSubLibName <$> parsec P.spaces - incl <- parsec - return (mkMixin pn ln incl) + mkMixin pn ln <$> parsec versionGuardMultilibs :: CabalParsing m => m () versionGuardMultilibs = do diff --git a/Cabal-syntax/src/Distribution/Types/Module.hs b/Cabal-syntax/src/Distribution/Types/Module.hs index ad89475c715..fc82137d85a 100644 --- a/Cabal-syntax/src/Distribution/Types/Module.hs +++ b/Cabal-syntax/src/Distribution/Types/Module.hs @@ -35,8 +35,7 @@ instance Parsec Module where parsec = do uid <- parsec _ <- P.char ':' - mod_name <- parsec - return (Module uid mod_name) + Module uid <$> parsec instance NFData Module where rnf (Module uid mod_name) = rnf uid `seq` rnf mod_name diff --git a/Cabal-syntax/src/Distribution/Types/VersionRange/Internal.hs b/Cabal-syntax/src/Distribution/Types/VersionRange/Internal.hs index 20956ec4540..fd41e4ff1c7 100644 --- a/Cabal-syntax/src/Distribution/Types/VersionRange/Internal.hs +++ b/Cabal-syntax/src/Distribution/Types/VersionRange/Internal.hs @@ -364,8 +364,7 @@ versionRangeParser digitParser csv = expr _ <- P.string "||" checkOp P.spaces - e <- expr - return (unionVersionRanges t e) + unionVersionRanges t <$> expr <|> return t term = do f <- factor @@ -374,8 +373,7 @@ versionRangeParser digitParser csv = expr _ <- P.string "&&" checkOp P.spaces - t <- term - return (intersectVersionRanges f t) + intersectVersionRanges f <$> term <|> return f factor = parens expr <|> prim diff --git a/Cabal-syntax/src/Distribution/Utils/MD5.hs b/Cabal-syntax/src/Distribution/Utils/MD5.hs index 3c91b6241ef..7f32f262d00 100644 --- a/Cabal-syntax/src/Distribution/Utils/MD5.hs +++ b/Cabal-syntax/src/Distribution/Utils/MD5.hs @@ -56,8 +56,7 @@ binaryPutMD5 (Fingerprint a b) = do binaryGetMD5 :: Get MD5 binaryGetMD5 = do a <- getWord64le - b <- getWord64le - return (Fingerprint a b) + Fingerprint a <$> getWord64le -- | -- diff --git a/cabal-install/src/Distribution/Client/IndexUtils/ActiveRepos.hs b/cabal-install/src/Distribution/Client/IndexUtils/ActiveRepos.hs index a0ec5909902..beddb9dfc1b 100644 --- a/cabal-install/src/Distribution/Client/IndexUtils/ActiveRepos.hs +++ b/cabal-install/src/Distribution/Client/IndexUtils/ActiveRepos.hs @@ -107,8 +107,7 @@ instance Parsec ActiveRepoEntry where leadRepo = do r <- parsec - s <- strategyP - return (ActiveRepo r s) + ActiveRepo r <$> strategyP strategyP = P.option CombineStrategyMerge (P.char ':' *> parsec) From f28822946a55e9d5796884585e221c7e5e90e780 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 20:53:47 -0400 Subject: [PATCH 03/19] Rerun hlint --default --- .hlint.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.hlint.yaml b/.hlint.yaml index d36e0e82057..65a943dd1d4 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -4,13 +4,17 @@ - ignore: {name: "Eta reduce"} # 139 hints - ignore: {name: "Hoist not"} # 16 hints - ignore: {name: "Move filter"} # 4 hints +- ignore: {name: "Redundant $"} # 9 hints - ignore: {name: "Redundant $!"} # 3 hints +- ignore: {name: "Redundant <$>"} # 1 hint +- ignore: {name: "Redundant bracket"} # 4 hints - ignore: {name: "Redundant guard"} # 1 hint - ignore: {name: "Redundant if"} # 6 hints - ignore: {name: "Redundant multi-way if"} # 1 hint - ignore: {name: "Redundant return"} # 7 hints - ignore: {name: "Use ++"} # 4 hints - ignore: {name: "Use :"} # 30 hints +- ignore: {name: "Use <$>"} # 12 hints - ignore: {name: "Use Down"} # 3 hints - ignore: {name: "Use camelCase"} # 92 hints - ignore: {name: "Use const"} # 36 hints From 8aef39f17e2dd9bccecbd051cdd98be1aff44336 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 21:07:10 -0400 Subject: [PATCH 04/19] Follow hlint suggestion by hand: use <$> --- .hlint.yaml | 1 - Cabal/src/Distribution/Simple/Utils.hs | 27 +++++++++---------- .../src/Distribution/Client/TargetSelector.hs | 26 ++++++------------ .../Distribution/Client/ArbitraryInstances.hs | 4 +-- 4 files changed, 23 insertions(+), 35 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index 65a943dd1d4..57fd260b9ef 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -14,7 +14,6 @@ - ignore: {name: "Redundant return"} # 7 hints - ignore: {name: "Use ++"} # 4 hints - ignore: {name: "Use :"} # 30 hints -- ignore: {name: "Use <$>"} # 12 hints - ignore: {name: "Use Down"} # 3 hints - ignore: {name: "Use camelCase"} # 92 hints - ignore: {name: "Use const"} # 36 hints diff --git a/Cabal/src/Distribution/Simple/Utils.hs b/Cabal/src/Distribution/Simple/Utils.hs index 736d9d0f064..f81152d62e8 100644 --- a/Cabal/src/Distribution/Simple/Utils.hs +++ b/Cabal/src/Distribution/Simple/Utils.hs @@ -451,9 +451,7 @@ die' :: Verbosity -> String -> IO a die' verbosity msg = withFrozenCallStack $ do ioError . verbatimUserError =<< annotateErrorString verbosity - =<< pure . wrapTextVerbosity (verbosityFlags verbosity) - =<< pure . addErrorPrefix - =<< prefixWithProgName msg + =<< (wrapTextVerbosity (verbosityFlags verbosity) . addErrorPrefix <$> prefixWithProgName msg) -- Type which will be a wrapper for cabal -exceptions and cabal-install exceptions data VerboseException a = VerboseException CallStack POSIXTime VerbosityFlags a @@ -970,17 +968,18 @@ rawSystemExitCode -> IO ExitCode rawSystemExitCode verbosity mbWorkDir path args menv = withFrozenCallStack $ - fmap fst $ - rawSystemIOWithEnvAndAction - verbosity - path - args - (fmap getSymbolicPath mbWorkDir) - menv - (\_ _ _ -> return ()) - Nothing - Nothing - Nothing + ( fst + <$> rawSystemIOWithEnvAndAction + verbosity + path + args + (fmap getSymbolicPath mbWorkDir) + menv + (\_ _ _ -> return ()) + Nothing + Nothing + Nothing + ) -- | Execute the given command with the given arguments, returning -- the command's exit code. diff --git a/cabal-install/src/Distribution/Client/TargetSelector.hs b/cabal-install/src/Distribution/Client/TargetSelector.hs index f1189be4755..a3c53fe4d53 100644 --- a/cabal-install/src/Distribution/Client/TargetSelector.hs +++ b/cabal-install/src/Distribution/Client/TargetSelector.hs @@ -321,23 +321,18 @@ parseTargetString = where parseTargetApprox :: Parse.ReadP TargetString parseTargetApprox = - ( do - a <- tokenQEnd - return (TargetString1 a) - ) + (TargetString1 <$> tokenQEnd) +++ ( do a <- tokenQ0 _ <- Parse.char ':' - b <- tokenQEnd - return (TargetString2 a b) + TargetString2 a <$> tokenQEnd ) +++ ( do a <- tokenQ0 _ <- Parse.char ':' b <- tokenQ _ <- Parse.char ':' - c <- tokenQEnd - return (TargetString3 a b c) + TargetString3 a b <$> tokenQEnd ) +++ ( do a <- tokenQ0 @@ -346,8 +341,7 @@ parseTargetString = _ <- Parse.char ':' c <- tokenQ _ <- Parse.char ':' - d <- tokenQEnd - return (TargetString4 a b c d) + TargetString4 a b c <$> tokenQEnd ) +++ ( do a <- tokenQ0 @@ -358,8 +352,7 @@ parseTargetString = _ <- Parse.char ':' d <- tokenQ _ <- Parse.char ':' - e <- tokenQEnd - return (TargetString5 a b c d e) + TargetString5 a b c d <$> tokenQEnd ) +++ ( do a <- tokenQ0 @@ -374,8 +367,7 @@ parseTargetString = _ <- Parse.char ':' f <- tokenQ _ <- Parse.char ':' - g <- tokenQEnd - return (TargetString7 a b c d e f g) + TargetString7 a b c d e f <$> tokenQEnd ) token = Parse.munch1 (\x -> not (isSpace x) && x /= ':') @@ -2108,8 +2100,7 @@ matchPackageDir ps = \str fstatus -> FileStatusExistsDir canondir -> orNoSuchThing "package directory" str (map (snd . fst) dirs) $ increaseConfidenceFor $ - fmap snd $ - matchExactly (fst . fst) dirs canondir + (snd <$> matchExactly (fst . fst) dirs canondir) _ -> mzero where dirs = @@ -2123,8 +2114,7 @@ matchPackageFile ps = \str fstatus -> do FileStatusExistsFile canonfile -> orNoSuchThing "package .cabal file" str (map (snd . fst) files) $ increaseConfidenceFor $ - fmap snd $ - matchExactly (fst . fst) files canonfile + (snd <$> matchExactly (fst . fst) files canonfile) _ -> mzero where files = diff --git a/cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs b/cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs index 518b1ad7aa5..3a4c35f1eb2 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs @@ -111,8 +111,8 @@ instance Arbitrary URI where instance Arbitrary URIAuth where arbitrary = - pure (URIAuth "") -- no password as this does not roundtrip - <*> arbitraryURIToken + -- no password as this does not roundtrip + (URIAuth "" <$> arbitraryURIToken) <*> arbitraryURIPort arbitraryURIToken :: Gen String From 0e6553001189b7b493ae0cb4fcbdf30a0671eaa4 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 21:09:52 -0400 Subject: [PATCH 05/19] Rerun hlint --default --- .hlint.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index 57fd260b9ef..c8187f01bf3 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -4,9 +4,9 @@ - ignore: {name: "Eta reduce"} # 139 hints - ignore: {name: "Hoist not"} # 16 hints - ignore: {name: "Move filter"} # 4 hints -- ignore: {name: "Redundant $"} # 9 hints +- ignore: {name: "Redundant $"} # 12 hints - ignore: {name: "Redundant $!"} # 3 hints -- ignore: {name: "Redundant <$>"} # 1 hint +- ignore: {name: "Redundant <$>"} # 2 hints - ignore: {name: "Redundant bracket"} # 4 hints - ignore: {name: "Redundant guard"} # 1 hint - ignore: {name: "Redundant if"} # 6 hints From 9ee3881977805ea53c8bb176b66a25996d94e327 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 21:14:11 -0400 Subject: [PATCH 06/19] Follow hlint suggestion: redundant <$> --- .hlint.yaml | 1 - .../src/Distribution/Types/GenericPackageDescription/Lens.hs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index c8187f01bf3..4cc725c5886 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -6,7 +6,6 @@ - ignore: {name: "Move filter"} # 4 hints - ignore: {name: "Redundant $"} # 12 hints - ignore: {name: "Redundant $!"} # 3 hints -- ignore: {name: "Redundant <$>"} # 2 hints - ignore: {name: "Redundant bracket"} # 4 hints - ignore: {name: "Redundant guard"} # 1 hint - ignore: {name: "Redundant if"} # 6 hints diff --git a/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs b/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs index bb771538942..eb08ca2904c 100644 --- a/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs +++ b/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs @@ -79,7 +79,7 @@ allCondTrees -> GenericPackageDescription -> f GenericPackageDescription allCondTrees f (GenericPackageDescription p v a1 x1 x2 x3 x4 x5 x6) = - (GenericPackageDescription p <$> pure v) + pure (GenericPackageDescription p v) <*> pure a1 <*> traverse f x1 <*> (traverse . _2) f x2 From c79fcd5be03db8888714209d54fdad03d51cd889 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 21:25:43 -0400 Subject: [PATCH 07/19] Follow hlint suggestion: redundant $ --- .hlint.yaml | 1 - .../src/Distribution/Simple/GHC/Build/Link.hs | 2 +- Cabal/src/Distribution/Simple/GHCJS.hs | 2 +- Cabal/src/Distribution/Simple/InstallDirs.hs | 79 ++++++++++--------- .../Distribution/Simple/SetupHooks/Errors.hs | 3 +- .../Distribution/Client/ProjectPlanning.hs | 64 ++++++++------- .../src/Distribution/Client/TargetSelector.hs | 6 +- .../PackageTests/Configure/cabal.test.hs | 2 +- .../PackageTests/Configure/setup.test.hs | 2 +- .../PreProcess/Hsc2HsOptionsCC/setup.test.hs | 2 +- 10 files changed, 82 insertions(+), 81 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index 4cc725c5886..a484639320c 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -4,7 +4,6 @@ - ignore: {name: "Eta reduce"} # 139 hints - ignore: {name: "Hoist not"} # 16 hints - ignore: {name: "Move filter"} # 4 hints -- ignore: {name: "Redundant $"} # 12 hints - ignore: {name: "Redundant $!"} # 3 hints - ignore: {name: "Redundant bracket"} # 4 hints - ignore: {name: "Redundant guard"} # 1 hint diff --git a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs index f5ff3fbe04c..683c22426da 100644 --- a/Cabal/src/Distribution/Simple/GHC/Build/Link.hs +++ b/Cabal/src/Distribution/Simple/GHC/Build/Link.hs @@ -521,7 +521,7 @@ linkFLib flib bi lbi linkerOpts (way, buildOpts) targetDir runGhcProg = do { ghcOptLinkNoHsMain = toFlag True , ghcOptShared = toFlag True , ghcOptFPic = toFlag True - , ghcOptLinkModDefFiles = toNubListR $ (getSymbolicPath <$> foreignLibModDefFile flib) + , ghcOptLinkModDefFiles = toNubListR (getSymbolicPath <$> foreignLibModDefFile flib) } ForeignLibNativeStatic -> -- this should be caught by buildFLib diff --git a/Cabal/src/Distribution/Simple/GHCJS.hs b/Cabal/src/Distribution/Simple/GHCJS.hs index 2bb7a8e847a..73eed6eefde 100644 --- a/Cabal/src/Distribution/Simple/GHCJS.hs +++ b/Cabal/src/Distribution/Simple/GHCJS.hs @@ -1554,7 +1554,7 @@ gbuild verbosity numJobs pkg_descr lbi bm clbi = do , ghcOptLinkLibs = rtsOptLinkLibs , ghcOptLinkLibPath = toNubListR $ map makeSymbolicPath $ rtsLibPaths rtsInfo , ghcOptFPic = toFlag True - , ghcOptLinkModDefFiles = toNubListR $ (getSymbolicPath <$> gbuildModDefFiles bm) + , ghcOptLinkModDefFiles = toNubListR (getSymbolicPath <$> gbuildModDefFiles bm) } ForeignLibNativeStatic -> -- this should be caught by buildFLib diff --git a/Cabal/src/Distribution/Simple/InstallDirs.hs b/Cabal/src/Distribution/Simple/InstallDirs.hs index 2fb19abf81d..c2db69a870d 100644 --- a/Cabal/src/Distribution/Simple/InstallDirs.hs +++ b/Cabal/src/Distribution/Simple/InstallDirs.hs @@ -73,7 +73,6 @@ import qualified Prelude import Foreign import Foreign.C #endif - -- --------------------------------------------------------------------------- -- Installation directories @@ -208,45 +207,47 @@ defaultInstallDirs' False comp userInstall _hasLibs = do case buildOS of Windows -> return "$prefix" _ -> return ("$prefix" "lib") - return $ - (toPathTemplate <$> InstallDirs - { prefix = installPrefix - , bindir = "$prefix" "bin" - , libdir = installLibDir - , libsubdir = case comp of - UHC -> "$pkgid" - _other -> "$abi" "$libname" - , dynlibdir = - "$libdir" case comp of + return + ( toPathTemplate + <$> InstallDirs + { prefix = installPrefix + , bindir = "$prefix" "bin" + , libdir = installLibDir + , libsubdir = case comp of UHC -> "$pkgid" - _other -> "$abi" - , bytecodelibdir = "$libdir" "$libsubdir" - , libexecsubdir = "$abi" "$pkgid" - , flibdir = "$libdir" - , libexecdir = case buildOS of - Windows -> "$prefix" "$libname" - Haiku -> "$libdir" - _other -> "$prefix" "libexec" - , includedir = case buildOS of - Haiku -> "$prefix" "develop" "headers" - _other -> "$libdir" "$libsubdir" "include" - , datadir = case buildOS of - Windows -> "$prefix" - Haiku -> "$prefix" "data" - _other -> "$prefix" "share" - , datasubdir = "$abi" "$pkgid" - , docdir = case buildOS of - Haiku -> "$prefix" "documentation" - _other -> "$datadir" "doc" "$abi" "$pkgid" - , mandir = case buildOS of - Haiku -> "$docdir" "man" - _other -> "$datadir" "man" - , htmldir = "$docdir" "html" - , haddockdir = "$htmldir" - , sysconfdir = case buildOS of - Haiku -> "boot" "system" "settings" - _other -> "$prefix" "etc" - }) + _other -> "$abi" "$libname" + , dynlibdir = + "$libdir" case comp of + UHC -> "$pkgid" + _other -> "$abi" + , bytecodelibdir = "$libdir" "$libsubdir" + , libexecsubdir = "$abi" "$pkgid" + , flibdir = "$libdir" + , libexecdir = case buildOS of + Windows -> "$prefix" "$libname" + Haiku -> "$libdir" + _other -> "$prefix" "libexec" + , includedir = case buildOS of + Haiku -> "$prefix" "develop" "headers" + _other -> "$libdir" "$libsubdir" "include" + , datadir = case buildOS of + Windows -> "$prefix" + Haiku -> "$prefix" "data" + _other -> "$prefix" "share" + , datasubdir = "$abi" "$pkgid" + , docdir = case buildOS of + Haiku -> "$prefix" "documentation" + _other -> "$datadir" "doc" "$abi" "$pkgid" + , mandir = case buildOS of + Haiku -> "$docdir" "man" + _other -> "$datadir" "man" + , htmldir = "$docdir" "html" + , haddockdir = "$htmldir" + , sysconfdir = case buildOS of + Haiku -> "boot" "system" "settings" + _other -> "$prefix" "etc" + } + ) -- --------------------------------------------------------------------------- -- Converting directories, absolute or prefix-relative diff --git a/Cabal/src/Distribution/Simple/SetupHooks/Errors.hs b/Cabal/src/Distribution/Simple/SetupHooks/Errors.hs index aeee139108c..2e4e5736353 100644 --- a/Cabal/src/Distribution/Simple/SetupHooks/Errors.hs +++ b/Cabal/src/Distribution/Simple/SetupHooks/Errors.hs @@ -122,8 +122,7 @@ rulesExceptionMessage = \case showCycle :: (RuleBinary, [Graph.Tree RuleBinary]) -> String showCycle (r, rs) = unlines . map (" " ++) . lines $ - Tree.drawTree $ - (show <$> Tree.Node r rs) + Tree.drawTree (show <$> Tree.Node r rs) CantFindSourceForRuleDependencies _r deps -> unlines $ ("Pre-build rules: can't find source for rule " ++ what ++ ":") diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index 443f0d4d823..f497a57484f 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -1261,29 +1261,31 @@ getPackageSourceHashes verbosity withRepoCtx solverPlan = do -- the hashes for the packages -- hashesFromRepoMetadata <- - Sec.uncheckClientErrors $ -- TODO: [code cleanup] wrap in our own exceptions - ((Map.fromList . concat) <$> sequence - -- Reading the repo index is expensive so we group the packages by repo - [ repoContextWithSecureRepo repoctx repo $ \secureRepo -> - Sec.withIndex secureRepo $ \repoIndex -> - sequence - [ do - hash <- - Sec.trusted - <$> Sec.indexLookupHash repoIndex pkgid -- strip off Trusted tag - - -- Note that hackage-security currently uses SHA256 - -- but this API could in principle give us some other - -- choice in future. - return (pkgid, hashFromTUF hash) - | pkgid <- pkgids - ] - | (repo, pkgids) <- - map (\grp@((repo, _) :| _) -> (repo, map snd (NE.toList grp))) - . NE.groupBy ((==) `on` (repoName . fst)) - . sortBy (compare `on` (repoName . fst)) - $ repoTarballPkgsWithMetadata - ]) + Sec.uncheckClientErrors -- TODO: [code cleanup] wrap in our own exceptions + ( (Map.fromList . concat) + <$> sequence + -- Reading the repo index is expensive so we group the packages by repo + [ repoContextWithSecureRepo repoctx repo $ \secureRepo -> + Sec.withIndex secureRepo $ \repoIndex -> + sequence + [ do + hash <- + Sec.trusted + <$> Sec.indexLookupHash repoIndex pkgid -- strip off Trusted tag + + -- Note that hackage-security currently uses SHA256 + -- but this API could in principle give us some other + -- choice in future. + return (pkgid, hashFromTUF hash) + | pkgid <- pkgids + ] + | (repo, pkgids) <- + map (\grp@((repo, _) :| _) -> (repo, map snd (NE.toList grp))) + . NE.groupBy ((==) `on` (repoName . fst)) + . sortBy (compare `on` (repoName . fst)) + $ repoTarballPkgsWithMetadata + ] + ) -- For tarballs from repos that do not have hashes available, download -- the ones we previously determined we need. @@ -1313,13 +1315,15 @@ getPackageSourceHashes verbosity withRepoCtx solverPlan = do ++ repoTarballPkgsDownloaded ++ repoTarballPkgsNewlyDownloaded hashesFromTarballFiles <- - liftIO $ - (Map.fromList <$> sequence - [ do - srchash <- readFileHashValue tarball - return (pkgid, srchash) - | (pkgid, tarball) <- allTarballFilePkgs - ]) + liftIO + ( Map.fromList + <$> sequence + [ do + srchash <- readFileHashValue tarball + return (pkgid, srchash) + | (pkgid, tarball) <- allTarballFilePkgs + ] + ) monitorFiles [ monitorFile tarball | (_pkgid, tarball) <- allTarballFilePkgs diff --git a/cabal-install/src/Distribution/Client/TargetSelector.hs b/cabal-install/src/Distribution/Client/TargetSelector.hs index a3c53fe4d53..ab365a58f02 100644 --- a/cabal-install/src/Distribution/Client/TargetSelector.hs +++ b/cabal-install/src/Distribution/Client/TargetSelector.hs @@ -2099,8 +2099,7 @@ matchPackageDir ps = \str fstatus -> case fstatus of FileStatusExistsDir canondir -> orNoSuchThing "package directory" str (map (snd . fst) dirs) $ - increaseConfidenceFor $ - (snd <$> matchExactly (fst . fst) dirs canondir) + increaseConfidenceFor (snd <$> matchExactly (fst . fst) dirs canondir) _ -> mzero where dirs = @@ -2113,8 +2112,7 @@ matchPackageFile ps = \str fstatus -> do case fstatus of FileStatusExistsFile canonfile -> orNoSuchThing "package .cabal file" str (map (snd . fst) files) $ - increaseConfidenceFor $ - (snd <$> matchExactly (fst . fst) files canonfile) + increaseConfidenceFor (snd <$> matchExactly (fst . fst) files canonfile) _ -> mzero where files = diff --git a/cabal-testsuite/PackageTests/Configure/cabal.test.hs b/cabal-testsuite/PackageTests/Configure/cabal.test.hs index a58fa11360d..e9d1c89ec76 100644 --- a/cabal-testsuite/PackageTests/Configure/cabal.test.hs +++ b/cabal-testsuite/PackageTests/Configure/cabal.test.hs @@ -21,7 +21,7 @@ main = cabalTest $ do void $ shell "C:\\msys64\\usr\\bin\\bash.exe" [ "-l", "-c", "cd $(cygpath -m '" <> testTmpDir env <> "') && autoreconf -i"] cabal "v2-build" [] else do - hasAutoreconf <- liftIO $ (isJust <$> findExecutable "autoreconf") + hasAutoreconf <- liftIO (isJust <$> findExecutable "autoreconf") skipUnless "no autoreconf" hasAutoreconf _ <- shell "autoreconf" ["-i"] cabal "v2-build" [] diff --git a/cabal-testsuite/PackageTests/Configure/setup.test.hs b/cabal-testsuite/PackageTests/Configure/setup.test.hs index bb3b289a122..15247c2fec0 100644 --- a/cabal-testsuite/PackageTests/Configure/setup.test.hs +++ b/cabal-testsuite/PackageTests/Configure/setup.test.hs @@ -20,7 +20,7 @@ main = setupTest $ void $ shell "C:\\msys64\\usr\\bin\\bash.exe" [ "-l", "-c", "cd $(cygpath -m '" <> testTmpDir env <> "') && autoreconf -i"] setup_build [] else do - hasAutoreconf <- liftIO $ (isJust <$> findExecutable "autoreconf") + hasAutoreconf <- liftIO (isJust <$> findExecutable "autoreconf") skipUnless "no autoreconf" hasAutoreconf _ <- shell "autoreconf" ["-i"] setup_build [] diff --git a/cabal-testsuite/PackageTests/PreProcess/Hsc2HsOptionsCC/setup.test.hs b/cabal-testsuite/PackageTests/PreProcess/Hsc2HsOptionsCC/setup.test.hs index e1e40af5ae1..265a50a17a0 100644 --- a/cabal-testsuite/PackageTests/PreProcess/Hsc2HsOptionsCC/setup.test.hs +++ b/cabal-testsuite/PackageTests/PreProcess/Hsc2HsOptionsCC/setup.test.hs @@ -18,7 +18,7 @@ main = setupAndCabalTest $ do . resultOutput <$> runProgramM ghcProgram ["--print-libdir"] Nothing else do - hasGxx <- liftIO $ (isJust <$> findExecutable "g++") + hasGxx <- liftIO (isJust <$> findExecutable "g++") skipUnless "g++" hasGxx pure "g++" From 1c3e73482058cf89c46e2262cf73ad4d5876a58c Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 21:29:59 -0400 Subject: [PATCH 08/19] Follow hlint suggestion: use <$> --- .../src/Distribution/Types/GenericPackageDescription/Lens.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs b/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs index eb08ca2904c..7cef37dfe93 100644 --- a/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs +++ b/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs @@ -79,8 +79,8 @@ allCondTrees -> GenericPackageDescription -> f GenericPackageDescription allCondTrees f (GenericPackageDescription p v a1 x1 x2 x3 x4 x5 x6) = - pure (GenericPackageDescription p v) - <*> pure a1 + GenericPackageDescription p v + <$> pure a1 <*> traverse f x1 <*> (traverse . _2) f x2 <*> (traverse . _2) f x3 From 201c45bd92bf3ea3804184f5369e63685d741d93 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 21:32:52 -0400 Subject: [PATCH 09/19] Follow hlint suggestion: redundant <$> --- .../src/Distribution/Types/GenericPackageDescription/Lens.hs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs b/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs index 7cef37dfe93..cd04a9baeb5 100644 --- a/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs +++ b/Cabal-syntax/src/Distribution/Types/GenericPackageDescription/Lens.hs @@ -79,9 +79,8 @@ allCondTrees -> GenericPackageDescription -> f GenericPackageDescription allCondTrees f (GenericPackageDescription p v a1 x1 x2 x3 x4 x5 x6) = - GenericPackageDescription p v - <$> pure a1 - <*> traverse f x1 + GenericPackageDescription p v a1 + <$> traverse f x1 <*> (traverse . _2) f x2 <*> (traverse . _2) f x3 <*> (traverse . _2) f x4 From 580b0c284b74cfa3aac2861e196715779ddddb24 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 21:33:27 -0400 Subject: [PATCH 10/19] Follow hlint suggestion: redundant $ --- Cabal/src/Distribution/Simple/Utils.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cabal/src/Distribution/Simple/Utils.hs b/Cabal/src/Distribution/Simple/Utils.hs index f81152d62e8..f6a3b405690 100644 --- a/Cabal/src/Distribution/Simple/Utils.hs +++ b/Cabal/src/Distribution/Simple/Utils.hs @@ -967,7 +967,7 @@ rawSystemExitCode -> Maybe [(String, String)] -> IO ExitCode rawSystemExitCode verbosity mbWorkDir path args menv = - withFrozenCallStack $ + withFrozenCallStack ( fst <$> rawSystemIOWithEnvAndAction verbosity From 34d2d48aa673cf46f499caa543ca10631abba960 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 21:38:31 -0400 Subject: [PATCH 11/19] Follow hlint suggestion: redundant <$> --- Cabal/src/Distribution/Simple/Utils.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Cabal/src/Distribution/Simple/Utils.hs b/Cabal/src/Distribution/Simple/Utils.hs index f6a3b405690..d768140d5c6 100644 --- a/Cabal/src/Distribution/Simple/Utils.hs +++ b/Cabal/src/Distribution/Simple/Utils.hs @@ -450,8 +450,8 @@ dieWithLocation' verbosity filename mb_lineno msg = die' :: Verbosity -> String -> IO a die' verbosity msg = withFrozenCallStack $ do ioError . verbatimUserError - =<< annotateErrorString verbosity - =<< (wrapTextVerbosity (verbosityFlags verbosity) . addErrorPrefix <$> prefixWithProgName msg) + =<< annotateErrorString verbosity . wrapTextVerbosity (verbosityFlags verbosity) . addErrorPrefix + =<< prefixWithProgName msg -- Type which will be a wrapper for cabal -exceptions and cabal-install exceptions data VerboseException a = VerboseException CallStack POSIXTime VerbosityFlags a From c9138f3909da12084f25503be21c67b313f15ffb Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 21:42:03 -0400 Subject: [PATCH 12/19] Follow hlint suggestion: redundant bracket --- .hlint.yaml | 1 - Cabal/src/Distribution/Simple/Register.hs | 2 +- cabal-install/src/Distribution/Client/Freeze.hs | 3 ++- cabal-install/src/Distribution/Client/ProjectPlanning.hs | 2 +- .../tests/UnitTests/Distribution/Client/InstallPlan.hs | 5 ++--- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index a484639320c..d36e0e82057 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -5,7 +5,6 @@ - ignore: {name: "Hoist not"} # 16 hints - ignore: {name: "Move filter"} # 4 hints - ignore: {name: "Redundant $!"} # 3 hints -- ignore: {name: "Redundant bracket"} # 4 hints - ignore: {name: "Redundant guard"} # 1 hint - ignore: {name: "Redundant if"} # 6 hints - ignore: {name: "Redundant multi-way if"} # 1 hint diff --git a/Cabal/src/Distribution/Simple/Register.hs b/Cabal/src/Distribution/Simple/Register.hs index 0d9327eef8c..09449debc82 100644 --- a/Cabal/src/Distribution/Simple/Register.hs +++ b/Cabal/src/Distribution/Simple/Register.hs @@ -713,7 +713,7 @@ relocatableInstalledPackageInfo pkg abi_hash lib lbi clbi pkgroot = bi = libBuildInfo lib installDirs = - (("${pkgroot}" ) . shortRelativePath (getSymbolicPath pkgroot)) <$> absoluteComponentInstallDirs pkg lbi (componentUnitId clbi) NoCopyDest + ("${pkgroot}" ) . shortRelativePath (getSymbolicPath pkgroot) <$> absoluteComponentInstallDirs pkg lbi (componentUnitId clbi) NoCopyDest -- ----------------------------------------------------------------------------- -- Unregistration diff --git a/cabal-install/src/Distribution/Client/Freeze.hs b/cabal-install/src/Distribution/Client/Freeze.hs index 888a1d87f28..ad493eb6aca 100644 --- a/cabal-install/src/Distribution/Client/Freeze.hs +++ b/cabal-install/src/Distribution/Client/Freeze.hs @@ -300,7 +300,8 @@ pruneInstallPlan installPlan pkgSpecifiers = freezePackages :: Package pkg => Verbosity -> GlobalFlags -> [pkg] -> IO () freezePackages verbosity globalFlags pkgs = do pkgEnv <- - (createPkgEnv . addFrozenConstraints) <$> loadUserConfig + createPkgEnv . addFrozenConstraints + <$> loadUserConfig verbosity "" (flagToMaybe . globalConstraintsFile $ globalFlags) diff --git a/cabal-install/src/Distribution/Client/ProjectPlanning.hs b/cabal-install/src/Distribution/Client/ProjectPlanning.hs index f497a57484f..ba722b8cd9a 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanning.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanning.hs @@ -1262,7 +1262,7 @@ getPackageSourceHashes verbosity withRepoCtx solverPlan = do -- hashesFromRepoMetadata <- Sec.uncheckClientErrors -- TODO: [code cleanup] wrap in our own exceptions - ( (Map.fromList . concat) + ( Map.fromList . concat <$> sequence -- Reading the repo index is expensive so we group the packages by repo [ repoContextWithSecureRepo repoctx repo $ \secureRepo -> diff --git a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs index 805d49a32b2..e49e0fdc108 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs @@ -234,9 +234,8 @@ arbitraryInstallPlan -> Gen (InstallPlan.GenericInstallPlan ipkg srcpkg) arbitraryInstallPlan mkIPkg mkSrcPkg ipkgProportion graph = do (ipkgvs, srcpkgvs) <- - ( bimap (map fst) (map fst) - . partition snd - ) <$> sequenceA + bimap (map fst) (map fst) . partition snd + <$> sequenceA [ do isipkg <- if isRoot From 775c6da18f1da00320269e8923b7d981524a3ca3 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 22:09:51 -0400 Subject: [PATCH 13/19] Follow hlint suggestion: use <$> --- Cabal/src/Distribution/Simple/Program/Find.hs | 4 +--- Cabal/src/Distribution/Simple/Setup/Config.hs | 6 ++---- Cabal/src/Distribution/Simple/SrcDist.hs | 6 +++--- cabal-testsuite/src/Test/Cabal/Prelude.hs | 4 +--- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/Cabal/src/Distribution/Simple/Program/Find.hs b/Cabal/src/Distribution/Simple/Program/Find.hs index f64c2bdaf0c..300794b59a2 100644 --- a/Cabal/src/Distribution/Simple/Program/Find.hs +++ b/Cabal/src/Distribution/Simple/Program/Find.hs @@ -180,9 +180,7 @@ programSearchPathAsPATHVar searchpath = do return (intercalate [searchPathSeparator] (concat ess)) where getEntries (ProgramSearchPathDir dir) = return [dir] - getEntries ProgramSearchPathDefault = do - env <- getEnvironment - return (maybe [] splitSearchPath (lookup "PATH" env)) + getEntries ProgramSearchPathDefault = maybe [] splitSearchPath . lookup "PATH" <$> getEnvironment -- | Get the system search path. On Unix systems this is just the @$PATH@ env -- var, but on windows it's a bit more complicated. diff --git a/Cabal/src/Distribution/Simple/Setup/Config.hs b/Cabal/src/Distribution/Simple/Setup/Config.hs index 839241eed0f..c7d41554fb5 100644 --- a/Cabal/src/Distribution/Simple/Setup/Config.hs +++ b/Cabal/src/Distribution/Simple/Setup/Config.hs @@ -923,8 +923,7 @@ parsecPromisedComponent = do then LMainLibName else LSubLibName ucn _ <- P.char '=' - cid <- parsec - return $ PromisedComponent pn ln cid + PromisedComponent pn ln <$> parsec prettyPromisedComponent :: PromisedComponent -> String prettyPromisedComponent (PromisedComponent pn cn cid) = @@ -946,8 +945,7 @@ parsecGivenComponent = do then LMainLibName else LSubLibName ucn _ <- P.char '=' - cid <- parsec - return $ GivenComponent pn ln cid + GivenComponent pn ln <$> parsec prettyGivenComponent :: GivenComponent -> String prettyGivenComponent (GivenComponent pn cn cid) = diff --git a/Cabal/src/Distribution/Simple/SrcDist.hs b/Cabal/src/Distribution/Simple/SrcDist.hs index 84fbb40c436..883b4994c78 100644 --- a/Cabal/src/Distribution/Simple/SrcDist.hs +++ b/Cabal/src/Distribution/Simple/SrcDist.hs @@ -272,13 +272,13 @@ listPackageSources' verbosity rip mbWorkDir pkg_descr pps = . withAllLib $ \l -> do let lbi = libBuildInfo l - incls = fmap getSymbolicPath $ filter (`notElem` autogenIncludes lbi) (installIncludes lbi) + incls = getSymbolicPath <$> filter (`notElem` autogenIncludes lbi) (installIncludes lbi) relincdirs = fmap getSymbolicPath $ sameDirectory : mapMaybe symbolicPathRelative_maybe (includeDirs lbi) traverse (fmap (makeSymbolicPath . snd) . findIncludeFile verbosity cwd relincdirs) incls , -- Setup script, if it exists. - fmap (maybe [] (\f -> [makeSymbolicPath f])) $ findSetupFile cwd + maybe [] (\f -> [makeSymbolicPath f]) <$> findSetupFile cwd , -- SetupHooks script, if it exists. - fmap (maybe [] (\f -> [makeSymbolicPath f])) $ findSetupHooksFile cwd + maybe [] (\f -> [makeSymbolicPath f]) <$> findSetupHooksFile cwd , -- The .cabal file itself. fmap (\d -> [d]) (coerceSymbolicPath . relativeSymbolicPath <$> tryFindPackageDesc verbosity mbWorkDir) ] diff --git a/cabal-testsuite/src/Test/Cabal/Prelude.hs b/cabal-testsuite/src/Test/Cabal/Prelude.hs index 75e83a353fb..f3d841d8357 100644 --- a/cabal-testsuite/src/Test/Cabal/Prelude.hs +++ b/cabal-testsuite/src/Test/Cabal/Prelude.hs @@ -1157,9 +1157,7 @@ skipIfNoProfiledLibraries = skipUnless "no profiled libraries" =<< hasProfiledLi -- An example where this is needed is if you want to dynamically link -- detailed-0.9 test suites, since those depend on the Cabal library unde rtest. hasCabalShared :: TestM Bool -hasCabalShared = do - env <- getTestEnv - return (testHaveCabalShared env) +hasCabalShared = testHaveCabalShared <$> getTestEnv anyCabalVersion :: WithCallStack (String -> TestM Bool) anyCabalVersion = isCabalVersion any From b9eaf27285f7fd661c5055b559797fb14bead871 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 22:16:48 -0400 Subject: [PATCH 14/19] Remove redundant brackets --- cabal-install/src/Distribution/Client/Utils/Parsec.hs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cabal-install/src/Distribution/Client/Utils/Parsec.hs b/cabal-install/src/Distribution/Client/Utils/Parsec.hs index 3ab7d4192a5..99ed9782c46 100644 --- a/cabal-install/src/Distribution/Client/Utils/Parsec.hs +++ b/cabal-install/src/Distribution/Client/Utils/Parsec.hs @@ -78,7 +78,8 @@ instance (Newtype a b, Sep sep, Pretty b) => Pretty (NubList' sep b a) where remoteRepoGrammar :: RepoName -> ParsecFieldGrammar RemoteRepo RemoteRepo remoteRepoGrammar name = - (RemoteRepo name <$> uniqueFieldAla "url" URI_NT remoteRepoURILens) + RemoteRepo name + <$> uniqueFieldAla "url" URI_NT remoteRepoURILens <*> optionalField "secure" remoteRepoSecureLens <*> monoidalFieldAla "root-keys" (alaList' FSep Token) remoteRepoRootKeysLens <*> optionalFieldDefAla "key-threshold" KeyThreshold remoteRepoKeyThresholdLens 0 From ffdf90ce8d24ae079ae916b3efab78525167999b Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Tue, 23 Jun 2026 22:21:40 -0400 Subject: [PATCH 15/19] Satisfy fourmolu --- Cabal/src/Distribution/Simple/Test/LibV09.hs | 9 +++++---- cabal-install/src/Distribution/Client/InstallSymlink.hs | 3 ++- .../src/Distribution/Client/ProjectOrchestration.hs | 3 ++- .../src/Distribution/Client/ProjectPlanOutput.hs | 3 ++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Cabal/src/Distribution/Simple/Test/LibV09.hs b/Cabal/src/Distribution/Simple/Test/LibV09.hs index d02704e70e5..96ca8e14cac 100644 --- a/Cabal/src/Distribution/Simple/Test/LibV09.hs +++ b/Cabal/src/Distribution/Simple/Test/LibV09.hs @@ -157,10 +157,11 @@ runTest verbHandles pkg_descr lbi clbi hpcMarkupInfo flags suite = do -- readable test log suiteLog <- ( \s -> - (\l -> l{logFile = finalLogName l}) - . fromMaybe (error $ "panic! read @TestSuiteLog " ++ show s) - $ readMaybe s -- TODO: eradicateNoParse - ) <$> readFile tempLog + (\l -> l{logFile = finalLogName l}) + . fromMaybe (error $ "panic! read @TestSuiteLog " ++ show s) + $ readMaybe s -- TODO: eradicateNoParse + ) + <$> readFile tempLog -- Write summary notice to log file indicating start of test suite appendFile (logFile suiteLog) $ summarizeSuiteStart testName' diff --git a/cabal-install/src/Distribution/Client/InstallSymlink.hs b/cabal-install/src/Distribution/Client/InstallSymlink.hs index 319161a3343..32823ddec6f 100644 --- a/cabal-install/src/Distribution/Client/InstallSymlink.hs +++ b/cabal-install/src/Distribution/Client/InstallSymlink.hs @@ -146,7 +146,8 @@ symlinkBinaries publicBinDir <- canonicalizePath symlinkBinDir -- TODO: do we want to do this here? : -- createDirectoryIfMissing True publicBinDir - catMaybes <$> sequenceA + catMaybes + <$> sequenceA [ do privateBinDir <- pkgBinDir pkg ipid ok <- diff --git a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs index 799b8932401..a48bc135710 100644 --- a/cabal-install/src/Distribution/Client/ProjectOrchestration.hs +++ b/cabal-install/src/Distribution/Client/ProjectOrchestration.hs @@ -455,7 +455,8 @@ runProjectBuildPhase verbosity ProjectBaseContext{..} ProjectBuildContext{..} = - Map.union (previousBuildOutcomes pkgsBuildStatus) <$> rebuildTargets + Map.union (previousBuildOutcomes pkgsBuildStatus) + <$> rebuildTargets verbosity projectConfig distDirLayout diff --git a/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs b/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs index bf32b15eac1..82e90976013 100644 --- a/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs +++ b/cabal-install/src/Distribution/Client/ProjectPlanOutput.hs @@ -854,7 +854,8 @@ writePlanGhcEnvironment | compilerFlavor compiler == GHC , supportsPkgEnvFiles (getImplInfo compiler) = -- TODO: check ghcjs compat - Just <$> writeGhcEnvironmentFile + Just + <$> writeGhcEnvironmentFile path platform (compilerVersion compiler) From 5eabbc0bc808b9f2a91cd80b949e105e45caa18d Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Sun, 5 Jul 2026 07:38:10 -0400 Subject: [PATCH 16/19] Replace do with applicative style for leadRepo --- .../src/Distribution/Client/IndexUtils/ActiveRepos.hs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cabal-install/src/Distribution/Client/IndexUtils/ActiveRepos.hs b/cabal-install/src/Distribution/Client/IndexUtils/ActiveRepos.hs index beddb9dfc1b..3698e0638ad 100644 --- a/cabal-install/src/Distribution/Client/IndexUtils/ActiveRepos.hs +++ b/cabal-install/src/Distribution/Client/IndexUtils/ActiveRepos.hs @@ -105,9 +105,7 @@ instance Parsec ActiveRepoEntry where "repo" -> P.char ':' *> leadRepo _ -> P.unexpected $ "Unknown active repository entry type: " ++ token - leadRepo = do - r <- parsec - ActiveRepo r <$> strategyP + leadRepo = ActiveRepo <$> parsec <*> strategyP strategyP = P.option CombineStrategyMerge (P.char ':' *> parsec) From f026b3f059c03964eefae2d92afe4c755e219a4f Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Sun, 5 Jul 2026 07:43:25 -0400 Subject: [PATCH 17/19] Remove redundant brackets --- .../UnitTests/Distribution/Client/ArbitraryInstances.hs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs b/cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs index 3a4c35f1eb2..50f41e3eff1 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs @@ -110,10 +110,8 @@ instance Arbitrary URI where <*> pure "" instance Arbitrary URIAuth where - arbitrary = - -- no password as this does not roundtrip - (URIAuth "" <$> arbitraryURIToken) - <*> arbitraryURIPort + -- no password as this does not roundtrip + arbitrary = URIAuth "" <$> arbitraryURIToken <*> arbitraryURIPort arbitraryURIToken :: Gen String arbitraryURIToken = From 91914a54cf03e07da82267da1565b60b2ba5d805 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Sun, 5 Jul 2026 07:51:33 -0400 Subject: [PATCH 18/19] Float liftIO outside filter --- cabal-install/src/Distribution/Client/FileMonitor.hs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cabal-install/src/Distribution/Client/FileMonitor.hs b/cabal-install/src/Distribution/Client/FileMonitor.hs index 9fc8e25d97a..2a6ae7ef79b 100644 --- a/cabal-install/src/Distribution/Client/FileMonitor.hs +++ b/cabal-install/src/Distribution/Client/FileMonitor.hs @@ -579,8 +579,7 @@ probeMonitorStateFiles Just mtime' -> do -- directory modification time changed: -- a matching file may have been added or deleted - matches <- - filter (matchGlobPieces glob) <$> liftIO (listDirectory (root dirName)) + matches <- liftIO $ filter (matchGlobPieces glob) <$> listDirectory (root dirName) traverse_ probeMergeResult $ mergeBy @@ -782,8 +781,7 @@ probeMonitorStateGlobRel Just mtime' -> do -- directory modification time changed: -- a matching file may have been added or deleted - matches <- - filter (matchGlobPieces glob) <$> liftIO (listDirectory (root dirName)) + matches <- liftIO $ filter (matchGlobPieces glob) <$> listDirectory (root dirName) traverse_ probeMergeResult $ mergeBy From e241b165960d8c8b33dd5443c7160d74f813f558 Mon Sep 17 00:00:00 2001 From: Phil de Joux Date: Sun, 5 Jul 2026 08:32:59 -0400 Subject: [PATCH 19/19] Remove redundant brackets --- Cabal-syntax/src/Distribution/Types/CondTree.hs | 3 +-- .../tests/UnitTests/Distribution/Client/ProjectConfig.hs | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cabal-syntax/src/Distribution/Types/CondTree.hs b/Cabal-syntax/src/Distribution/Types/CondTree.hs index ce817b1f91e..5569d54666d 100644 --- a/Cabal-syntax/src/Distribution/Types/CondTree.hs +++ b/Cabal-syntax/src/Distribution/Types/CondTree.hs @@ -119,8 +119,7 @@ traverseCondTreeV f (CondNode a ifs) = -- | @@Traversal@@ for the data traverseCondBranchA :: L.Traversal (CondBranch v a) (CondBranch v b) a b traverseCondBranchA f (CondBranch cnd t me) = - (CondBranch cnd <$> traverseCondTreeA f t) - <*> traverse (traverseCondTreeA f) me + CondBranch cnd <$> traverseCondTreeA f t <*> traverse (traverseCondTreeA f) me -- | @@Traversal@@ for the variables traverseCondBranchV :: L.Traversal (CondBranch v a) (CondBranch w a) v w diff --git a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs index 6eac8a04fa6..3f5a47834a1 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/ProjectConfig.hs @@ -630,7 +630,8 @@ instance Arbitrary ProjectConfigShared where shrink ProjectConfigShared{..} = runShrinker $ - (ProjectConfigShared <$> shrinker projectConfigDistDir) + ProjectConfigShared + <$> shrinker projectConfigDistDir <*> shrinker projectConfigConfigFile <*> shrinker projectConfigProjectDir <*> shrinker projectConfigProjectFile