module Hix.Managed.Handlers.Build where

import Data.Aeson (FromJSON)
import Data.IORef (IORef, newIORef)

import Hix.Data.Monad (M)
import Hix.Data.Overrides (Overrides)
import Hix.Data.PackageId (PackageId)
import Hix.Data.PackageName (PackageName)
import Hix.Data.Version (Version, Versions)
import Hix.Managed.Cabal.Changes (SolverPlan)
import Hix.Managed.Cabal.Data.Config (GhcDb)
import Hix.Managed.Data.Constraints (EnvConstraints)
import Hix.Managed.Data.EnvContext (EnvContext)
import Hix.Managed.Data.EnvState (EnvState)
import Hix.Managed.Data.Initial (Initial)
import Hix.Managed.Data.ManagedPackage (ManagedPackage)
import Hix.Managed.Data.Packages (Packages)
import Hix.Managed.Data.StageState (BuildFailure (UnknownFailure), BuildResult (BuildFailure))
import qualified Hix.Managed.Handlers.Cabal as Solve
import qualified Hix.Managed.Handlers.Cabal as Cabal
import Hix.Managed.Handlers.Cabal (CabalHandlers)
import Hix.Managed.Handlers.Hackage (HackageHandlers)
import qualified Hix.Managed.Handlers.Report as Report
import Hix.Managed.Handlers.Report (ReportHandlers)
import qualified Hix.Managed.Handlers.StateFile as StateFileHandlers
import Hix.Managed.Handlers.StateFile (StateFileHandlers)
import Hix.Managed.Overrides (packageOverrides)

newtype BuildOutputsPrefix =
  BuildOutputsPrefix Text
  deriving stock (BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
(BuildOutputsPrefix -> BuildOutputsPrefix -> Bool)
-> (BuildOutputsPrefix -> BuildOutputsPrefix -> Bool)
-> Eq BuildOutputsPrefix
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
== :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
$c/= :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
/= :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
Eq, Int -> BuildOutputsPrefix -> ShowS
[BuildOutputsPrefix] -> ShowS
BuildOutputsPrefix -> String
(Int -> BuildOutputsPrefix -> ShowS)
-> (BuildOutputsPrefix -> String)
-> ([BuildOutputsPrefix] -> ShowS)
-> Show BuildOutputsPrefix
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildOutputsPrefix -> ShowS
showsPrec :: Int -> BuildOutputsPrefix -> ShowS
$cshow :: BuildOutputsPrefix -> String
show :: BuildOutputsPrefix -> String
$cshowList :: [BuildOutputsPrefix] -> ShowS
showList :: [BuildOutputsPrefix] -> ShowS
Show, (forall x. BuildOutputsPrefix -> Rep BuildOutputsPrefix x)
-> (forall x. Rep BuildOutputsPrefix x -> BuildOutputsPrefix)
-> Generic BuildOutputsPrefix
forall x. Rep BuildOutputsPrefix x -> BuildOutputsPrefix
forall x. BuildOutputsPrefix -> Rep BuildOutputsPrefix x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BuildOutputsPrefix -> Rep BuildOutputsPrefix x
from :: forall x. BuildOutputsPrefix -> Rep BuildOutputsPrefix x
$cto :: forall x. Rep BuildOutputsPrefix x -> BuildOutputsPrefix
to :: forall x. Rep BuildOutputsPrefix x -> BuildOutputsPrefix
Generic)
  deriving newtype (String -> BuildOutputsPrefix
(String -> BuildOutputsPrefix) -> IsString BuildOutputsPrefix
forall a. (String -> a) -> IsString a
$cfromString :: String -> BuildOutputsPrefix
fromString :: String -> BuildOutputsPrefix
IsString, Eq BuildOutputsPrefix
Eq BuildOutputsPrefix =>
(BuildOutputsPrefix -> BuildOutputsPrefix -> Ordering)
-> (BuildOutputsPrefix -> BuildOutputsPrefix -> Bool)
-> (BuildOutputsPrefix -> BuildOutputsPrefix -> Bool)
-> (BuildOutputsPrefix -> BuildOutputsPrefix -> Bool)
-> (BuildOutputsPrefix -> BuildOutputsPrefix -> Bool)
-> (BuildOutputsPrefix -> BuildOutputsPrefix -> BuildOutputsPrefix)
-> (BuildOutputsPrefix -> BuildOutputsPrefix -> BuildOutputsPrefix)
-> Ord BuildOutputsPrefix
BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
BuildOutputsPrefix -> BuildOutputsPrefix -> Ordering
BuildOutputsPrefix -> BuildOutputsPrefix -> BuildOutputsPrefix
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: BuildOutputsPrefix -> BuildOutputsPrefix -> Ordering
compare :: BuildOutputsPrefix -> BuildOutputsPrefix -> Ordering
$c< :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
< :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
$c<= :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
<= :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
$c> :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
> :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
$c>= :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
>= :: BuildOutputsPrefix -> BuildOutputsPrefix -> Bool
$cmax :: BuildOutputsPrefix -> BuildOutputsPrefix -> BuildOutputsPrefix
max :: BuildOutputsPrefix -> BuildOutputsPrefix -> BuildOutputsPrefix
$cmin :: BuildOutputsPrefix -> BuildOutputsPrefix -> BuildOutputsPrefix
min :: BuildOutputsPrefix -> BuildOutputsPrefix -> BuildOutputsPrefix
Ord, Maybe BuildOutputsPrefix
Value -> Parser [BuildOutputsPrefix]
Value -> Parser BuildOutputsPrefix
(Value -> Parser BuildOutputsPrefix)
-> (Value -> Parser [BuildOutputsPrefix])
-> Maybe BuildOutputsPrefix
-> FromJSON BuildOutputsPrefix
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser BuildOutputsPrefix
parseJSON :: Value -> Parser BuildOutputsPrefix
$cparseJSONList :: Value -> Parser [BuildOutputsPrefix]
parseJSONList :: Value -> Parser [BuildOutputsPrefix]
$comittedField :: Maybe BuildOutputsPrefix
omittedField :: Maybe BuildOutputsPrefix
FromJSON)

