git.iko.soy/typeable/cabal2nix
on master help sign in
selectLatestVersions: order packages by package version, then GHC version, then alphabetically
commit62dcc0cb8c864417de4791496e051b162b68cfd6 authorPeter Simons <simons@cryp.to> dateTue 16 Aug 2011, 12:47 (15 years ago) parent7919758
1 file changed+15−12
src/PackageList.hs+15−12
src/PackageList.hs+15−12
@@ -1,15 +1,24 @@
11module Main ( main ) where
22
3+import Data.Char
34import Data.List
4−import Data.Maybe
55import Data.Version
66import Distribution.Text
77import System.Process
88import Text.Regex.Posix
9+import Control.Exception ( assert )
910
1011type Pkg = (String,Version,String) -- (Name, Version, Attribute)
1112type Pkgset = [Pkg]
1213
14+comparePkgByVersion :: Pkg -> Pkg -> Ordering -- prefers the latest version
15+comparePkgByVersion (n1,v1,a1) (n2,v2,a2)
16+ | a1 == a2 = assert (n1 == n2) (compare v2 v1)
17+ | otherwise = compare a2 a1
18+
19+comparePkgByName :: Pkg -> Pkg-> Ordering
20+comparePkgByName (n1,_,_) (n2,_,_) = compare (map toLower n1) (map toLower n2)
21+
1322parseHaskellPackageName :: String -> Maybe Pkg
1423parseHaskellPackageName name =
1524 case name `regsubmatch` "^(haskellPackages[^ \t]+)[ \t]+haskell-(.*)-ghc[0-9.]+-(.*)$" of
@@ -21,19 +30,13 @@ parseHaskellPackageName name =
2130getHaskellPackageList :: IO Pkgset
2231getHaskellPackageList = do
2332 allPkgs <- fmap lines (readProcess "bash" ["-c", "exec nix-env -qaP \\* 2>/dev/tty"] "")
24− let pkgset = map parseHaskellPackageName allPkgs
25− return (sort (nub (catMaybes pkgset)))
33+ return [ p | Just p <- map parseHaskellPackageName allPkgs ]
2634
2735stripProfilingVersions :: Pkgset -> Pkgset
28−stripProfilingVersions pkgs = [ p | p@(_,_,attr) <- pkgs , not ("ghc[0-9.]+_profiling" =~ attr) ]
36+stripProfilingVersions pkgs = [ p | p@(_,_,attr) <- pkgs , not (attr =~ "ghc[0-9.]+_profiling") ]
2937
3038selectLatestVersions :: Pkgset -> Pkgset
31−selectLatestVersions = nubBy f2 . sortBy f1
32− where
33− f1 (n1,v1,a1) (n2,v2,a2)
34− | n1 == n2 = compare v2 v1
35− | otherwise = compare n1 n2
36− f2 (n1,_,_) (n2,_,_) = n1 == n2
39+selectLatestVersions = nubBy (\x y -> comparePkgByName x y == EQ) . sortBy comparePkgByVersion
3740
3841formatPackageLine :: Pkg -> String
3942formatPackageLine (name,version,attr) = show (name, showVersion version, Just url)
@@ -47,5 +50,5 @@ regsubmatch buf patt = let (_,_,_,x) = f in x
4750
4851main :: IO ()
4952main = do
50− pkgs <- fmap (selectLatestVersions . stripProfilingVersions) getHaskellPackageList
51− mapM_ (putStrLn . formatPackageLine) pkgs
53+ pkgset <- fmap (selectLatestVersions . stripProfilingVersions) getHaskellPackageList
54+ mapM_ (putStrLn . formatPackageLine) (sortBy comparePkgByName pkgset)