module Hix.Managed.Data.StageState where

import Hix.Data.PackageId (PackageId)
import Hix.Managed.Build.NixOutput (PackageDerivation)
import Hix.Managed.Data.Initial (Initial (Initial))
import Hix.Managed.Data.Mutable (MutableDep)
import qualified Hix.Managed.Data.MutableId
import Hix.Managed.Data.MutableId (MutableId (MutableId))
import Hix.Managed.Data.Mutation (DepMutation)
import Hix.Managed.Data.MutationState (MutationState)

data BuildStatus =
  Success
  |
  Failure
  deriving stock (BuildStatus -> BuildStatus -> Bool
(BuildStatus -> BuildStatus -> Bool)
-> (BuildStatus -> BuildStatus -> Bool) -> Eq BuildStatus
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildStatus -> BuildStatus -> Bool
== :: BuildStatus -> BuildStatus -> Bool
$c/= :: BuildStatus -> BuildStatus -> Bool
/= :: BuildStatus -> BuildStatus -> Bool
Eq, Int -> BuildStatus -> ShowS
[BuildStatus] -> ShowS
BuildStatus -> String
(Int -> BuildStatus -> ShowS)
-> (BuildStatus -> String)
-> ([BuildStatus] -> ShowS)
-> Show BuildStatus
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildStatus -> ShowS
showsPrec :: Int -> BuildStatus -> ShowS
$cshow :: BuildStatus -> String
show :: BuildStatus -> String
$cshowList :: [BuildStatus] -> ShowS
showList :: [BuildStatus] -> ShowS
Show, (forall x. BuildStatus -> Rep BuildStatus x)
-> (forall x. Rep BuildStatus x -> BuildStatus)
-> Generic BuildStatus
forall x. Rep BuildStatus x -> BuildStatus
forall x. BuildStatus -> Rep BuildStatus x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BuildStatus -> Rep BuildStatus x
from :: forall x. BuildStatus -> Rep BuildStatus x
$cto :: forall x. Rep BuildStatus x -> BuildStatus
to :: forall x. Rep BuildStatus x -> BuildStatus
Generic)

justSuccess :: a -> BuildStatus -> Maybe a
justSuccess :: forall a. a -> BuildStatus -> Maybe a
justSuccess a
a = \case
  BuildStatus
Success -> a -> Maybe a
forall a. a -> Maybe a
Just a
a
  BuildStatus
Failure -> Maybe a
forall a. Maybe a
Nothing

data BuildFailure =
  UnknownFailure
  |
  PackageFailure (NonEmpty PackageDerivation)
  |
  TimeoutFailure [PackageId]
  deriving stock (BuildFailure -> BuildFailure -> Bool
(BuildFailure -> BuildFailure -> Bool)
-> (BuildFailure -> BuildFailure -> Bool) -> Eq BuildFailure
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildFailure -> BuildFailure -> Bool
== :: BuildFailure -> BuildFailure -> Bool
$c/= :: BuildFailure -> BuildFailure -> Bool
/= :: BuildFailure -> BuildFailure -> Bool
Eq, Int -> BuildFailure -> ShowS
[BuildFailure] -> ShowS
BuildFailure -> String
(Int -> BuildFailure -> ShowS)
-> (BuildFailure -> String)
-> ([BuildFailure] -> ShowS)
-> Show BuildFailure
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildFailure -> ShowS
showsPrec :: Int -> BuildFailure -> ShowS
$cshow :: BuildFailure -> String
show :: BuildFailure -> String
$cshowList :: [BuildFailure] -> ShowS
showList :: [BuildFailure] -> ShowS
Show, (forall x. BuildFailure -> Rep BuildFailure x)
-> (forall x. Rep BuildFailure x -> BuildFailure)
-> Generic BuildFailure
forall x. Rep BuildFailure x -> BuildFailure
forall x. BuildFailure -> Rep BuildFailure x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BuildFailure -> Rep BuildFailure x
from :: forall x. BuildFailure -> Rep BuildFailure x
$cto :: forall x. Rep BuildFailure x -> BuildFailure
to :: forall x. Rep BuildFailure x -> BuildFailure
Generic)

