arch-hs-0.14: sync/Utils.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
module Utils
( linkedHaskellPackages,
linkedHaskellPackageDescs,
)
where
import Control.Monad (unless)
import qualified Data.Map.Strict as Map
import Distribution.ArchHs.Exception
import Distribution.ArchHs.Hackage
import Distribution.ArchHs.Internal.Prelude
import Distribution.ArchHs.Name
import Distribution.ArchHs.PP
import Distribution.ArchHs.Types
linkedHaskellPackages ::
Members [ExtraEnv, HackageEnv, WithMyErr, Embed IO] r =>
Sem r [(ArchLinuxName, ArchLinuxVersion, GenericPackageDescription)]
linkedHaskellPackages =
fmap (\(name, desc, cabal) -> (name, _version desc, cabal)) <$> linkedHaskellPackageDescs
linkedHaskellPackageDescs ::
Members [ExtraEnv, HackageEnv, WithMyErr, Embed IO] r =>
Sem r [(ArchLinuxName, PkgDesc, GenericPackageDescription)]
linkedHaskellPackageDescs = do
extraHaskellPackages <- filter (isHaskellPackage . fst) . Map.toList <$> ask @ExtraDB
hackagePackages <- Map.keys <$> ask @HackageDB
let go xs ys ((name, desc) : pkgs) =
let hName = toHackageName name
in if hName `elem` hackagePackages
then getLatestCabal hName >>= \cabal -> go ((name, desc, cabal) : xs) ys pkgs
else go xs (name : ys) pkgs
go xs ys [] = pure (xs, ys)
(linked, unlinked) <- go [] [] extraHaskellPackages
embed $
unless (null unlinked) $ do
printWarn $ "Following packages in" <+> ppExtra <+> "are not linked to hackage:"
putStrLn . unlines $ unArchLinuxName <$> unlinked
pure linked