module Hix.Managed.Data.StageState where

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 BuildResult =
  Finished BuildStatus
  |
  TimedOut
  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
  Finished BuildStatus
Success -> Bool
False
  Finished BuildStatus
Failure -> Bool
True
  BuildResult
TimedOut -> Bool
True

buildStatus :: BuildResult -> BuildStatus
buildStatus :: BuildResult -> BuildStatus
buildStatus = \case
  Finished BuildStatus
s -> BuildStatus
s
  BuildResult
TimedOut -> BuildStatus
Failure

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
$sel:name:MutableId :: 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 -> 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 {$sel:success:StageState :: Map MutableDep BuildSuccess
success = [], $sel:failed:StageState :: [DepMutation a]
failed = [], $sel:iterations:StageState :: Natural
iterations = Natural
0, s
MutationState
$sel:state:StageState :: MutationState
$sel:ext:StageState :: s
state :: MutationState
ext :: s
..}