data BuildResult =
  BuildSuccess
  |
  BuildFailure BuildFailure
  deriving stock (BuildResult -> BuildResult -> Bool
(BuildResult -> BuildResult -> Bool)
-> (BuildResult -> BuildResult -> Bool) -> Eq BuildResult
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildResult -> BuildResult -> Bool
== :: BuildResult -> BuildResult -> Bool
$c/= :: BuildResult -> BuildResult -> Bool
/= :: BuildResult -> BuildResult -> Bool
Eq, Int -> BuildResult -> ShowS
[BuildResult] -> ShowS
BuildResult -> String
(Int -> BuildResult -> ShowS)
-> (BuildResult -> String)
-> ([BuildResult] -> ShowS)
-> Show BuildResult
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildResult -> ShowS
showsPrec :: Int -> BuildResult -> ShowS
$cshow :: BuildResult -> String
show :: BuildResult -> String
$cshowList :: [BuildResult] -> ShowS
showList :: [BuildResult] -> ShowS
Show, (forall x. BuildResult -> Rep BuildResult x)
-> (forall x. Rep BuildResult x -> BuildResult)
-> Generic BuildResult
forall x. Rep BuildResult x -> BuildResult
forall x. BuildResult -> Rep BuildResult x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BuildResult -> Rep BuildResult x
from :: forall x. BuildResult -> Rep BuildResult x
$cto :: forall x. Rep BuildResult x -> BuildResult
to :: forall x. Rep BuildResult x -> BuildResult
Generic)

buildUnsuccessful :: BuildResult -> Bool
buildUnsuccessful :: BuildResult -> Bool
buildUnsuccessful = \case
  BuildResult
BuildSuccess -> Bool
False
  BuildFailure BuildFailure
_ -> Bool
True

buildStatus :: BuildResult -> BuildStatus
buildStatus :: BuildResult -> BuildStatus
buildStatus = \case
  BuildResult
BuildSuccess -> BuildStatus
Success
  BuildFailure BuildFailure
_ -> BuildStatus
Failure

resultFromStatus :: BuildStatus -> BuildResult
resultFromStatus :: BuildStatus -> BuildResult
resultFromStatus = \case
  BuildStatus
Success -> BuildResult
BuildSuccess
  BuildStatus
Failure -> BuildFailure -> BuildResult
BuildFailure BuildFailure
UnknownFailure

data BuildSuccess =
  CandidateBuilt MutableId
  |
  Unmodified MutableDep
  deriving stock (BuildSuccess -> BuildSuccess -> Bool
(BuildSuccess -> BuildSuccess -> Bool)
-> (BuildSuccess -> BuildSuccess -> Bool) -> Eq BuildSuccess
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BuildSuccess -> BuildSuccess -> Bool
== :: BuildSuccess -> BuildSuccess -> Bool
$c/= :: BuildSuccess -> BuildSuccess -> Bool
/= :: BuildSuccess -> BuildSuccess -> Bool
Eq, Int -> BuildSuccess -> ShowS
[BuildSuccess] -> ShowS
BuildSuccess -> String
(Int -> BuildSuccess -> ShowS)
-> (BuildSuccess -> String)
-> ([BuildSuccess] -> ShowS)
-> Show BuildSuccess
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BuildSuccess -> ShowS
showsPrec :: Int -> BuildSuccess -> ShowS
$cshow :: BuildSuccess -> String
show :: BuildSuccess -> String
$cshowList :: [BuildSuccess] -> ShowS
showList :: [BuildSuccess] -> ShowS
Show, (forall x. BuildSuccess -> Rep BuildSuccess x)
-> (forall x. Rep BuildSuccess x -> BuildSuccess)
-> Generic BuildSuccess
forall x. Rep BuildSuccess x -> BuildSuccess
forall x. BuildSuccess -> Rep BuildSuccess x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BuildSuccess -> Rep BuildSuccess x
from :: forall x. BuildSuccess -> Rep BuildSuccess x
$cto :: forall x. Rep BuildSuccess x -> BuildSuccess
to :: forall x. Rep BuildSuccess x -> BuildSuccess
Generic)

