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

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

import Cardano.Ledger.BaseTypes
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 = (AccountState DijkstraEra -> CompactForm Coin)
-> (AccountState DijkstraEra
    -> CompactForm Coin -> AccountState DijkstraEra)
-> Lens' (AccountState DijkstraEra) (CompactForm Coin)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens AccountState DijkstraEra -> CompactForm Coin
ConwayAccountState DijkstraEra -> CompactForm Coin
forall era. ConwayAccountState era -> CompactForm Coin
casBalance ((AccountState DijkstraEra
  -> CompactForm Coin -> AccountState DijkstraEra)
 -> Lens' (AccountState DijkstraEra) (CompactForm Coin))
-> (AccountState DijkstraEra
    -> CompactForm Coin -> AccountState DijkstraEra)
-> Lens' (AccountState DijkstraEra) (CompactForm Coin)
forall a b. (a -> b) -> a -> b
$ \AccountState DijkstraEra
cas CompactForm Coin
b -> AccountState DijkstraEra
cas {casBalance = b}

  depositAccountStateL :: Lens' (AccountState DijkstraEra) (CompactForm Coin)
depositAccountStateL = (AccountState DijkstraEra -> CompactForm Coin)
-> (AccountState DijkstraEra
    -> CompactForm Coin -> AccountState DijkstraEra)
-> Lens' (AccountState DijkstraEra) (CompactForm Coin)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens AccountState DijkstraEra -> CompactForm Coin
ConwayAccountState DijkstraEra -> CompactForm Coin
forall era. ConwayAccountState era -> CompactForm Coin
casDeposit ((AccountState DijkstraEra
  -> CompactForm Coin -> AccountState DijkstraEra)
 -> Lens' (AccountState DijkstraEra) (CompactForm Coin))
-> (AccountState DijkstraEra
    -> CompactForm Coin -> AccountState DijkstraEra)
-> Lens' (AccountState DijkstraEra) (CompactForm Coin)
forall a b. (a -> b) -> a -> b
$ \AccountState DijkstraEra
cas CompactForm Coin
d -> AccountState DijkstraEra
cas {casDeposit = d}

  stakePoolDelegationAccountStateL :: Lens' (AccountState DijkstraEra) (Maybe (KeyHash 'StakePool))
stakePoolDelegationAccountStateL =
    (AccountState DijkstraEra -> Maybe (KeyHash 'StakePool))
-> (AccountState DijkstraEra
    -> Maybe (KeyHash 'StakePool) -> AccountState DijkstraEra)
-> Lens' (AccountState DijkstraEra) (Maybe (KeyHash 'StakePool))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (StrictMaybe (KeyHash 'StakePool) -> Maybe (KeyHash 'StakePool)
forall a. StrictMaybe a -> Maybe a
strictMaybeToMaybe (StrictMaybe (KeyHash 'StakePool) -> Maybe (KeyHash 'StakePool))
-> (ConwayAccountState DijkstraEra
    -> StrictMaybe (KeyHash 'StakePool))
-> ConwayAccountState DijkstraEra
-> Maybe (KeyHash 'StakePool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConwayAccountState DijkstraEra -> StrictMaybe (KeyHash 'StakePool)
forall era.
ConwayAccountState era -> StrictMaybe (KeyHash 'StakePool)
casStakePoolDelegation) ((AccountState DijkstraEra
  -> Maybe (KeyHash 'StakePool) -> AccountState DijkstraEra)
 -> Lens' (AccountState DijkstraEra) (Maybe (KeyHash 'StakePool)))
-> (AccountState DijkstraEra
    -> Maybe (KeyHash 'StakePool) -> AccountState DijkstraEra)
-> Lens' (AccountState DijkstraEra) (Maybe (KeyHash 'StakePool))
forall a b. (a -> b) -> a -> b
$ \AccountState DijkstraEra
cas Maybe (KeyHash 'StakePool)
d ->
      AccountState DijkstraEra
cas {casStakePoolDelegation = maybeToStrictMaybe d}

  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 =
    (AccountState DijkstraEra -> Maybe DRep)
-> (AccountState DijkstraEra
    -> Maybe DRep -> AccountState DijkstraEra)
-> Lens' (AccountState DijkstraEra) (Maybe DRep)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens (StrictMaybe DRep -> Maybe DRep
forall a. StrictMaybe a -> Maybe a
strictMaybeToMaybe (StrictMaybe DRep -> Maybe DRep)
-> (ConwayAccountState DijkstraEra -> StrictMaybe DRep)
-> ConwayAccountState DijkstraEra
-> Maybe DRep
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConwayAccountState DijkstraEra -> StrictMaybe DRep
forall era. ConwayAccountState era -> StrictMaybe DRep
casDRepDelegation) ((AccountState DijkstraEra
  -> Maybe DRep -> AccountState DijkstraEra)
 -> Lens' (AccountState DijkstraEra) (Maybe DRep))
-> (AccountState DijkstraEra
    -> Maybe DRep -> AccountState DijkstraEra)
-> Lens' (AccountState DijkstraEra) (Maybe DRep)
forall a b. (a -> b) -> a -> b
$ \AccountState DijkstraEra
cas Maybe DRep
d ->
      AccountState DijkstraEra
cas {casDRepDelegation = maybeToStrictMaybe d}