Skip to content

Commit

Permalink
Move common dependency resolver types into shared module
Browse files Browse the repository at this point in the history
  • Loading branch information
dcoutts committed May 28, 2008
1 parent 2f656c1 commit ba4929b
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 28 deletions.
15 changes: 6 additions & 9 deletions Hackage/Dependency.hs
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import qualified Hackage.InstallPlan as InstallPlan
import Hackage.InstallPlan (InstallPlan)
import Hackage.Types
( UnresolvedDependency(..), AvailablePackage(..) )
import Hackage.Dependency.Types
( DependencyResolver )
import Distribution.Package
( PackageIdentifier(..), packageVersion, packageName
, Dependency(..), Package(..), PackageFixedDeps(..) )
Expand All @@ -41,6 +43,9 @@ import Data.List (maximumBy)
import Data.Monoid (Monoid(mempty))
import Control.Exception (assert)

defaultResolver :: DependencyResolver a
defaultResolver = naiveResolver

resolveDependencies :: OS
-> Arch
-> CompilerId
Expand All @@ -49,7 +54,7 @@ resolveDependencies :: OS
-> [UnresolvedDependency]
-> Either [Dependency] (InstallPlan a)
resolveDependencies os arch comp (Just installed) available deps =
dependencyResolver naiveResolver
dependencyResolver defaultResolver
os arch comp installed available deps

resolveDependencies os arch comp Nothing available deps =
Expand All @@ -70,14 +75,6 @@ hideBasePackage :: Package p => PackageIndex p -> PackageIndex p
hideBasePackage = PackageIndex.deletePackageName "base"
. PackageIndex.deletePackageName "ghc-prim"

type DependencyResolver a = OS
-> Arch
-> CompilerId
-> PackageIndex InstalledPackageInfo
-> PackageIndex AvailablePackage
-> [UnresolvedDependency]
-> Either [Dependency] [InstallPlan.PlanPackage a]

dependencyResolver
:: DependencyResolver a
-> OS -> Arch -> CompilerId
Expand Down
15 changes: 3 additions & 12 deletions Hackage/Dependency/Bogus.hs
Original file line number Diff line number Diff line change
Expand Up @@ -17,19 +17,16 @@ module Hackage.Dependency.Bogus (

import qualified Distribution.Simple.PackageIndex as PackageIndex
import Distribution.Simple.PackageIndex (PackageIndex)
import Distribution.InstalledPackageInfo (InstalledPackageInfo)
import qualified Hackage.InstallPlan as InstallPlan
import Hackage.Types
( UnresolvedDependency(..), AvailablePackage(..)
, ConfiguredPackage(..) )
import Hackage.Dependency.Types
( DependencyResolver )
import Distribution.Package
( PackageIdentifier(..), Dependency(..), Package(..) )
import Distribution.PackageDescription.Configuration
( finalizePackageDescription)
import Distribution.Compiler
( CompilerId )
import Distribution.System
( OS, Arch )
import Distribution.Simple.Utils (comparing)

import Data.List (maximumBy)
Expand All @@ -39,13 +36,7 @@ import Data.List (maximumBy)
-- We need this for hugs and nhc98 which do not track installed packages.
-- We just pretend that everything is installed and hope for the best.
--
bogusResolver :: OS
-> Arch
-> CompilerId
-> PackageIndex InstalledPackageInfo
-> PackageIndex AvailablePackage
-> [UnresolvedDependency]
-> Either [Dependency] [InstallPlan.PlanPackage a]
bogusResolver :: DependencyResolver a
bogusResolver os arch comp _ available deps =
case unzipEithers (map resolveFromAvailable deps) of
(ok, []) -> Right ok
Expand Down
10 changes: 3 additions & 7 deletions Hackage/Dependency/Naive.hs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import qualified Hackage.InstallPlan as InstallPlan
import Hackage.Types
( UnresolvedDependency(..), AvailablePackage(..)
, ConfiguredPackage(..) )
import Hackage.Dependency.Types
( DependencyResolver )
import Distribution.Package
( PackageIdentifier(..), Dependency(..), Package(..) )
import Distribution.PackageDescription
Expand All @@ -44,13 +46,7 @@ import Data.List (maximumBy)
import Data.Maybe (fromMaybe)
import Data.Monoid (Monoid(mappend))

naiveResolver :: OS
-> Arch
-> CompilerId
-> PackageIndex InstalledPackageInfo
-> PackageIndex AvailablePackage
-> [UnresolvedDependency]
-> Either [Dependency] [InstallPlan.PlanPackage a]
naiveResolver :: DependencyResolver a
naiveResolver os arch comp installed available deps =
packagesToInstall installed
[ resolveDependency os arch comp installed available dep flags
Expand Down
48 changes: 48 additions & 0 deletions Hackage/Dependency/Types.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
-----------------------------------------------------------------------------
-- |
-- Module : Hackage.Dependency.Types
-- Copyright : (c) Duncan Coutts 2008
-- License : BSD-like
--
-- Maintainer : cabal-devel@haskell.org
-- Stability : provisional
-- Portability : portable
--
-- Common types for dependency resolution.
-----------------------------------------------------------------------------
module Hackage.Dependency.Types (
DependencyResolver,
) where

import Hackage.Types
( UnresolvedDependency(..), AvailablePackage(..) )
import qualified Hackage.InstallPlan as InstallPlan

import Distribution.Package
( Dependency )
import Distribution.InstalledPackageInfo
( InstalledPackageInfo )
import Distribution.Simple.PackageIndex
( PackageIndex )
import Distribution.Compiler
( CompilerId )
import Distribution.System
( OS, Arch )

import Prelude hiding (fail)

-- | A dependency resolver is a function that works out an installation plan
-- given the set of installed and available packages and a set of deps to
-- solve for.
--
-- The reason for this interface is because there are dozens of approaches to
-- solving the package dependency problem and we want to make it easy to swap
-- in alternatives.
--
type DependencyResolver a = OS
-> Arch
-> CompilerId
-> PackageIndex InstalledPackageInfo
-> PackageIndex AvailablePackage
-> [UnresolvedDependency]
-> Either [Dependency] [InstallPlan.PlanPackage a]
1 change: 1 addition & 0 deletions cabal-install.cabal
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ Executable cabal
Hackage.Dependency
Hackage.Dependency.Bogus
Hackage.Dependency.Naive
Hackage.Dependency.Types
Hackage.Fetch
Hackage.HttpUtils
Hackage.IndexUtils
Expand Down

0 comments on commit ba4929b

Please sign in to comment.