buildSuccessPackage :: BuildSuccess -> MutableDep
buildSuccessPackage :: BuildSuccess -> MutableDep
buildSuccessPackage = \case
  CandidateBuilt MutableId {MutableDep
name :: MutableDep
name :: MutableId -> MutableDep
name} -> MutableDep
name
  Unmodified MutableDep
name -> MutableDep
name

modifiedCandidates :: [BuildSuccess] -> [MutableId]
modifiedCandidates :: [BuildSuccess] -> [MutableId]
modifiedCandidates =
  (BuildSuccess -> Maybe MutableId) -> [BuildSuccess] -> [MutableId]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe \case
    CandidateBuilt MutableId
candidate -> MutableId -> Maybe MutableId
forall a. a -> Maybe a
Just MutableId
candidate
    Unmodified MutableDep
_ -> Maybe MutableId
forall a. Maybe a
Nothing

data StageState a s =
  StageState {
    forall a s. StageState a s -> Map MutableDep BuildSuccess
success :: Map MutableDep BuildSuccess,
    forall a s. StageState a s -> [DepMutation a]
failed :: [DepMutation a],
    forall a s. StageState a s -> MutationState
state :: MutationState,
    forall a s. StageState a s -> Set PackageId
revisions :: Set PackageId,
    forall a s. StageState a s -> Natural
iterations :: Natural,
    forall a s. StageState a s -> s
ext :: s
  }
  deriving stock (StageState a s -> StageState a s -> Bool
(StageState a s -> StageState a s -> Bool)
-> (StageState a s -> StageState a s -> Bool)
-> Eq (StageState a s)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a s.
(Eq a, Eq s) =>
StageState a s -> StageState a s -> Bool
$c== :: forall a s.
(Eq a, Eq s) =>
StageState a s -> StageState a s -> Bool
== :: StageState a s -> StageState a s -> Bool
$c/= :: forall a s.
(Eq a, Eq s) =>
StageState a s -> StageState a s -> Bool
/= :: StageState a s -> StageState a s -> Bool
Eq, Int -> StageState a s -> ShowS
[StageState a s] -> ShowS
StageState a s -> String
(Int -> StageState a s -> ShowS)
-> (StageState a s -> String)
-> ([StageState a s] -> ShowS)
-> Show (StageState a s)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall a s. (Show a, Show s) => Int -> StageState a s -> ShowS
forall a s. (Show a, Show s) => [StageState a s] -> ShowS
forall a s. (Show a, Show s) => StageState a s -> String
$cshowsPrec :: forall a s. (Show a, Show s) => Int -> StageState a s -> ShowS
showsPrec :: Int -> StageState a s -> ShowS
$cshow :: forall a s. (Show a, Show s) => StageState a s -> String
show :: StageState a s -> String
$cshowList :: forall a s. (Show a, Show s) => [StageState a s] -> ShowS
showList :: [StageState a s] -> ShowS
Show)

initStageState :: Initial MutationState -> s -> StageState a s
initStageState :: forall s a. Initial MutationState -> s -> StageState a s
initStageState (Initial MutationState
state) s
ext =
  StageState {success :: Map MutableDep BuildSuccess
success = [], failed :: [DepMutation a]
failed = [], revisions :: Set PackageId
revisions = [], iterations :: Natural
iterations = Natural
0, s
MutationState
state :: MutationState
ext :: s
state :: MutationState
ext :: s
..}