newtype BuildTimeout =
  BuildTimeout Int
  deriving stock (BuildTimeout -> BuildTimeout -> Bool
(BuildTimeout -> BuildTimeout -> Bool)
-> (BuildTimeout -> BuildTimeout -> Bool) -> Eq BuildTimeout
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildTimeout -> BuildTimeout -> Bool
== :: BuildTimeout -> BuildTimeout -> Bool
$c/= :: BuildTimeout -> BuildTimeout -> Bool
/= :: BuildTimeout -> BuildTimeout -> Bool
Eq, Int -> BuildTimeout -> ShowS
[BuildTimeout] -> ShowS
BuildTimeout -> String
(Int -> BuildTimeout -> ShowS)
-> (BuildTimeout -> String)
-> ([BuildTimeout] -> ShowS)
-> Show BuildTimeout
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildTimeout -> ShowS
showsPrec :: Int -> BuildTimeout -> ShowS
$cshow :: BuildTimeout -> String
show :: BuildTimeout -> String
$cshowList :: [BuildTimeout] -> ShowS
showList :: [BuildTimeout] -> ShowS
Show, (forall x. BuildTimeout -> Rep BuildTimeout x)
-> (forall x. Rep BuildTimeout x -> BuildTimeout)
-> Generic BuildTimeout
forall x. Rep BuildTimeout x -> BuildTimeout
forall x. BuildTimeout -> Rep BuildTimeout x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BuildTimeout -> Rep BuildTimeout x
from :: forall x. BuildTimeout -> Rep BuildTimeout x
$cto :: forall x. Rep BuildTimeout x -> BuildTimeout
to :: forall x. Rep BuildTimeout x -> BuildTimeout
Generic)
  deriving newtype (Integer -> BuildTimeout
BuildTimeout -> BuildTimeout
BuildTimeout -> BuildTimeout -> BuildTimeout
(BuildTimeout -> BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout)
-> (Integer -> BuildTimeout)
-> Num BuildTimeout
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: BuildTimeout -> BuildTimeout -> BuildTimeout
+ :: BuildTimeout -> BuildTimeout -> BuildTimeout
$c- :: BuildTimeout -> BuildTimeout -> BuildTimeout
- :: BuildTimeout -> BuildTimeout -> BuildTimeout
$c* :: BuildTimeout -> BuildTimeout -> BuildTimeout
* :: BuildTimeout -> BuildTimeout -> BuildTimeout
$cnegate :: BuildTimeout -> BuildTimeout
negate :: BuildTimeout -> BuildTimeout
$cabs :: BuildTimeout -> BuildTimeout
abs :: BuildTimeout -> BuildTimeout
$csignum :: BuildTimeout -> BuildTimeout
signum :: BuildTimeout -> BuildTimeout
$cfromInteger :: Integer -> BuildTimeout
fromInteger :: Integer -> BuildTimeout
Num, Num BuildTimeout
Ord BuildTimeout
(Num BuildTimeout, Ord BuildTimeout) =>
(BuildTimeout -> Rational) -> Real BuildTimeout
BuildTimeout -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: BuildTimeout -> Rational
toRational :: BuildTimeout -> Rational
Real, Int -> BuildTimeout
BuildTimeout -> Int
BuildTimeout -> [BuildTimeout]
BuildTimeout -> BuildTimeout
BuildTimeout -> BuildTimeout -> [BuildTimeout]
BuildTimeout -> BuildTimeout -> BuildTimeout -> [BuildTimeout]
(BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout)
-> (Int -> BuildTimeout)
-> (BuildTimeout -> Int)
-> (BuildTimeout -> [BuildTimeout])
-> (BuildTimeout -> BuildTimeout -> [BuildTimeout])
-> (BuildTimeout -> BuildTimeout -> [BuildTimeout])
-> (BuildTimeout -> BuildTimeout -> BuildTimeout -> [BuildTimeout])
-> Enum BuildTimeout
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: BuildTimeout -> BuildTimeout
succ :: BuildTimeout -> BuildTimeout
$cpred :: BuildTimeout -> BuildTimeout
pred :: BuildTimeout -> BuildTimeout
$ctoEnum :: Int -> BuildTimeout
toEnum :: Int -> BuildTimeout
$cfromEnum :: BuildTimeout -> Int
fromEnum :: BuildTimeout -> Int
$cenumFrom :: BuildTimeout -> [BuildTimeout]
enumFrom :: BuildTimeout -> [BuildTimeout]
$cenumFromThen :: BuildTimeout -> BuildTimeout -> [BuildTimeout]
enumFromThen :: BuildTimeout -> BuildTimeout -> [BuildTimeout]
$cenumFromTo :: BuildTimeout -> BuildTimeout -> [BuildTimeout]
enumFromTo :: BuildTimeout -> BuildTimeout -> [BuildTimeout]
$cenumFromThenTo :: BuildTimeout -> BuildTimeout -> BuildTimeout -> [BuildTimeout]
enumFromThenTo :: BuildTimeout -> BuildTimeout -> BuildTimeout -> [BuildTimeout]
Enum, Enum BuildTimeout
Real BuildTimeout
(Real BuildTimeout, Enum BuildTimeout) =>
(BuildTimeout -> BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout -> (BuildTimeout, BuildTimeout))
-> (BuildTimeout -> BuildTimeout -> (BuildTimeout, BuildTimeout))
-> (BuildTimeout -> Integer)
-> Integral BuildTimeout
BuildTimeout -> Integer
BuildTimeout -> BuildTimeout -> (BuildTimeout, BuildTimeout)
BuildTimeout -> BuildTimeout -> BuildTimeout
forall a.
(Real a, Enum a) =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
$cquot :: BuildTimeout -> BuildTimeout -> BuildTimeout
quot :: BuildTimeout -> BuildTimeout -> BuildTimeout
$crem :: BuildTimeout -> BuildTimeout -> BuildTimeout
rem :: BuildTimeout -> BuildTimeout -> BuildTimeout
$cdiv :: BuildTimeout -> BuildTimeout -> BuildTimeout
div :: BuildTimeout -> BuildTimeout -> BuildTimeout
$cmod :: BuildTimeout -> BuildTimeout -> BuildTimeout
mod :: BuildTimeout -> BuildTimeout -> BuildTimeout
$cquotRem :: BuildTimeout -> BuildTimeout -> (BuildTimeout, BuildTimeout)
quotRem :: BuildTimeout -> BuildTimeout -> (BuildTimeout, BuildTimeout)
$cdivMod :: BuildTimeout -> BuildTimeout -> (BuildTimeout, BuildTimeout)
divMod :: BuildTimeout -> BuildTimeout -> (BuildTimeout, BuildTimeout)
$ctoInteger :: BuildTimeout -> Integer
toInteger :: BuildTimeout -> Integer
Integral, Eq BuildTimeout
Eq BuildTimeout =>
(BuildTimeout -> BuildTimeout -> Ordering)
-> (BuildTimeout -> BuildTimeout -> Bool)
-> (BuildTimeout -> BuildTimeout -> Bool)
-> (BuildTimeout -> BuildTimeout -> Bool)
-> (BuildTimeout -> BuildTimeout -> Bool)
-> (BuildTimeout -> BuildTimeout -> BuildTimeout)
-> (BuildTimeout -> BuildTimeout -> BuildTimeout)
-> Ord BuildTimeout
BuildTimeout -> BuildTimeout -> Bool
BuildTimeout -> BuildTimeout -> Ordering
BuildTimeout -> BuildTimeout -> BuildTimeout
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: BuildTimeout -> BuildTimeout -> Ordering
compare :: BuildTimeout -> BuildTimeout -> Ordering
$c< :: BuildTimeout -> BuildTimeout -> Bool
< :: BuildTimeout -> BuildTimeout -> Bool
$c<= :: BuildTimeout -> BuildTimeout -> Bool
<= :: BuildTimeout -> BuildTimeout -> Bool
$c> :: BuildTimeout -> BuildTimeout -> Bool
> :: BuildTimeout -> BuildTimeout -> Bool
$c>= :: BuildTimeout -> BuildTimeout -> Bool
>= :: BuildTimeout -> BuildTimeout -> Bool
$cmax :: BuildTimeout -> BuildTimeout -> BuildTimeout
max :: BuildTimeout -> BuildTimeout -> BuildTimeout
$cmin :: BuildTimeout -> BuildTimeout -> BuildTimeout
min :: BuildTimeout -> BuildTimeout -> BuildTimeout
Ord, Maybe BuildTimeout
Value -> Parser [BuildTimeout]
Value -> Parser BuildTimeout
(Value -> Parser BuildTimeout)
-> (Value -> Parser [BuildTimeout])
-> Maybe BuildTimeout
-> FromJSON BuildTimeout
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser BuildTimeout
parseJSON :: Value -> Parser BuildTimeout
$cparseJSONList :: Value -> Parser [BuildTimeout]
parseJSONList :: Value -> Parser [BuildTimeout]
$comittedField :: Maybe BuildTimeout
omittedField :: Maybe BuildTimeout
FromJSON)

