From 0cac1f3a53e099e942d3886075fd5d5475db642c Mon Sep 17 00:00:00 2001
From: Artem Pelenitsyn <a.pelenitsyn@gmail.com>
Date: Sun, 15 Oct 2023 18:27:42 +0000
Subject: [PATCH] GHC 9.8 compat: pacify -Wx-partial

---
 cabal-install/src/Distribution/Client/Dependency.hs  |  6 ++++--
 .../Client/Init/NonInteractive/Command.hs            | 12 +++++++++---
 .../Client/Init/NonInteractive/Heuristics.hs         |  6 +++---
 cabal-install/src/Distribution/Client/InstallPlan.hs | 10 +++++-----
 cabal-install/src/Distribution/Client/Upload.hs      | 10 ++++++----
 cabal-install/tests/IntegrationTests2.hs             |  8 ++++----
 .../UnitTests/Distribution/Client/InstallPlan.hs     |  3 +--
 .../tests/UnitTests/Distribution/Client/Targets.hs   |  5 ++++-
 cabal-testsuite/src/Test/Cabal/Prelude.hs            |  2 +-
 9 files changed, 37 insertions(+), 25 deletions(-)

diff --git a/cabal-install/src/Distribution/Client/Dependency.hs b/cabal-install/src/Distribution/Client/Dependency.hs
index 544ad59a34..37e0cbdf1e 100644
--- a/cabal-install/src/Distribution/Client/Dependency.hs
+++ b/cabal-install/src/Distribution/Client/Dependency.hs
@@ -67,7 +67,6 @@ module Distribution.Client.Dependency
   ) where
 
 import Distribution.Client.Compat.Prelude
-import qualified Prelude as Unsafe (head)
 
 import Distribution.Client.Dependency.Types
   ( PackagesPreferenceDefault (..)
@@ -950,8 +949,11 @@ planPackagesProblems platform cinfo pkgs =
   , let packageProblems = configuredPackageProblems platform cinfo pkg
   , not (null packageProblems)
   ]
