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

module Cardano.Ledger.Dijkstra.State.Account () where

import Cardano.Ledger.Conway.State
import Cardano.Ledger.Dijkstra.Era
import qualified Data.Map.Strict as Map
import Lens.Micro

instance EraAccounts DijkstraEra where
  type AccountState DijkstraEra = ConwayAccountState DijkstraEra
  type Accounts DijkstraEra = ConwayAccounts DijkstraEra

  addAccountState :: Credential Staking
-> AccountState DijkstraEra
-> Accounts DijkstraEra
-> Accounts DijkstraEra
addAccountState Credential Staking
cred AccountState DijkstraEra
accountState = (Map (Credential Staking) (AccountState DijkstraEra)
 -> Identity (Map (Credential Staking) (AccountState DijkstraEra)))
-> Accounts DijkstraEra -> Identity (Accounts DijkstraEra)
(Map (Credential Staking) (AccountState DijkstraEra)
 -> Identity (Map (Credential Staking) (AccountState DijkstraEra)))
-> ConwayAccounts DijkstraEra
-> Identity (ConwayAccounts DijkstraEra)
forall era.
EraAccounts era =>
Lens' (Accounts era) (Map (Credential Staking) (AccountState era))
Lens'
  (Accounts DijkstraEra)
  (Map (Credential Staking) (AccountState DijkstraEra))
accountsMapL ((Map (Credential Staking) (AccountState DijkstraEra)
  -> Identity (Map (Credential Staking) (AccountState DijkstraEra)))
 -> ConwayAccounts DijkstraEra
 -> Identity (ConwayAccounts DijkstraEra))
-> (Map (Credential Staking) (AccountState DijkstraEra)
    -> Map (Credential Staking) (AccountState DijkstraEra))
-> ConwayAccounts DijkstraEra
-> ConwayAccounts DijkstraEra
forall s t a b. ASetter s t a b -> (a -> b) -> s -> t
%~ Credential Staking
-> AccountState DijkstraEra
-> Map (Credential Staking) (AccountState DijkstraEra)
-> Map (Credential Staking) (AccountState DijkstraEra)
forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Credential Staking
cred AccountState DijkstraEra
accountState

  accountsMapL :: Lens'
  (Accounts DijkstraEra)
  (Map (Credential Staking) (AccountState DijkstraEra))
accountsMapL = (Accounts DijkstraEra
 -> Map (Credential Staking) (AccountState DijkstraEra))
-> (Accounts DijkstraEra
    -> Map (Credential Staking) (AccountState DijkstraEra)
    -> Accounts DijkstraEra)
-> Lens'
     (Accounts DijkstraEra)
     (Map (Credential Staking) (AccountState DijkstraEra))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Accounts DijkstraEra
-> Map (Credential Staking) (AccountState DijkstraEra)
ConwayAccounts DijkstraEra
-> Map (Credential Staking) (ConwayAccountState DijkstraEra)
forall era.
ConwayAccounts era
-> Map (Credential Staking) (ConwayAccountState era)
caStates ((Accounts DijkstraEra
  -> Map (Credential Staking) (AccountState DijkstraEra)
  -> Accounts DijkstraEra)
 -> Lens'
      (Accounts DijkstraEra)
      (Map (Credential Staking) (AccountState DijkstraEra)))
-> (Accounts DijkstraEra
    -> Map (Credential Staking) (AccountState DijkstraEra)
    -> Accounts DijkstraEra)
-> Lens'
     (Accounts DijkstraEra)
     (Map (Credential Staking) (AccountState DijkstraEra))
forall a b. (a -> b) -> a -> b
$ \Accounts DijkstraEra
cas Map (Credential Staking) (AccountState DijkstraEra)
asMap -> Accounts DijkstraEra
cas {caStates = asMap}

  balanceAccountStateL :: Lens' (AccountState DijkstraEra) (CompactForm Coin)
balanceAccountStateL = (CompactForm Coin -> f (CompactForm Coin))
-> AccountState DijkstraEra -> f (AccountState DijkstraEra)
(CompactForm Coin -> f (CompactForm Coin))
-> ConwayAccountState DijkstraEra
-> f (ConwayAccountState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(CompactForm Coin -> f (CompactForm Coin))
-> ConwayAccountState era -> f (ConwayAccountState era)
balanceConwayAccountStateL
  {-# INLINE balanceAccountStateL #-}

  depositAccountStateL :: Lens' (AccountState DijkstraEra) (CompactForm Coin)
depositAccountStateL = (CompactForm Coin -> f (CompactForm Coin))
-> AccountState DijkstraEra -> f (AccountState DijkstraEra)
(CompactForm Coin -> f (CompactForm Coin))
-> ConwayAccountState DijkstraEra
-> f (ConwayAccountState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(CompactForm Coin -> f (CompactForm Coin))
-> ConwayAccountState era -> f (ConwayAccountState era)
depositConwayAccountStateL
  {-# INLINE depositAccountStateL #-}

  stakePoolDelegationAccountStateL :: Lens' (AccountState DijkstraEra) (Maybe (KeyHash StakePool))
stakePoolDelegationAccountStateL = (Maybe (KeyHash StakePool) -> f (Maybe (KeyHash StakePool)))
-> AccountState DijkstraEra -> f (AccountState DijkstraEra)
(Maybe (KeyHash StakePool) -> f (Maybe (KeyHash StakePool)))
-> ConwayAccountState DijkstraEra
-> f (ConwayAccountState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(Maybe (KeyHash StakePool) -> f (Maybe (KeyHash StakePool)))
-> ConwayAccountState era -> f (ConwayAccountState era)
stakePoolDelegationConwayAccountStateL
  {-# INLINE stakePoolDelegationAccountStateL #-}

  unregisterAccount :: Credential Staking
-> Accounts DijkstraEra
-> (Maybe (AccountState DijkstraEra), Accounts DijkstraEra)
unregisterAccount = Credential Staking
-> Accounts DijkstraEra
-> (Maybe (AccountState DijkstraEra), Accounts DijkstraEra)
forall era.
EraAccounts era =>
Credential Staking
-> Accounts era -> (Maybe (AccountState era), Accounts era)
unregisterConwayAccount

instance ConwayEraAccounts DijkstraEra where
  dRepDelegationAccountStateL :: Lens' (AccountState DijkstraEra) (Maybe DRep)
dRepDelegationAccountStateL = (Maybe DRep -> f (Maybe DRep))
-> AccountState DijkstraEra -> f (AccountState DijkstraEra)
(Maybe DRep -> f (Maybe DRep))
-> ConwayAccountState DijkstraEra
-> f (ConwayAccountState DijkstraEra)
forall era (f :: * -> *).
Functor f =>
(Maybe DRep -> f (Maybe DRep))
-> ConwayAccountState era -> f (ConwayAccountState era)
dRepDelegationConwayAccountStateL
  {-# INLINE dRepDelegationAccountStateL #-}