module Hix.Managed.QueryDep where

import Hix.Class.Map ((!!))
import qualified Hix.Data.Overrides
import Hix.Data.VersionBounds (VersionBounds)
import Hix.Managed.Data.Initial (Initial (Initial))
import Hix.Managed.Data.Mutable (MutableBounds, MutableDep, depName)
import qualified Hix.Managed.Data.MutationState
import Hix.Managed.Data.MutationState (MutationState)
import qualified Hix.Managed.Data.QueryDep
import Hix.Managed.Data.QueryDep (QueryDep (QueryDep))
import qualified Hix.Managed.Handlers.Cabal
import Hix.Managed.Handlers.Cabal (CabalHandlers)

-- | Add the current bounds to the queried deps.
-- This is used when determining candidates.
queryDep ::
  CabalHandlers ->
  Initial MutationState ->
  MutableBounds ->
  MutableDep ->
  QueryDep
queryDep :: CabalHandlers
-> Initial MutationState -> MutableBounds -> MutableDep -> QueryDep
queryDep CabalHandlers
cabal (Initial MutationState
state) MutableBounds
bounds MutableDep
package =
  QueryDep {
    MutableDep
package :: MutableDep
package :: MutableDep
package,
    installed :: Maybe Version
installed = CabalHandlers
cabal.installedVersion PackageName
name,
    current :: Maybe Version
current = Maybe (Maybe Version) -> Maybe Version
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (MutationState
state.versions MutableVersions -> MutableDep -> Maybe (Maybe Version)
forall map k v sort l.
(NMap map k v sort, NLookup sort k v l) =>
map -> k -> l
!! MutableDep
package),
    override :: Maybe Version
override = (.version) (Override -> Version) -> Maybe Override -> Maybe Version
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MutationState
state.overrides Overrides -> PackageName -> Maybe Override
forall map k v sort l.
(NMap map k v sort, NLookup sort k v l) =>
map -> k -> l
!! PackageName
name,
    bounds :: VersionBounds
bounds = Maybe VersionBounds -> VersionBounds
forall m. Monoid m => Maybe m -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold (MutableBounds
bounds MutableBounds -> MutableDep -> Maybe VersionBounds
forall map k v sort l.
(NMap map k v sort, NLookup sort k v l) =>
map -> k -> l
!! MutableDep
package)
  }
  where
    name :: PackageName
name = MutableDep -> PackageName
depName MutableDep
package

simpleQueryDep :: MutableDep -> VersionBounds -> QueryDep
simpleQueryDep :: MutableDep -> VersionBounds -> QueryDep
simpleQueryDep MutableDep
package VersionBounds
bounds =
  QueryDep {installed :: Maybe Version
installed = Maybe Version
forall a. Maybe a
Nothing, current :: Maybe Version
current = Maybe Version
forall a. Maybe a
Nothing, override :: Maybe Version
override = Maybe Version
forall a. Maybe a
Nothing, VersionBounds
MutableDep
package :: MutableDep
bounds :: VersionBounds
package :: MutableDep
bounds :: VersionBounds
..}