content: -----------------------------------------------------------------------------
  -- |
  -- Module      :  Distribution.Client.Sandbox.Types
  -- Maintainer  :  cabal-devel@haskell.org
  -- Portability :  portable
  --
  -- Helpers for writing code that works both inside and outside a sandbox.
  -----------------------------------------------------------------------------
  
  module Distribution.Client.Sandbox.Types (
    UseSandbox(..), isUseSandbox, whenUsingSandbox,
    SandboxPackageInfo(..)
    ) where
  
  import Prelude ()
  import Distribution.Client.Compat.Prelude
  
  import qualified Distribution.Simple.PackageIndex as InstalledPackageIndex
  import Distribution.Client.Types (UnresolvedSourcePackage)
  
  import qualified Data.Set as S
  
  -- | Are we using a sandbox?
  data UseSandbox = UseSandbox FilePath | NoSandbox
  
  instance Monoid UseSandbox where
    mempty = NoSandbox
    mappend = (<>)
  
  instance Semigroup UseSandbox where
    NoSandbox         <> s                 = s
    u0@(UseSandbox _) <> NoSandbox         = u0
    (UseSandbox _)    <> u1@(UseSandbox _) = u1
  
  -- | Convert a @UseSandbox@ value to a boolean. Useful in conjunction with
  -- @when@.
  isUseSandbox :: UseSandbox -> Bool
  isUseSandbox (UseSandbox _) = True
  isUseSandbox NoSandbox      = False
  
  -- | Execute an action only if we're in a sandbox, feeding to it the path to the
  -- sandbox directory.
  whenUsingSandbox :: UseSandbox -> (FilePath -> IO ()) -> IO ()
  whenUsingSandbox NoSandbox               _   = return ()
  whenUsingSandbox (UseSandbox sandboxDir) act = act sandboxDir
  
  -- | Data about the packages installed in the sandbox that is passed from
  -- 'reinstallAddSourceDeps' to the solver.
  data SandboxPackageInfo = SandboxPackageInfo {
    modifiedAddSourceDependencies :: ![UnresolvedSourcePackage],
    -- ^ Modified add-source deps that we want to reinstall. These are guaranteed
    -- to be already installed in the sandbox.
  
    otherAddSourceDependencies    :: ![UnresolvedSourcePackage],
    -- ^ Remaining add-source deps. Some of these may be not installed in the
    -- sandbox.
  
    otherInstalledSandboxPackages :: !InstalledPackageIndex.InstalledPackageIndex,
    -- ^ All packages installed in the sandbox. Intersection with
    -- 'modifiedAddSourceDependencies' and/or 'otherAddSourceDependencies' can be
    -- non-empty.
  
    allAddSourceDependencies      :: !(S.Set FilePath)
    -- ^ A set of paths to all add-source dependencies, for convenience.
    }
  