data EnvBuilder =
  EnvBuilder {
    EnvBuilder -> CabalHandlers
cabal :: CabalHandlers,
    EnvBuilder
-> Bool
-> Versions
-> [PackageId]
-> M (BuildResult, (Overrides, Set PackageId))
buildWithState :: Bool -> Versions -> [PackageId] -> M (BuildResult, (Overrides, Set PackageId))
  }

data Builder =
  Builder {
    Builder
-> forall a.
   CabalHandlers
   -> EnvContext -> Initial EnvState -> (EnvBuilder -> M a) -> M a
withEnvBuilder ::  a . CabalHandlers -> EnvContext -> Initial EnvState -> (EnvBuilder -> M a) -> M a
  }

runBuilder :: Builder -> CabalHandlers -> EnvContext -> Initial EnvState -> (EnvBuilder -> M a) -> M a
runBuilder :: forall a.
Builder
-> CabalHandlers
-> EnvContext
-> Initial EnvState
-> (EnvBuilder -> M a)
-> M a
runBuilder Builder {forall a.
CabalHandlers
-> EnvContext -> Initial EnvState -> (EnvBuilder -> M a) -> M a
withEnvBuilder :: Builder
-> forall a.
   CabalHandlers
   -> EnvContext -> Initial EnvState -> (EnvBuilder -> M a) -> M a
withEnvBuilder :: forall a.
CabalHandlers
-> EnvContext -> Initial EnvState -> (EnvBuilder -> M a) -> M a
withEnvBuilder} = CabalHandlers
-> EnvContext -> Initial EnvState -> (EnvBuilder -> M a) -> M a
forall a.
CabalHandlers
-> EnvContext -> Initial EnvState -> (EnvBuilder -> M a) -> M a
withEnvBuilder

