{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Dijkstra.Transition (
  TransitionConfig (..),
) where

import Cardano.Ledger.Conway
import Cardano.Ledger.Conway.Transition (
  ConwayEraTransition,
  registerDRepsThenDelegs,
 )
import Cardano.Ledger.Dijkstra.Era
import Cardano.Ledger.Dijkstra.Genesis
import Cardano.Ledger.Dijkstra.Translation ()
import Cardano.Ledger.Shelley.Transition
import GHC.Generics
import Lens.Micro
import NoThunks.Class (NoThunks (..))

instance EraTransition DijkstraEra where
  data TransitionConfig DijkstraEra = DijkstraTransitionConfig
    { TransitionConfig DijkstraEra -> DijkstraGenesis
dtcDijkstraGenesis :: !DijkstraGenesis
    , TransitionConfig DijkstraEra -> TransitionConfig ConwayEra
dtcConwayTransitionConfig :: !(TransitionConfig ConwayEra)
    }
    deriving (Int -> TransitionConfig DijkstraEra -> ShowS
[TransitionConfig DijkstraEra] -> ShowS
TransitionConfig DijkstraEra -> String
(Int -> TransitionConfig DijkstraEra -> ShowS)
-> (TransitionConfig DijkstraEra -> String)
-> ([TransitionConfig DijkstraEra] -> ShowS)
-> Show (TransitionConfig DijkstraEra)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TransitionConfig DijkstraEra -> ShowS
showsPrec :: Int -> TransitionConfig DijkstraEra -> ShowS
$cshow :: TransitionConfig DijkstraEra -> String
show :: TransitionConfig DijkstraEra -> String
$cshowList :: [TransitionConfig DijkstraEra] -> ShowS
showList :: [TransitionConfig DijkstraEra] -> ShowS
Show, TransitionConfig DijkstraEra
-> TransitionConfig DijkstraEra -> Bool
(TransitionConfig DijkstraEra
 -> TransitionConfig DijkstraEra -> Bool)
-> (TransitionConfig DijkstraEra
    -> TransitionConfig DijkstraEra -> Bool)
-> Eq (TransitionConfig DijkstraEra)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TransitionConfig DijkstraEra
-> TransitionConfig DijkstraEra -> Bool
== :: TransitionConfig DijkstraEra
-> TransitionConfig DijkstraEra -> Bool
$c/= :: TransitionConfig DijkstraEra
-> TransitionConfig DijkstraEra -> Bool
/= :: TransitionConfig DijkstraEra
-> TransitionConfig DijkstraEra -> Bool
Eq, (forall x.
 TransitionConfig DijkstraEra
 -> Rep (TransitionConfig DijkstraEra) x)
-> (forall x.
    Rep (TransitionConfig DijkstraEra) x
    -> TransitionConfig DijkstraEra)
-> Generic (TransitionConfig DijkstraEra)
forall x.
Rep (TransitionConfig DijkstraEra) x
-> TransitionConfig DijkstraEra
forall x.
TransitionConfig DijkstraEra
-> Rep (TransitionConfig DijkstraEra) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
TransitionConfig DijkstraEra
-> Rep (TransitionConfig DijkstraEra) x
from :: forall x.
TransitionConfig DijkstraEra
-> Rep (TransitionConfig DijkstraEra) x
$cto :: forall x.
Rep (TransitionConfig DijkstraEra) x
-> TransitionConfig DijkstraEra
to :: forall x.
Rep (TransitionConfig DijkstraEra) x
-> TransitionConfig DijkstraEra
Generic)

  mkTransitionConfig :: TranslationContext DijkstraEra
-> TransitionConfig (PreviousEra DijkstraEra)
-> TransitionConfig DijkstraEra
mkTransitionConfig = TranslationContext DijkstraEra
-> TransitionConfig (PreviousEra DijkstraEra)
-> TransitionConfig DijkstraEra
DijkstraGenesis
-> TransitionConfig ConwayEra -> TransitionConfig DijkstraEra
DijkstraTransitionConfig

  injectIntoTestState :: TransitionConfig DijkstraEra
-> NewEpochState DijkstraEra -> NewEpochState DijkstraEra
injectIntoTestState TransitionConfig DijkstraEra
cfg =
    TransitionConfig DijkstraEra
-> NewEpochState DijkstraEra -> NewEpochState DijkstraEra
forall era.
ConwayEraTransition era =>
TransitionConfig era -> NewEpochState era -> NewEpochState era
registerDRepsThenDelegs TransitionConfig DijkstraEra
cfg
      (NewEpochState DijkstraEra -> NewEpochState DijkstraEra)
-> (NewEpochState DijkstraEra -> NewEpochState DijkstraEra)
-> NewEpochState DijkstraEra
-> NewEpochState DijkstraEra
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TransitionConfig DijkstraEra
-> NewEpochState DijkstraEra -> NewEpochState DijkstraEra
forall era.
EraTransition era =>
TransitionConfig era -> NewEpochState era -> NewEpochState era
registerInitialFundsThenStaking TransitionConfig DijkstraEra
cfg

  tcPreviousEraConfigL :: EraTransition (PreviousEra DijkstraEra) =>
Lens'
  (TransitionConfig DijkstraEra)
  (TransitionConfig (PreviousEra DijkstraEra))
tcPreviousEraConfigL =
    (TransitionConfig DijkstraEra -> TransitionConfig ConwayEra)
-> (TransitionConfig DijkstraEra
    -> TransitionConfig ConwayEra -> TransitionConfig DijkstraEra)
-> Lens
     (TransitionConfig DijkstraEra)
     (TransitionConfig DijkstraEra)
     (TransitionConfig ConwayEra)
     (TransitionConfig ConwayEra)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens TransitionConfig DijkstraEra -> TransitionConfig ConwayEra
dtcConwayTransitionConfig (\TransitionConfig DijkstraEra
dtc TransitionConfig ConwayEra
pc -> TransitionConfig DijkstraEra
dtc {dtcConwayTransitionConfig = pc})

  tcTranslationContextL :: Lens'
  (TransitionConfig DijkstraEra) (TranslationContext DijkstraEra)
tcTranslationContextL =
    (TransitionConfig DijkstraEra -> DijkstraGenesis)
-> (TransitionConfig DijkstraEra
    -> DijkstraGenesis -> TransitionConfig DijkstraEra)
-> Lens
     (TransitionConfig DijkstraEra)
     (TransitionConfig DijkstraEra)
     DijkstraGenesis
     DijkstraGenesis
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens TransitionConfig DijkstraEra -> DijkstraGenesis
dtcDijkstraGenesis (\TransitionConfig DijkstraEra
dtc DijkstraGenesis
ag -> TransitionConfig DijkstraEra
dtc {dtcDijkstraGenesis = ag})

instance ConwayEraTransition DijkstraEra

instance NoThunks (TransitionConfig DijkstraEra)