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

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

import Cardano.Ledger.Allegra.Era
import Cardano.Ledger.BaseTypes
import Cardano.Ledger.Shelley.State
import Lens.Micro

instance EraAccounts AllegraEra where
  type AccountState AllegraEra = ShelleyAccountState AllegraEra
  type Accounts AllegraEra = ShelleyAccounts AllegraEra

  addAccountState :: Credential 'Staking
-> AccountState AllegraEra
-> Accounts AllegraEra
-> Accounts AllegraEra
addAccountState = Credential 'Staking
-> AccountState AllegraEra
-> Accounts AllegraEra
-> Accounts AllegraEra
forall era.
ShelleyEraAccounts era =>
Credential 'Staking
-> AccountState era -> Accounts era -> Accounts era
shelleyAddAccountState

  accountsMapL :: Lens'
  (Accounts AllegraEra)
  (Map (Credential 'Staking) (AccountState AllegraEra))
accountsMapL = (Accounts AllegraEra
 -> Map (Credential 'Staking) (AccountState AllegraEra))
-> (Accounts AllegraEra
    -> Map (Credential 'Staking) (AccountState AllegraEra)
    -> Accounts AllegraEra)
-> Lens'
     (Accounts AllegraEra)
     (Map (Credential 'Staking) (AccountState AllegraEra))
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens Accounts AllegraEra
-> Map (Credential 'Staking) (AccountState AllegraEra)
ShelleyAccounts AllegraEra
-> Map (Credential 'Staking) (ShelleyAccountState AllegraEra)
forall era.
ShelleyAccounts era
-> Map (Credential 'Staking) (ShelleyAccountState era)
saStates ((Accounts AllegraEra
  -> Map (Credential 'Staking) (AccountState AllegraEra)
  -> Accounts AllegraEra)
 -> Lens'
      (Accounts AllegraEra)
      (Map (Credential 'Staking) (AccountState AllegraEra)))
-> (Accounts AllegraEra
    -> Map (Credential 'Staking) (AccountState AllegraEra)
    -> Accounts AllegraEra)
-> Lens'
     (Accounts AllegraEra)
     (Map (Credential 'Staking) (AccountState AllegraEra))
forall a b. (a -> b) -> a -> b
$ \Accounts AllegraEra
sas Map (Credential 'Staking) (AccountState AllegraEra)
asMap -> Accounts AllegraEra
sas {saStates = asMap}

  balanceAccountStateL :: Lens' (AccountState AllegraEra) (CompactForm Coin)
balanceAccountStateL = (AccountState AllegraEra -> CompactForm Coin)
-> (AccountState AllegraEra
    -> CompactForm Coin -> AccountState AllegraEra)
-> Lens' (AccountState AllegraEra) (CompactForm Coin)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens AccountState AllegraEra -> CompactForm Coin
ShelleyAccountState AllegraEra -> CompactForm Coin
forall era. ShelleyAccountState era -> CompactForm Coin
sasBalance ((AccountState AllegraEra
  -> CompactForm Coin -> AccountState AllegraEra)
 -> Lens' (AccountState AllegraEra) (CompactForm Coin))
-> (AccountState AllegraEra
    -> CompactForm Coin -> AccountState AllegraEra)
-> Lens' (AccountState AllegraEra) (CompactForm Coin)
forall a b. (a -> b) -> a -> b
$ \AccountState AllegraEra
sas CompactForm Coin
b -> AccountState AllegraEra
sas {sasBalance = b}

  depositAccountStateL :: Lens' (AccountState AllegraEra) (CompactForm Coin)
depositAccountStateL = (AccountState AllegraEra -> CompactForm Coin)
-> (AccountState AllegraEra
    -> CompactForm Coin -> AccountState AllegraEra)
-> Lens' (AccountState AllegraEra) (CompactForm Coin)
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens AccountState AllegraEra -> CompactForm Coin
ShelleyAccountState AllegraEra -> CompactForm Coin
forall era. ShelleyAccountState era -> CompactForm Coin
sasDeposit ((AccountState AllegraEra
  -> CompactForm Coin -> AccountState AllegraEra)
 -> Lens' (AccountState AllegraEra) (CompactForm Coin))
-> (AccountState AllegraEra
    -> CompactForm Coin -> AccountState AllegraEra)
-> Lens' (AccountState AllegraEra) (CompactForm Coin)
forall a b. (a -> b) -> a -> b
$ \AccountState AllegraEra
sas CompactForm Coin
d -> AccountState AllegraEra
sas {sasDeposit = d}

  stakePoolDelegationAccountStateL :: Lens' (AccountState AllegraEra) (Maybe (KeyHash 'StakePool))
stakePoolDelegationAccountStateL =
    (AccountState AllegraEra -> Maybe (KeyHash 'StakePool))
-> (AccountState AllegraEra
    -> Maybe (KeyHash 'StakePool) -> AccountState AllegraEra)
-> Lens' (AccountState AllegraEra) (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))
-> (ShelleyAccountState AllegraEra
    -> StrictMaybe (KeyHash 'StakePool))
-> ShelleyAccountState AllegraEra
-> Maybe (KeyHash 'StakePool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShelleyAccountState AllegraEra -> StrictMaybe (KeyHash 'StakePool)
forall era.
ShelleyAccountState era -> StrictMaybe (KeyHash 'StakePool)
sasStakePoolDelegation) ((AccountState AllegraEra
  -> Maybe (KeyHash 'StakePool) -> AccountState AllegraEra)
 -> Lens' (AccountState AllegraEra) (Maybe (KeyHash 'StakePool)))
-> (AccountState AllegraEra
    -> Maybe (KeyHash 'StakePool) -> AccountState AllegraEra)
-> Lens' (AccountState AllegraEra) (Maybe (KeyHash 'StakePool))
forall a b. (a -> b) -> a -> b
$ \AccountState AllegraEra
sas Maybe (KeyHash 'StakePool)
d ->
      AccountState AllegraEra
sas {sasStakePoolDelegation = maybeToStrictMaybe d}

  unregisterAccount :: Credential 'Staking
-> Accounts AllegraEra
-> (Maybe (AccountState AllegraEra), Accounts AllegraEra)
unregisterAccount = Credential 'Staking
-> Accounts AllegraEra
-> (Maybe (AccountState AllegraEra), Accounts AllegraEra)
forall era.
ShelleyEraAccounts era =>
Credential 'Staking
-> Accounts era -> (Maybe (AccountState era), Accounts era)
unregisterShelleyAccount

instance ShelleyEraAccounts AllegraEra