data BuildHandlers =
  BuildHandlers {
    BuildHandlers -> StateFileHandlers
stateFile :: StateFileHandlers,
    BuildHandlers -> ReportHandlers
report :: ReportHandlers,
    BuildHandlers
-> Packages ManagedPackage -> GhcDb -> M CabalHandlers
cabal :: Packages ManagedPackage -> GhcDb -> M CabalHandlers,
    BuildHandlers -> forall a. (Builder -> M a) -> M a
withBuilder ::  a . (Builder -> M a) -> M a,
    BuildHandlers -> PackageName -> M [Version]
versions :: PackageName -> M [Version],
    BuildHandlers -> PackageName -> M (Maybe Version)
latestVersion :: PackageName -> M (Maybe Version)
  }

testBuilder ::
  (Bool -> Versions -> [PackageId] -> M (BuildResult, (Overrides, Set PackageId))) ->
  (Builder -> M a) ->
  M a
testBuilder :: forall a.
(Bool
 -> Versions
 -> [PackageId]
 -> M (BuildResult, (Overrides, Set PackageId)))
-> (Builder -> M a) -> M a
testBuilder Bool
-> Versions
-> [PackageId]
-> M (BuildResult, (Overrides, Set PackageId))
buildWithState Builder -> M a
use =
  Builder -> M a