-    ++ [ DuplicatePackageSolverId (Graph.nodeKey (Unsafe.head dups)) dups
+    ++ [ DuplicatePackageSolverId (Graph.nodeKey aDup) dups
        | dups <- duplicatesBy (comparing Graph.nodeKey) pkgs
+       , aDup <- case dups of
+          [] -> []
+          (ad : _) -> [ad]
        ]
 
 data PackageProblem
diff --git a/cabal-install/src/Distribution/Client/Init/NonInteractive/Command.hs b/cabal-install/src/Distribution/Client/Init/NonInteractive/Command.hs
index 8c37cad96f..7eee9f82f7 100644
--- a/cabal-install/src/Distribution/Client/Init/NonInteractive/Command.hs
+++ b/cabal-install/src/Distribution/Client/Init/NonInteractive/Command.hs
@@ -40,7 +40,7 @@ import Distribution.Client.Init.Types
 import Distribution.Client.Compat.Prelude hiding (getLine, head, last, putStr, putStrLn)
 import Prelude ()
 
-import Data.List (head, last)
+import Data.List (last)
 import qualified Data.List.NonEmpty as NEL
 
 import Distribution.CabalSpecVersion (CabalSpecVersion (..))
@@ -340,12 +340,18 @@ packageTypeHeuristics flags = getPackageType flags $ guessPackageType flags
 --   to a default value.
 mainFileHeuristics :: Interactive m => InitFlags -> m HsFilePath
 mainFileHeuristics flags = do
-  appDir <- head <$> appDirsHeuristics flags
+  appDirs <- appDirsHeuristics flags
+  let appDir = case appDirs of
+        [] -> error "impossible: appDirsHeuristics returned empty list of dirs"
+        (appDir' : _) -> appDir'
   getMainFile flags . guessMainFile $ appDir
 
 testMainHeuristics :: Interactive m => InitFlags -> m HsFilePath
 testMainHeuristics flags = do
-  testDir <- head <$> testDirsHeuristics flags
+  testDirs' <- testDirsHeuristics flags
+  let testDir = case testDirs' of
+        [] -> error "impossible: testDirsHeuristics returned empty list of dirs"
+        (testDir' : _) -> testDir'
   guessMainFile testDir
 
 initializeTestSuiteHeuristics :: Interactive m => InitFlags -> m Bool
diff --git a/cabal-install/src/Distribution/Client/Init/NonInteractive/Heuristics.hs b/cabal-install/src/Distribution/Client/Init/NonInteractive/Heuristics.hs
index 0fe0129d2c..138f968455 100644
--- a/cabal-install/src/Distribution/Client/Init/NonInteractive/Heuristics.hs
+++ b/cabal-install/src/Distribution/Client/Init/NonInteractive/Heuristics.hs
@@ -54,9 +54,9 @@ guessMainFile pkgDir = do
     then do
       files <- filter isMain <$> listFilesRecursive pkgDir
       return $
-        if null files
-          then defaultMainIs
-          else toHsFilePath $ L.head files
+        case files of
+          [] -> defaultMainIs
+          (f : _) -> toHsFilePath f
     else return defaultMainIs
 
 -- | Juggling characters around to guess the desired cabal version based on
diff --git a/cabal-install/src/Distribution/Client/InstallPlan.hs b/cabal-install/src/Distribution/Client/InstallPlan.hs
index 1a8042d6ba..46212baacc 100644
--- a/cabal-install/src/Distribution/Client/InstallPlan.hs
+++ b/cabal-install/src/Distribution/Client/InstallPlan.hs
@@ -72,9 +72,9 @@ module Distribution.Client.InstallPlan
   , reverseDependencyClosure
   ) where
 
-import Distribution.Client.Compat.Prelude hiding (lookup, tail, toList)
+import Distribution.Client.Compat.Prelude hiding (lookup, toList)
 import Distribution.Compat.Stack (WithCallStack)
-import Prelude (tail)
+import Prelude ()
 
 import Distribution.Client.Types hiding (BuildOutcomes)
 import qualified Distribution.PackageDescription as PD
@@ -757,13 +757,13 @@ failed
   -> ([srcpkg], Processing)
 failed plan (Processing processingSet completedSet failedSet) pkgid =
   assert (pkgid `Set.member` processingSet) $
-    assert (all (`Set.notMember` processingSet) (tail newlyFailedIds)) $
-      assert (all (`Set.notMember` completedSet) (tail newlyFailedIds)) $
+    assert (all (`Set.notMember` processingSet) (drop 1 newlyFailedIds)) $
+      assert (all (`Set.notMember` completedSet) (drop 1 newlyFailedIds)) $
         -- but note that some newlyFailed may already be in the failed set
         -- since one package can depend on two packages that both fail and
         -- so would be in the rev-dep closure for both.
         assert (processingInvariant plan processing') $
-          ( map asConfiguredPackage (tail newlyFailed)
+          ( map asConfiguredPackage (drop 1 newlyFailed)
           , processing'
           )
   where
diff --git a/cabal-install/src/Distribution/Client/Upload.hs b/cabal-install/src/Distribution/Client/Upload.hs
index c7abe8b91e..6e96fa0eaf 100644
--- a/cabal-install/src/Distribution/Client/Upload.hs
+++ b/cabal-install/src/Distribution/Client/Upload.hs
@@ -1,7 +1,7 @@
 module Distribution.Client.Upload (upload, uploadDoc, report) where
 
 import Distribution.Client.Compat.Prelude
-import qualified Prelude as Unsafe (head, read, tail)
+import qualified Prelude as Unsafe (read)
 
 import Distribution.Client.HttpUtils
   ( HttpTransport (..)
@@ -155,11 +155,13 @@ uploadDoc verbosity repoCtxt mToken mUsername mPassword isCandidate path = do
         break
           (== '-')
           (reverse (takeFileName path))
-      pkgid = reverse $ Unsafe.tail reversePkgid
+      pkgid = reverse $ drop 1 reversePkgid
   when
     ( reverse reverseSuffix /= "docs.tar.gz"
-        || null reversePkgid
-        || Unsafe.head reversePkgid /= '-'
+        || ( case reversePkgid of
+              [] -> True
+              (c : _) -> c /= '-'
+           )
     )
     $ dieWithException verbosity ExpectedMatchingFileName
 
diff --git a/cabal-install/tests/IntegrationTests2.hs b/cabal-install/tests/IntegrationTests2.hs
index bf6e25c5b8..55ea3747b9 100644
--- a/cabal-install/tests/IntegrationTests2.hs
+++ b/cabal-install/tests/IntegrationTests2.hs
@@ -80,7 +80,6 @@ import Test.Tasty
 import Test.Tasty.HUnit
 import Test.Tasty.Options
 import Data.Tagged (Tagged(..))
-import qualified Data.List as L
 
 import qualified Data.ByteString as BS
 import Distribution.Client.GlobalFlags (GlobalFlags, globalNix)
@@ -2180,9 +2179,10 @@ testConfigOptionComments = do
   where
     -- | Find lines containing a target string.
     findLineWith :: Bool -> String -> String -> String
-    findLineWith isComment target text
-      | not . null $ findLinesWith isComment target text = removeCommentValue . L.head $ findLinesWith isComment target text
-      | otherwise  = text
+    findLineWith isComment target text =
+      case findLinesWith isComment target text of
+        [] -> text
+        (l : _) -> removeCommentValue l
     findLinesWith :: Bool -> String -> String -> [String]
     findLinesWith isComment target
       | isComment = filter (isInfixOf (" " ++ target ++ ":")) . lines
diff --git a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs
index b708ea8030..39c719f2e1 100644
--- a/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs
+++ b/cabal-install/tests/UnitTests/Distribution/Client/InstallPlan.hs
@@ -5,7 +5,6 @@
 module UnitTests.Distribution.Client.InstallPlan (tests) where
 
 import Distribution.Client.Compat.Prelude
-import qualified Prelude as Unsafe (tail)
 
 import Distribution.Client.InstallPlan (GenericInstallPlan, IsUnit)
 import qualified Distribution.Client.InstallPlan as InstallPlan
@@ -285,7 +284,7 @@ arbitraryAcyclicGraph genNRanks genNPerRank edgeChance = do
   nranks <- genNRanks
   rankSizes <- replicateM nranks genNPerRank
   let rankStarts = scanl (+) 0 rankSizes
-      rankRanges = drop 1 (zip rankStarts (Unsafe.tail rankStarts))
+      rankRanges = drop 1 (zip rankStarts (drop 1 rankStarts))
       totalRange = sum rankSizes
   rankEdges <- traverse (uncurry genRank) rankRanges
   return $ buildG (0, totalRange - 1) (concat rankEdges)
diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Targets.hs b/cabal-install/tests/UnitTests/Distribution/Client/Targets.hs
index 060dbdffe4..ac6d96cc15 100644
--- a/cabal-install/tests/UnitTests/Distribution/Client/Targets.hs
+++ b/cabal-install/tests/UnitTests/Distribution/Client/Targets.hs
@@ -43,7 +43,10 @@ tests =
       "readUserConstraints"
       (uncurry readUserConstraintsTest)
       [ -- First example only.
-        (head exampleStrs, take 1 exampleUcs)
+
+        ( case exampleStrs of (e : _) -> e; _ -> error "empty examples"
+        , take 1 exampleUcs
+        )
       , -- All examples separated by commas.
         (intercalate ", " exampleStrs, exampleUcs)
       ]
diff --git a/cabal-testsuite/src/Test/Cabal/Prelude.hs b/cabal-testsuite/src/Test/Cabal/Prelude.hs
index e89481f13d..2c54deaa2a 100644
--- a/cabal-testsuite/src/Test/Cabal/Prelude.hs
+++ b/cabal-testsuite/src/Test/Cabal/Prelude.hs
@@ -1163,7 +1163,7 @@ findDependencyInStore :: FilePath -- ^store dir
                       -> String -- ^package name prefix
                       -> IO FilePath -- ^package dir
 findDependencyInStore storeDir pkgName = do
-    storeDirForGhcVersion <- head <$> listDirectory storeDir
+    (storeDirForGhcVersion : _) <- listDirectory storeDir
     packageDirs <- listDirectory (storeDir </> storeDirForGhcVersion)
     -- Ideally, we should call 'hashedInstalledPackageId' from 'Distribution.Client.PackageHash'.
     -- But 'PackageHashInputs', especially 'PackageHashConfigInputs', is too hard to construct.
-- 
GitLab