{-# 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 (..),
  toDijkstraTransitionConfigPairs,
) where

import Cardano.Ledger.Conway
import Cardano.Ledger.Conway.Transition (
  ConwayEraTransition,
  registerDRepsThenDelegs,
  toConwayTransitionConfigPairs,
 )
import Cardano.Ledger.Dijkstra.Era
import Cardano.Ledger.Dijkstra.Genesis
import Cardano.Ledger.Dijkstra.Translation ()
import Cardano.Ledger.Shelley.Transition
import Data.Aeson (
  FromJSON (..),
  KeyValue (..),
  ToJSON (..),
  Value (..),
  object,
  pairs,
  withObject,
  (.:),
 )
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)

instance ToJSON (TransitionConfig DijkstraEra) where
  toJSON :: TransitionConfig DijkstraEra -> Value
toJSON = [Pair] -> Value
object ([Pair] -> Value)
-> (TransitionConfig DijkstraEra -> [Pair])
-> TransitionConfig DijkstraEra
-> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TransitionConfig DijkstraEra -> [Pair]
forall e a. KeyValue e a => TransitionConfig DijkstraEra -> [a]
toDijkstraTransitionConfigPairs
  toEncoding :: TransitionConfig DijkstraEra -> Encoding
toEncoding = Series -> Encoding
pairs (Series -> Encoding)
-> (TransitionConfig DijkstraEra -> Series)
-> TransitionConfig DijkstraEra
-> Encoding
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Series] -> Series
forall a. Monoid a => [a] -> a
mconcat ([Series] -> Series)
-> (TransitionConfig DijkstraEra -> [Series])
-> TransitionConfig DijkstraEra
-> Series
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TransitionConfig DijkstraEra -> [Series]
forall e a. KeyValue e a => TransitionConfig DijkstraEra -> [a]
toDijkstraTransitionConfigPairs

toDijkstraTransitionConfigPairs :: KeyValue e a => TransitionConfig DijkstraEra -> [a]
toDijkstraTransitionConfigPairs :: forall e a. KeyValue e a => TransitionConfig DijkstraEra -> [a]
toDijkstraTransitionConfigPairs TransitionConfig DijkstraEra
dijkstraConfig =
  TransitionConfig ConwayEra -> [a]
forall e a. KeyValue e a => TransitionConfig ConwayEra -> [a]
toConwayTransitionConfigPairs TransitionConfig ConwayEra
conwayConfig
    [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ [Key
"dijkstra" Key -> Value -> a
forall v. ToJSON v => Key -> v -> a
forall e kv v. (KeyValue e kv, ToJSON v) => Key -> v -> kv
.= [Pair] -> Value
object (DijkstraGenesis -> [Pair]
forall a. DijkstraGenesis -> [a]
toDijkstraGenesisPairs (TransitionConfig DijkstraEra
dijkstraConfig TransitionConfig DijkstraEra
-> Getting
     DijkstraGenesis (TransitionConfig DijkstraEra) DijkstraGenesis
-> DijkstraGenesis
forall s a. s -> Getting a s a -> a
^. (TranslationContext DijkstraEra
 -> Const DijkstraGenesis (TranslationContext DijkstraEra))
-> TransitionConfig DijkstraEra
-> Const DijkstraGenesis (TransitionConfig DijkstraEra)
Getting
  DijkstraGenesis (TransitionConfig DijkstraEra) DijkstraGenesis
forall era.
EraTransition era =>
Lens' (TransitionConfig era) (TranslationContext era)
Lens'
  (TransitionConfig DijkstraEra) (TranslationContext DijkstraEra)
tcTranslationContextL))]
  where
    conwayConfig :: TransitionConfig ConwayEra
conwayConfig = TransitionConfig DijkstraEra
dijkstraConfig TransitionConfig DijkstraEra
-> Getting
     (TransitionConfig ConwayEra)
     (TransitionConfig DijkstraEra)
     (TransitionConfig ConwayEra)
-> TransitionConfig ConwayEra
forall s a. s -> Getting a s a -> a
^. (TransitionConfig (PreviousEra DijkstraEra)
 -> Const
      (TransitionConfig ConwayEra)
      (TransitionConfig (PreviousEra DijkstraEra)))
-> TransitionConfig DijkstraEra
-> Const
     (TransitionConfig ConwayEra) (TransitionConfig DijkstraEra)
Getting
  (TransitionConfig ConwayEra)
  (TransitionConfig DijkstraEra)
  (TransitionConfig ConwayEra)
forall era.
(EraTransition era, EraTransition (PreviousEra era)) =>
Lens' (TransitionConfig era) (TransitionConfig (PreviousEra era))
Lens'
  (TransitionConfig DijkstraEra)
  (TransitionConfig (PreviousEra DijkstraEra))
tcPreviousEraConfigL

instance FromJSON (TransitionConfig DijkstraEra) where
  parseJSON :: Value -> Parser (TransitionConfig DijkstraEra)
parseJSON = String
-> (Object -> Parser (TransitionConfig DijkstraEra))
-> Value
-> Parser (TransitionConfig DijkstraEra)
forall a. String -> (Object -> Parser a) -> Value -> Parser a
withObject String
"DijkstraTransitionConfig" ((Object -> Parser (TransitionConfig DijkstraEra))
 -> Value -> Parser (TransitionConfig DijkstraEra))
-> (Object -> Parser (TransitionConfig DijkstraEra))
-> Value
-> Parser (TransitionConfig DijkstraEra)
forall a b. (a -> b) -> a -> b
$ \Object
o -> do
    DijkstraGenesis
pc <- Value -> Parser DijkstraGenesis
forall a. FromJSON a => Value -> Parser a
parseJSON (Object -> Value
Object Object
o)
    TransitionConfig ConwayEra
ag <- Object
o Object -> Key -> Parser (TransitionConfig ConwayEra)
forall a. FromJSON a => Object -> Key -> Parser a
.: Key
"dijkstra"
    TransitionConfig DijkstraEra
-> Parser (TransitionConfig DijkstraEra)
forall a. a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (TransitionConfig DijkstraEra
 -> Parser (TransitionConfig DijkstraEra))
-> TransitionConfig DijkstraEra
-> Parser (TransitionConfig DijkstraEra)
forall a b. (a -> b) -> a -> b
$ TranslationContext DijkstraEra
-> TransitionConfig (PreviousEra DijkstraEra)
-> TransitionConfig DijkstraEra
forall era.
EraTransition era =>
TranslationContext era
-> TransitionConfig (PreviousEra era) -> TransitionConfig era
mkTransitionConfig TranslationContext DijkstraEra
DijkstraGenesis
pc TransitionConfig (PreviousEra DijkstraEra)
TransitionConfig ConwayEra
ag