module Hix.Managed.StageState where

import qualified Data.Map.Strict as Map

import qualified Hix.Managed.Data.MutableId
import qualified Hix.Managed.Data.Mutation
import Hix.Managed.Data.Mutation (DepMutation, MutationResult (..))
import Hix.Managed.Data.StageState (BuildSuccess (CandidateBuilt, Unmodified), StageState (..))

updateStageState ::
  StageState a s ->
  DepMutation a ->
  MutationResult s ->
  StageState a s
updateStageState :: forall a s.
StageState a s
-> DepMutation a -> MutationResult s -> StageState a s
updateStageState StageState a s
old DepMutation a
mutation = \case
  MutationSuccess MutableId
candidate Bool
changed MutationState
state s
ext ->
    StageState a s
old {
      $sel:success:StageState :: Map MutableDep BuildSuccess
success = MutableDep
-> BuildSuccess
-> Map MutableDep BuildSuccess
-> Map MutableDep BuildSuccess
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert MutableId
candidate.name BuildSuccess
buildSuccess StageState a s
old.success,
      MutationState
state :: MutationState
$sel:state:StageState :: MutationState
state,
      s
ext :: s
$sel:ext:StageState :: s
ext
    }
    where
      buildSuccess :: BuildSuccess
buildSuccess | Bool
changed = MutableId -> BuildSuccess
CandidateBuilt MutableId
candidate
                   | Bool
otherwise = MutableDep -> BuildSuccess
Unmodified DepMutation a
mutation.package
  MutationResult s
MutationKeep ->
    StageState a s
old {$sel:success:StageState :: Map MutableDep BuildSuccess
success = MutableDep
-> BuildSuccess
-> Map MutableDep BuildSuccess
-> Map MutableDep BuildSuccess
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert DepMutation a
mutation.package (MutableDep -> BuildSuccess
Unmodified DepMutation a
mutation.package) StageState a s
old.success}
  MutationResult s
MutationFailed ->
    StageState a s
old {$sel:failed:StageState :: [DepMutation a]
failed = DepMutation a
mutation DepMutation a -> [DepMutation a] -> [DepMutation a]
forall a. a -> [a] -> [a]
: StageState a s
old.failed}