{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.Dijkstra.Governance () where

import Cardano.Ledger.Coin (Coin (..))
import Cardano.Ledger.Conway.Governance (
  ConwayEraGov (..),
  ConwayGovState,
  EraGov (..),
  cgsCommitteeL,
  cgsConstitutionL,
  cgsCurPParamsL,
  cgsDRepPulsingStateL,
  cgsFuturePParamsL,
  cgsPrevPParamsL,
  cgsProposalsL,
  gasDeposit,
  proposalsActions,
 )
import Cardano.Ledger.Conway.State (Obligations (..))
import Cardano.Ledger.Dijkstra.Era (DijkstraEra)
import Cardano.Ledger.Dijkstra.PParams ()
import Cardano.Ledger.Dijkstra.State.Stake ()
import Data.Foldable (Foldable (..))
import Lens.Micro ((^.))

instance EraGov DijkstraEra where
  type GovState DijkstraEra = ConwayGovState DijkstraEra

  curPParamsGovStateL :: Lens' (GovState DijkstraEra) (PParams DijkstraEra)
curPParamsGovStateL = (PParams DijkstraEra -> f (PParams DijkstraEra))
-> GovState DijkstraEra -> f (GovState DijkstraEra)
(PParams DijkstraEra -> f (PParams DijkstraEra))
-> ConwayGovState DijkstraEra -> f (ConwayGovState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(PParams era -> f (PParams era))
-> ConwayGovState era -> f (ConwayGovState era)
cgsCurPParamsL

  prevPParamsGovStateL :: Lens' (GovState DijkstraEra) (PParams DijkstraEra)
prevPParamsGovStateL = (PParams DijkstraEra -> f (PParams DijkstraEra))
-> GovState DijkstraEra -> f (GovState DijkstraEra)
(PParams DijkstraEra -> f (PParams DijkstraEra))
-> ConwayGovState DijkstraEra -> f (ConwayGovState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(PParams era -> f (PParams era))
-> ConwayGovState era -> f (ConwayGovState era)
cgsPrevPParamsL

  futurePParamsGovStateL :: Lens' (GovState DijkstraEra) (FuturePParams DijkstraEra)
futurePParamsGovStateL = (FuturePParams DijkstraEra -> f (FuturePParams DijkstraEra))
-> GovState DijkstraEra -> f (GovState DijkstraEra)
(FuturePParams DijkstraEra -> f (FuturePParams DijkstraEra))
-> ConwayGovState DijkstraEra -> f (ConwayGovState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(FuturePParams era -> f (FuturePParams era))
-> ConwayGovState era -> f (ConwayGovState era)
cgsFuturePParamsL

  obligationGovState :: GovState DijkstraEra -> Obligations
obligationGovState GovState DijkstraEra
st =
    Obligations
      { oblProposal :: Coin
oblProposal = (GovActionState DijkstraEra -> Coin)
-> StrictSeq (GovActionState DijkstraEra) -> Coin
forall m a. Monoid m => (a -> m) -> StrictSeq a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap' GovActionState DijkstraEra -> Coin
forall era. GovActionState era -> Coin
gasDeposit (StrictSeq (GovActionState DijkstraEra) -> Coin)
-> StrictSeq (GovActionState DijkstraEra) -> Coin
forall a b. (a -> b) -> a -> b
$ Proposals DijkstraEra -> StrictSeq (GovActionState DijkstraEra)
forall era. Proposals era -> StrictSeq (GovActionState era)
proposalsActions (GovState DijkstraEra
ConwayGovState DijkstraEra
st ConwayGovState DijkstraEra
-> Getting
     (Proposals DijkstraEra)
     (ConwayGovState DijkstraEra)
     (Proposals DijkstraEra)
-> Proposals DijkstraEra
forall s a. s -> Getting a s a -> a
^. Getting
  (Proposals DijkstraEra)
  (ConwayGovState DijkstraEra)
  (Proposals DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(Proposals era -> f (Proposals era))
-> ConwayGovState era -> f (ConwayGovState era)
cgsProposalsL)
      , oblDRep :: Coin
oblDRep = Integer -> Coin
Coin Integer
0
      , oblStake :: Coin
oblStake = Integer -> Coin
Coin Integer
0
      , oblPool :: Coin
oblPool = Integer -> Coin
Coin Integer
0
      }

instance ConwayEraGov DijkstraEra where
  constitutionGovStateL :: Lens' (GovState DijkstraEra) (Constitution DijkstraEra)
constitutionGovStateL = (Constitution DijkstraEra -> f (Constitution DijkstraEra))
-> GovState DijkstraEra -> f (GovState DijkstraEra)
(Constitution DijkstraEra -> f (Constitution DijkstraEra))
-> ConwayGovState DijkstraEra -> f (ConwayGovState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(Constitution era -> f (Constitution era))
-> ConwayGovState era -> f (ConwayGovState era)
cgsConstitutionL
  proposalsGovStateL :: Lens' (GovState DijkstraEra) (Proposals DijkstraEra)
proposalsGovStateL = (Proposals DijkstraEra -> f (Proposals DijkstraEra))
-> GovState DijkstraEra -> f (GovState DijkstraEra)
(Proposals DijkstraEra -> f (Proposals DijkstraEra))
-> ConwayGovState DijkstraEra -> f (ConwayGovState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(Proposals era -> f (Proposals era))
-> ConwayGovState era -> f (ConwayGovState era)
cgsProposalsL
  drepPulsingStateGovStateL :: Lens' (GovState DijkstraEra) (DRepPulsingState DijkstraEra)
drepPulsingStateGovStateL = (DRepPulsingState DijkstraEra -> f (DRepPulsingState DijkstraEra))
-> GovState DijkstraEra -> f (GovState DijkstraEra)
(DRepPulsingState DijkstraEra -> f (DRepPulsingState DijkstraEra))
-> ConwayGovState DijkstraEra -> f (ConwayGovState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(DRepPulsingState era -> f (DRepPulsingState era))
-> ConwayGovState era -> f (ConwayGovState era)
cgsDRepPulsingStateL
  committeeGovStateL :: Lens' (GovState DijkstraEra) (StrictMaybe (Committee DijkstraEra))
committeeGovStateL = (StrictMaybe (Committee DijkstraEra)
 -> f (StrictMaybe (Committee DijkstraEra)))
-> GovState DijkstraEra -> f (GovState DijkstraEra)
(StrictMaybe (Committee DijkstraEra)
 -> f (StrictMaybe (Committee DijkstraEra)))
-> ConwayGovState DijkstraEra -> f (ConwayGovState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(StrictMaybe (Committee era) -> f (StrictMaybe (Committee era)))
-> ConwayGovState era -> f (ConwayGovState era)
cgsCommitteeL