use Builder {withEnvBuilder :: forall a.
CabalHandlers
-> EnvContext -> Initial EnvState -> (EnvBuilder -> M a) -> M a
withEnvBuilder = \ CabalHandlers
cabal EnvContext
_ Initial EnvState
_ EnvBuilder -> M a
useE -> EnvBuilder -> M a
useE EnvBuilder {CabalHandlers
cabal :: CabalHandlers
cabal :: CabalHandlers
cabal, Bool
-> Versions
-> [PackageId]
-> M (BuildResult, (Overrides, Set PackageId))
buildWithState :: Bool
-> Versions
-> [PackageId]
-> M (BuildResult, (Overrides, Set PackageId))
buildWithState :: Bool
-> Versions
-> [PackageId]
-> M (BuildResult, (Overrides, Set PackageId))
buildWithState}}

versionsBuilder :: HackageHandlers -> (Versions -> M BuildResult) -> (Builder -> M a) -> M a
versionsBuilder :: forall a.
HackageHandlers
-> (Versions -> M BuildResult) -> (Builder -> M a) -> M a
versionsBuilder HackageHandlers
hackage Versions -> M BuildResult
build =
  (Bool
 -> Versions
 -> [PackageId]
 -> M (BuildResult, (Overrides, Set PackageId)))
