From 5cd32805c8f8077341b3dcc4ea8c4694623804a3 Mon Sep 17 00:00:00 2001 From: Janus Troelsen Date: Sat, 3 Sep 2022 11:31:34 -0500 Subject: [PATCH] Use NonEmpty --- .../Server/Features/PackageList.hs | 20 ++++++++++--------- .../Features/PackageList/PackageRank.hs | 15 +++++++------- .../Server/Packages/PackageIndex.hs | 10 +++++++++- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/src/Distribution/Server/Features/PackageList.hs b/src/Distribution/Server/Features/PackageList.hs index 835235e77..718354b13 100644 --- a/src/Distribution/Server/Features/PackageList.hs +++ b/src/Distribution/Server/Features/PackageList.hs @@ -34,9 +34,10 @@ import Distribution.Package import Distribution.PackageDescription import Distribution.PackageDescription.Configuration import Distribution.Utils.ShortText (fromShortText) -import Distribution.Simple.Utils (safeLast) import Control.Concurrent +import qualified Data.List.NonEmpty as NE +import Data.List.NonEmpty (NonEmpty) import Data.Maybe (mapMaybe) import Data.Map (Map) import qualified Data.Map as Map @@ -233,9 +234,9 @@ listFeature CoreFeature{..} False -> do index <- queryGetPackageIndex let pkgs = PackageIndex.lookupPackageName index pkgname - case pkgs of - [] -> return () --this shouldn't happen - _ -> modifyMemState itemCache . uncurry Map.insert =<< constructItem pkgs + case NE.nonEmpty pkgs of + Nothing -> return () --this shouldn't happen + Just ne -> modifyMemState itemCache . uncurry Map.insert =<< constructItem ne updateDesc pkgname = do index <- queryGetPackageIndex @@ -256,13 +257,14 @@ listFeature CoreFeature{..} constructItemIndex :: IO (Map PackageName PackageItem) constructItemIndex = do index <- queryGetPackageIndex - items <- mapM constructItem $ PackageIndex.allPackagesByName index - return $ Map.fromList items + let byName = PackageIndex.allPackagesByNameNE index + mPkgInfos <- traverse (mapM constructItem) (NE.nonEmpty byName) + pure $ foldMap (Map.fromList . NE.toList) mPkgInfos - constructItem :: [PkgInfo] -> IO (PackageName, PackageItem) + constructItem :: NonEmpty PkgInfo -> IO (PackageName, PackageItem) constructItem pkgs = do let pkgname = packageName pkg - pkg = last pkgs + pkg = NE.last pkgs -- [reverse index disabled] revCount <- query . GetReverseCount $ pkgname users <- queryGetUserDb tags <- queryTagsForPackage pkgname @@ -271,7 +273,7 @@ listFeature CoreFeature{..} deprs <- queryGetDeprecatedFor pkgname maintainers <- queryUserGroup (maintainersGroup pkgname) packageR <- rankPackage versions (cmFind pkgname downs) - (UserIdSet.size maintainers) documentation tar env pkgs (safeLast pkgs) + (UserIdSet.size maintainers) documentation tar env pkgs return $ (,) pkgname $ (updateDescriptionItem (pkgDesc pkg) $ emptyPackageItem pkgname) { itemTags = tags diff --git a/src/Distribution/Server/Features/PackageList/PackageRank.hs b/src/Distribution/Server/Features/PackageList/PackageRank.hs index c58f82884..ec1b1f69f 100644 --- a/src/Distribution/Server/Features/PackageList/PackageRank.hs +++ b/src/Distribution/Server/Features/PackageList/PackageRank.hs @@ -34,6 +34,8 @@ import qualified Data.ByteString.Lazy as BSL import Data.List ( maximumBy , sortBy ) +import qualified Data.List.NonEmpty as NE +import Data.List.NonEmpty ( NonEmpty ) import Data.Maybe ( isNothing ) import Data.Ord ( comparing ) import qualified Data.Time.Clock as CL @@ -296,11 +298,9 @@ rankPackage -> DocumentationFeature -> TarIndexCacheFeature -> ServerEnv - -> [PkgInfo] - -> Maybe PkgInfo + -> NonEmpty PkgInfo -> IO Float -rankPackage _ _ _ _ _ _ _ Nothing = return 0 -rankPackage versions recentDownloads maintainers docs tarCache env pkgs (Just pkgUsed) +rankPackage versions recentDownloads maintainers docs tarCache env pkgs = do t <- temporalScore pkgD uploads versionList recentDownloads @@ -317,6 +317,7 @@ rankPackage versions recentDownloads maintainers docs tarCache env pkgs (Just pk Nothing -> 1 _ -> 0.2 where + pkgUsed = NE.last pkgs pkgname = pkgName . package $ pkgD pkgD = packageDescription . pkgDesc $ pkgUsed deprP = queryGetDeprecatedFor versions pkgname @@ -324,8 +325,8 @@ rankPackage versions recentDownloads maintainers docs tarCache env pkgs (Just pk versionList :: [Version] versionList = sortBy (flip compare) - $ map (pkgVersion . package . packageDescription) (pkgDesc <$> pkgs) + $ map (pkgVersion . package . packageDescription . pkgDesc) (NE.toList pkgs) uploads = sortBy (flip compare) - $ (fst . pkgOriginalUploadInfo <$> pkgs) - ++ (fst . pkgLatestUploadInfo <$> pkgs) + $ (fst . pkgOriginalUploadInfo <$> NE.toList pkgs) + ++ (fst . pkgLatestUploadInfo <$> NE.toList pkgs) diff --git a/src/Distribution/Server/Packages/PackageIndex.hs b/src/Distribution/Server/Packages/PackageIndex.hs index 4b862d649..f48750e73 100644 --- a/src/Distribution/Server/Packages/PackageIndex.hs +++ b/src/Distribution/Server/Packages/PackageIndex.hs @@ -44,7 +44,8 @@ module Distribution.Server.Packages.PackageIndex ( -- ** Bulk queries allPackageNames, allPackages, - allPackagesByName + allPackagesByName, + allPackagesByNameNE ) where import Distribution.Server.Prelude hiding (lookup) @@ -58,6 +59,8 @@ import qualified Data.Map.Strict as Map import Data.Map.Strict (Map) import qualified Data.Foldable as Foldable import Data.List (groupBy, find, isInfixOf) +import qualified Data.List.NonEmpty as NE +import Data.List.NonEmpty (NonEmpty) import Data.SafeCopy import Distribution.Types.PackageName @@ -258,6 +261,11 @@ allPackages (PackageIndex m) = concat (Map.elems m) allPackagesByName :: Package pkg => PackageIndex pkg -> [[pkg]] allPackagesByName (PackageIndex m) = Map.elems m +allPackagesByNameNE :: Package pkg => PackageIndex pkg -> [NonEmpty pkg] +allPackagesByNameNE (PackageIndex m) = + -- This is safe because there will always be at least one version of a package + NE.fromList <$> Map.elems m + allPackageNames :: PackageIndex pkg -> [PackageName] allPackageNames (PackageIndex m) = Map.keys m