module Hix.Managed.Overrides where

import qualified Data.Map.Strict as Map

import Hix.Data.Monad (M)
import Hix.Data.Overrides (Override (..), Overrides (Overrides))
import qualified Hix.Data.PackageId
import Hix.Data.PackageId (PackageId (PackageId))
import Hix.Data.PackageName (PackageName)
import qualified Hix.Managed.Handlers.Hackage
import Hix.Managed.Handlers.Hackage (HackageHandlers)

packageOverride ::
  HackageHandlers ->
  PackageId ->
  M (PackageName, Override)
packageOverride :: HackageHandlers -> PackageId -> M (PackageName, Override)
packageOverride HackageHandlers
handlers package :: PackageId
package@PackageId {PackageName
name :: PackageName
name :: PackageId -> PackageName
name, Version
version :: Version
version :: PackageId -> Version
version} = do
  SourceHash
hash <- HackageHandlers
handlers.fetchHash PackageId
package
  pure (PackageName
name, Override {Version
SourceHash
version :: Version
hash :: SourceHash
hash :: SourceHash
version :: Version
..})

packageOverrides ::
  HackageHandlers ->
  [PackageId] ->
  M Overrides
packageOverrides :: HackageHandlers -> [PackageId] -> M Overrides
packageOverrides HackageHandlers
handlers [PackageId]
versions =
  Map PackageName Override -> Overrides
Overrides (Map PackageName Override -> Overrides)
-> ([(PackageName, Override)] -> Map PackageName Override)
-> [(PackageName, Override)]
-> Overrides
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(PackageName, Override)] -> Map PackageName Override
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(PackageName, Override)] -> Overrides)
-> M [(PackageName, Override)] -> M Overrides
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (PackageId -> M (PackageName, Override))
-> [PackageId] -> M [(PackageName, Override)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (HackageHandlers -> PackageId -> M (PackageName, Override)
packageOverride HackageHandlers
handlers) [PackageId]
versions