module Hix.Managed.Constraints where

import Distribution.Version (thisVersion)

import Hix.Class.Map (nGenWith, nMap, nTransform)
import Hix.Data.Bounds (Ranges)
import Hix.Data.PackageName (PackageName)
import Hix.Data.Version (Version, Versions)
import Hix.Data.VersionBounds (VersionBounds, anyBounds)
import Hix.Managed.Data.Constraints (EnvConstraints, MutationConstraints (..))
import Hix.Managed.Data.Mutable (MutableDep (MutableDep), MutableVersions)

noBounds :: MutationConstraints
noBounds :: MutationConstraints
noBounds = MutationConstraints
forall a. Monoid a => a
mempty {$sel:mutation:MutationConstraints :: VersionBounds
mutation = VersionBounds
anyBounds}

forDeps :: (PackageName -> MutationConstraints) -> Set MutableDep -> EnvConstraints
forDeps :: (PackageName -> MutationConstraints)
-> Set MutableDep -> EnvConstraints
forDeps PackageName -> MutationConstraints
f =
  (MutableDep -> (PackageName, MutationConstraints))
-> Set MutableDep -> EnvConstraints
forall (t :: * -> *) map k v sort a.
(Foldable t, NMap map k v sort) =>
(a -> (k, v)) -> t a -> map
nGenWith \ (MutableDep PackageName
package) -> (PackageName
package, PackageName -> MutationConstraints
f PackageName
package)

fromVersions :: (Version -> VersionBounds) -> MutableVersions -> EnvConstraints
fromVersions :: (Version -> VersionBounds) -> MutableVersions -> EnvConstraints
fromVersions Version -> VersionBounds
bound =
  (MutableDep -> Maybe Version -> (PackageName, MutationConstraints))
-> MutableVersions -> EnvConstraints
forall map1 k1 v1 sort1 map2 k2 v2 sort2.
(NMap map1 k1 v1 sort1, NMap map2 k2 v2 sort2) =>
(k1 -> v1 -> (k2, v2)) -> map1 -> map2
nTransform \ (MutableDep PackageName
package) Maybe Version
v -> (PackageName
package, MutationConstraints
forall a. Monoid a => a
mempty {$sel:mutation:MutationConstraints :: VersionBounds
mutation = (Version -> VersionBounds) -> Maybe Version -> VersionBounds
forall m a. Monoid m => (a -> m) -> Maybe a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap Version -> VersionBounds
bound Maybe Version
v})

preferRanges :: Ranges -> EnvConstraints
preferRanges :: Ranges -> EnvConstraints
preferRanges =
  (VersionRange -> MutationConstraints) -> Ranges -> EnvConstraints
forall map1 k v1 sort1 map2 v2 sort2.
(NMap map1 k v1 sort1, NMap map2 k v2 sort2) =>
(v1 -> v2) -> map1 -> map2
nMap \ VersionRange
range -> MutationConstraints
forall a. Monoid a => a
mempty {$sel:mutation:MutationConstraints :: VersionBounds
mutation = VersionBounds
forall a. Monoid a => a
mempty, $sel:prefer:MutationConstraints :: Maybe VersionRange
prefer = VersionRange -> Maybe VersionRange
forall a. a -> Maybe a
Just VersionRange
range}

preferVersions :: Versions -> EnvConstraints
preferVersions :: Versions -> EnvConstraints
preferVersions = Ranges -> EnvConstraints
preferRanges (Ranges -> EnvConstraints)
-> (Versions -> Ranges) -> Versions -> EnvConstraints
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Version -> VersionRange) -> Versions -> Ranges
forall map1 k v1 sort1 map2 v2 sort2.
(NMap map1 k v1 sort1, NMap map2 k v2 sort2) =>
(v1 -> v2) -> map1 -> map2
nMap Version -> VersionRange
thisVersion

preferInstalled :: Set MutableDep -> EnvConstraints
preferInstalled :: Set MutableDep -> EnvConstraints
preferInstalled =
  (PackageName -> MutationConstraints)
-> Set MutableDep -> EnvConstraints
forDeps \ PackageName
_ -> MutationConstraints
forall a. Monoid a => a
mempty {$sel:mutation:MutationConstraints :: VersionBounds
mutation = VersionBounds
forall a. Monoid a => a
mempty, $sel:installed:MutationConstraints :: Maybe Bool
installed = Bool -> Maybe Bool
forall a. a -> Maybe a
Just Bool
True}

explicitBounds :: Ranges -> EnvConstraints
explicitBounds :: Ranges -> EnvConstraints
explicitBounds =
  (VersionRange -> MutationConstraints) -> Ranges -> EnvConstraints
forall map1 k v1 sort1 map2 v2 sort2.
(NMap map1 k v1 sort1, NMap map2 k v2 sort2) =>
(v1 -> v2) -> map1 -> map2
nMap \ VersionRange
range -> MutationConstraints
forall a. Monoid a => a
mempty {$sel:mutation:MutationConstraints :: VersionBounds
mutation = VersionBounds
forall a. Monoid a => a
mempty, $sel:force:MutationConstraints :: Maybe VersionRange
force = VersionRange -> Maybe VersionRange
forall a. a -> Maybe a
Just VersionRange
range}