-> (Builder -> M a) -> M a
forall a.
(Bool
 -> Versions
 -> [PackageId]
 -> M (BuildResult, (Overrides, Set PackageId)))
-> (Builder -> M a) -> M a
testBuilder \ Bool
_ Versions
versions [PackageId]
overrideVersions -> do
    Overrides
overrides <- HackageHandlers -> [PackageId] -> M Overrides
packageOverrides HackageHandlers
hackage [PackageId]
overrideVersions
    BuildResult
status <- Versions -> M BuildResult
build Versions
versions
    pure (BuildResult
status, (Overrides
overrides, Set PackageId
forall a. Monoid a => a
mempty))

handlersNull :: BuildHandlers
handlersNull :: BuildHandlers
handlersNull =
  BuildHandlers {
    stateFile :: StateFileHandlers
stateFile = StateFileHandlers
StateFileHandlers.handlersNull,
    report :: ReportHandlers
report = ReportHandlers
Report.handlersNull,
    cabal :: Packages ManagedPackage -> GhcDb -> M CabalHandlers
cabal = \ Packages ManagedPackage
_ GhcDb
_ -> CabalHandlers -> M CabalHandlers
forall a. a -> M a
forall (f :: * -> *) a. Applicative f => a -> f a
pure CabalHandlers
Solve.handlersNull,
    withBuilder :: forall a. (Builder -> M a) -> M a
withBuilder = (Bool
 -> Versions
 -> [PackageId]
 -> M (BuildResult, (Overrides, Set PackageId)))
-> (Builder -> M a) -> M a
forall a.
(Bool
 -> Versions
 -> [PackageId]
 -> M (BuildResult, (Overrides, Set PackageId)))
-> (Builder -> M a) -> M a
testBuilder \ Bool
_ Versions
_ [PackageId]
_ -> (BuildResult, (Overrides, Set PackageId))
-> M (BuildResult, (Overrides, Set PackageId))
forall a. a -> M a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (BuildFailure -> BuildResult
BuildFailure BuildFailure
UnknownFailure, (Overrides, Set PackageId)
forall a. Monoid a => a
mempty),
    versions :: PackageName -> M [Version]
versions = \ PackageName
_ -> [Version] -> M [Version]
forall a. a -> M a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [],
    latestVersion :: PackageName -> M (Maybe Version)
latestVersion = \ PackageName
_ -> Maybe Version -> M (Maybe Version)
forall a. a -> M a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Version
forall a. Maybe a
Nothing
  }

