module Hix.Managed.Cabal.Mock.InstalledPackage where

import Distribution.InstalledPackageInfo (InstalledPackageInfo (..), emptyInstalledPackageInfo)
import Distribution.Package (UnitId, mkUnitId)
import qualified Distribution.Simple.PackageIndex as PackageIndex
import Distribution.Simple.PackageIndex (InstalledPackageIndex)

import qualified Hix.Data.PackageId as PackageId
import Hix.Data.PackageId (PackageId)
import Hix.Managed.Cabal.Data.Packages (InstalledPackages (InstalledPackages))
import Hix.Pretty (showP)

mockUnitId :: PackageId -> UnitId
mockUnitId :: PackageId -> UnitId
mockUnitId = String -> UnitId
mkUnitId (String -> UnitId) -> (PackageId -> String) -> PackageId -> UnitId
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PackageId -> String
forall b a. (Pretty a, IsString b) => a -> b
showP

installedPackageInfo :: PackageId -> [UnitId] -> InstalledPackageInfo
installedPackageInfo :: PackageId -> [UnitId] -> InstalledPackageInfo
installedPackageInfo PackageId
package [UnitId]
depends =
  InstalledPackageInfo
emptyInstalledPackageInfo {
    sourcePackageId :: PackageId
sourcePackageId = PackageId -> PackageId
PackageId.toCabal PackageId
package,
    installedUnitId :: UnitId
installedUnitId = PackageId -> UnitId
mockUnitId PackageId
package,
    [UnitId]
depends :: [UnitId]
depends :: [UnitId]
depends
  }

mockInstalledPackageIndex :: InstalledPackages -> InstalledPackageIndex
mockInstalledPackageIndex :: InstalledPackages -> InstalledPackageIndex
mockInstalledPackageIndex =
  [InstalledPackageInfo] -> InstalledPackageIndex
PackageIndex.fromList ([InstalledPackageInfo] -> InstalledPackageIndex)
-> (InstalledPackages -> [InstalledPackageInfo])
-> InstalledPackages
-> InstalledPackageIndex
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  ((PackageId, [PackageId]) -> InstalledPackageInfo)
-> [(PackageId, [PackageId])] -> [InstalledPackageInfo]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((PackageId -> [UnitId] -> InstalledPackageInfo)
-> (PackageId, [UnitId]) -> InstalledPackageInfo
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry PackageId -> [UnitId] -> InstalledPackageInfo
installedPackageInfo ((PackageId, [UnitId]) -> InstalledPackageInfo)
-> ((PackageId, [PackageId]) -> (PackageId, [UnitId]))
-> (PackageId, [PackageId])
-> InstalledPackageInfo
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([PackageId] -> [UnitId])
-> (PackageId, [PackageId]) -> (PackageId, [UnitId])
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second ((PackageId -> UnitId) -> [PackageId] -> [UnitId]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap PackageId -> UnitId
mockUnitId)) ([(PackageId, [PackageId])] -> [InstalledPackageInfo])
-> (InstalledPackages -> [(PackageId, [PackageId])])
-> InstalledPackages
-> [InstalledPackageInfo]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  InstalledPackages -> [(PackageId, [PackageId])]
forall a b. Coercible a b => a -> b
coerce