module Hix.Managed.ManagedPackage where

import Hix.Class.Map (nFlatten, nKeys, nMap, nRestrictKeys, nWithoutKeys)
import Hix.Data.PackageName (LocalPackage)
import qualified Hix.Managed.Data.ManagedPackage
import Hix.Managed.Data.ManagedPackage (ManagedPackage)
import Hix.Managed.Data.Mutable (LocalRanges, MutableRanges)
import Hix.Managed.Data.Packages (Packages)
import Hix.Managed.Data.Targets (Targets, sortTargets, targetsSet)

forTargets :: Packages ManagedPackage -> [LocalPackage] -> (Targets, LocalRanges, MutableRanges)
forTargets :: Packages ManagedPackage
-> [LocalPackage] -> (Targets, LocalRanges, MutableRanges)
forTargets Packages ManagedPackage
packages [LocalPackage]
targetNames =
  (Targets
targets, LocalRanges
local, MutableRanges
mutable)
  where
    mutable :: MutableRanges
mutable = (VersionRange -> VersionRange)
-> Packages MutableRanges -> MutableRanges
forall map1 map2 map3 k1 k2 v1 v2 s1 s2.
(Monoid map2, NMap map1 k1 map2 LookupMonoid, NMap map2 k2 v1 s1,
 NMap map3 k2 v2 s2) =>
(v1 -> v2) -> map1 -> map3
nFlatten VersionRange -> VersionRange
forall a. a -> a
id ((ManagedPackage -> MutableRanges)
-> Packages ManagedPackage -> Packages MutableRanges
forall map1 k v1 sort1 map2 v2 sort2.
(NMap map1 k v1 sort1, NMap map2 k v2 sort2) =>
(v1 -> v2) -> map1 -> map2
nMap (.mutable) Packages ManagedPackage
targetPackages :: Packages MutableRanges)

    -- Remove the targets from the local deps
    local :: LocalRanges
local = Set LocalPackage -> LocalRanges -> LocalRanges
forall map k v sort. NMap map k v sort => Set k -> map -> map
nWithoutKeys Set LocalPackage
tset ((VersionRange -> VersionRange)
-> Packages LocalRanges -> LocalRanges
forall map1 map2 map3 k1 k2 v1 v2 s1 s2.
(Monoid map2, NMap map1 k1 map2 LookupMonoid, NMap map2 k2 v1 s1,
 NMap map3 k2 v2 s2) =>
(v1 -> v2) -> map1 -> map3
nFlatten VersionRange -> VersionRange
forall a. a -> a
id ((ManagedPackage -> LocalRanges)
-> Packages ManagedPackage -> Packages LocalRanges
forall map1 k v1 sort1 map2 v2 sort2.
(NMap map1 k v1 sort1, NMap map2 k v2 sort2) =>
(v1 -> v2) -> map1 -> map2
nMap (.local) Packages ManagedPackage
targetPackages :: Packages LocalRanges))

    targetPackages :: Packages ManagedPackage
targetPackages = Set LocalPackage
-> Packages ManagedPackage -> Packages ManagedPackage
forall map k v sort. NMap map k v sort => Set k -> map -> map
nRestrictKeys Set LocalPackage
tset Packages ManagedPackage
packages

    tset :: Set LocalPackage
tset = Targets -> Set LocalPackage
targetsSet Targets
targets

    targets :: Targets
targets = Packages [LocalPackage] -> [LocalPackage] -> Targets
sortTargets ((LocalRanges -> [LocalPackage])
-> Packages LocalRanges -> Packages [LocalPackage]
forall map1 k v1 sort1 map2 v2 sort2.
(NMap map1 k v1 sort1, NMap map2 k v2 sort2) =>
(v1 -> v2) -> map1 -> map2
nMap LocalRanges -> [LocalPackage]
forall map k v sort. NMap map k v sort => map -> [k]
nKeys Packages LocalRanges
allLocal) [LocalPackage]
targetNames

    allLocal :: Packages LocalRanges
    allLocal :: Packages LocalRanges
allLocal = (ManagedPackage -> LocalRanges)
-> Packages ManagedPackage -> Packages LocalRanges
forall map1 k v1 sort1 map2 v2 sort2.
(NMap map1 k v1 sort1, NMap map2 k v2 sort2) =>
(v1 -> v2) -> map1 -> map2
nMap (.local) Packages ManagedPackage
packages