wrapCabal :: (CabalHandlers -> CabalHandlers) -> BuildHandlers -> BuildHandlers
wrapCabal :: (CabalHandlers -> CabalHandlers) -> BuildHandlers -> BuildHandlers
wrapCabal CabalHandlers -> CabalHandlers
f BuildHandlers {StateFileHandlers
ReportHandlers
PackageName -> M [Version]
PackageName -> M (Maybe Version)
Packages ManagedPackage -> GhcDb -> M CabalHandlers
forall a. (Builder -> M a) -> M a
stateFile :: BuildHandlers -> StateFileHandlers
report :: BuildHandlers -> ReportHandlers
cabal :: BuildHandlers
-> Packages ManagedPackage -> GhcDb -> M CabalHandlers
withBuilder :: BuildHandlers -> forall a. (Builder -> M a) -> M a
versions :: BuildHandlers -> PackageName -> M [Version]
latestVersion :: BuildHandlers -> PackageName -> M (Maybe Version)
stateFile :: StateFileHandlers
report :: ReportHandlers
cabal :: Packages ManagedPackage -> GhcDb -> M CabalHandlers
withBuilder :: forall a. (Builder -> M a) -> M a
versions :: PackageName -> M [Version]
latestVersion :: PackageName -> M (Maybe Version)
..} =
  BuildHandlers {cabal :: Packages ManagedPackage -> GhcDb -> M CabalHandlers
cabal = \ Packages ManagedPackage
p GhcDb
d -> CabalHandlers -> CabalHandlers
f (CabalHandlers -> CabalHandlers)
-> M CabalHandlers -> M CabalHandlers
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Packages ManagedPackage -> GhcDb -> M CabalHandlers
cabal Packages ManagedPackage
p GhcDb
d, StateFileHandlers
ReportHandlers
PackageName -> M [Version]
PackageName -> M (Maybe Version)
(Builder -> M a) -> M a
forall a. (Builder -> M a) -> M a
stateFile :: StateFileHandlers
report :: ReportHandlers
withBuilder :: forall a. (Builder -> M a) -> M a
versions :: PackageName -> M [Version]
latestVersion :: PackageName -> M (Maybe Version)
stateFile :: StateFileHandlers
report :: ReportHandlers
withBuilder :: forall a. (Builder -> M a) -> M a
versions :: PackageName -> M [Version]
latestVersion :: PackageName -> M (Maybe Version)
..}

logCabal ::
  MonadIO m =>
  BuildHandlers ->
  m (IORef [(EnvConstraints, Maybe SolverPlan)], BuildHandlers)
logCabal :: forall (m :: * -> *).
MonadIO m =>
BuildHandlers
-> m (IORef [(EnvConstraints, Maybe SolverPlan)], BuildHandlers)
logCabal BuildHandlers
handlers = do
  IORef [(EnvConstraints, Maybe SolverPlan)]
ref <- IO (IORef [(EnvConstraints, Maybe SolverPlan)])
-> m (IORef [(EnvConstraints, Maybe SolverPlan)])
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO ([(EnvConstraints, Maybe SolverPlan)]
-> IO (IORef [(EnvConstraints, Maybe SolverPlan)])
forall a. a -> IO (IORef a)
newIORef [])
  pure (IORef [(EnvConstraints, Maybe SolverPlan)]
ref, (CabalHandlers -> CabalHandlers) -> BuildHandlers -> BuildHandlers
wrapCabal (IORef [(EnvConstraints, Maybe SolverPlan)]
-> CabalHandlers -> CabalHandlers
Cabal.logCabal IORef [(EnvConstraints, Maybe SolverPlan)]
ref) BuildHandlers
handlers)

data SpecialBuildHandlers =
  TestBumpHandlers
  deriving stock (SpecialBuildHandlers -> SpecialBuildHandlers -> Bool
(SpecialBuildHandlers -> SpecialBuildHandlers -> Bool)
-> (SpecialBuildHandlers -> SpecialBuildHandlers -> Bool)
-> Eq SpecialBuildHandlers
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SpecialBuildHandlers -> SpecialBuildHandlers -> Bool
== :: SpecialBuildHandlers -> SpecialBuildHandlers -> Bool
$c/= :: SpecialBuildHandlers -> SpecialBuildHandlers -> Bool
/= :: SpecialBuildHandlers -> SpecialBuildHandlers -> Bool
Eq, Int -> SpecialBuildHandlers -> ShowS
[SpecialBuildHandlers] -> ShowS
SpecialBuildHandlers -> String
(Int -> SpecialBuildHandlers -> ShowS)
-> (SpecialBuildHandlers -> String)
-> ([SpecialBuildHandlers] -> ShowS)
-> Show SpecialBuildHandlers
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SpecialBuildHandlers -> ShowS
showsPrec :: Int -> SpecialBuildHandlers -> ShowS
$cshow :: SpecialBuildHandlers -> String
show :: SpecialBuildHandlers -> String
$cshowList :: [SpecialBuildHandlers] -> ShowS
showList :: [SpecialBuildHandlers] -> ShowS
Show)