module Linspire.Debian.Package where
import qualified Data.Map as Map
import Linspire.Debian.Version
import Linspire.Debian.Relation
type PackageNameMap a = Map.Map String [a]
packageNameMap :: (a -> String) -> [a] -> PackageNameMap a
packageNameMap getName packages = foldl (\m p -> Map.insertWith (++) (getName p) [p] m) Map.empty packages
addProvides :: (p -> [PkgName]) -> [p] -> PackageNameMap p -> PackageNameMap p
addProvides providesf ps pnm =
let provides = findProvides providesf ps in
foldl (\m (packageName, package) -> Map.insertWith (flip (++)) packageName [package] m) pnm provides
findProvides :: forall p. (p -> [PkgName]) -> [p] -> [(PkgName, p)]
findProvides providesf packages = foldl addProvidesLocal [] packages
where addProvidesLocal :: [(PkgName, p)] -> p -> [(PkgName, p)]
addProvidesLocal providesList package =
foldl (\pl pkgName -> (pkgName, package): pl) providesList (providesf package)
lookupPackageByRel :: PackageNameMap a -> (a -> (String, DebianVersion)) -> Relation -> [a]
lookupPackageByRel pm packageVersionF (Rel pkgName mVerReq _) =
case Map.lookup pkgName pm of
Nothing -> []
Just packages -> filter filterVer packages
where filterVer p =
case mVerReq of
Nothing -> True
Just _ ->
let (pName, pVersion) = packageVersionF p
in if pName /= pkgName
then False
else checkVersionReq mVerReq (Just pVersion)