{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Cardano.Ledger.CanonicalState.Namespace.GovProposals.Roots.V0 (
  GovProposalsRootsIn (..),
  GovProposalsRootsOut (..),
) where

import Cardano.Ledger.CanonicalState.LedgerCBOR
import Cardano.Ledger.CanonicalState.Namespace (NamespaceEra)
import Cardano.Ledger.CanonicalState.Namespace.GovProposals.V0 (CanonicalGovActionId (..))
import Cardano.Ledger.Core (Era)
import Cardano.Ledger.TxIn
import Cardano.SCLS.CBOR.Canonical.Decoder as D
import Cardano.SCLS.CBOR.Canonical.Encoder
import Cardano.SCLS.CDDL ()
import Cardano.SCLS.Entry.IsKey
import Cardano.SCLS.NamespaceCodec (
  CanonicalCBOREntryDecoder (..),
  CanonicalCBOREntryEncoder (..),
  KnownNamespace (NamespaceEntry, NamespaceKey),
  NamespaceKeySize,
  namespaceKeySize,
 )
import Cardano.SCLS.Versioned (Versioned (..))
import Data.Map (Map)
import Data.MapExtras (boundedEnumMap, lookupMapFail)
import Data.MemPack
import Data.Proxy (Proxy (..))
import Data.Word (Word8)
import GHC.Generics (Generic)

instance (Era era, NamespaceEra "gov/proposals/roots/v0" ~ era) => KnownNamespace "gov/proposals/roots/v0" where
  type NamespaceKey "gov/proposals/roots/v0" = GovProposalsRootsIn
  type NamespaceEntry "gov/proposals/roots/v0" = GovProposalsRootsOut

data GovProposalsRootsIn
  = GovProposalsRootsInPParamUpdate
  | GovProposalsRootsInHardFork
  | GovProposalsRootsInCommittee
  | GovProposalsRootsInConstitution
  deriving (GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
(GovProposalsRootsIn -> GovProposalsRootsIn -> Bool)
-> (GovProposalsRootsIn -> GovProposalsRootsIn -> Bool)
-> Eq GovProposalsRootsIn
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
== :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
$c/= :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
/= :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
Eq, Eq GovProposalsRootsIn
Eq GovProposalsRootsIn =>
(GovProposalsRootsIn -> GovProposalsRootsIn -> Ordering)
-> (GovProposalsRootsIn -> GovProposalsRootsIn -> Bool)
-> (GovProposalsRootsIn -> GovProposalsRootsIn -> Bool)
-> (GovProposalsRootsIn -> GovProposalsRootsIn -> Bool)
-> (GovProposalsRootsIn -> GovProposalsRootsIn -> Bool)
-> (GovProposalsRootsIn
    -> GovProposalsRootsIn -> GovProposalsRootsIn)
-> (GovProposalsRootsIn
    -> GovProposalsRootsIn -> GovProposalsRootsIn)
-> Ord GovProposalsRootsIn
GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
GovProposalsRootsIn -> GovProposalsRootsIn -> Ordering
GovProposalsRootsIn -> GovProposalsRootsIn -> GovProposalsRootsIn
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: GovProposalsRootsIn -> GovProposalsRootsIn -> Ordering
compare :: GovProposalsRootsIn -> GovProposalsRootsIn -> Ordering
$c< :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
< :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
$c<= :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
<= :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
$c> :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
> :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
$c>= :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
>= :: GovProposalsRootsIn -> GovProposalsRootsIn -> Bool
$cmax :: GovProposalsRootsIn -> GovProposalsRootsIn -> GovProposalsRootsIn
max :: GovProposalsRootsIn -> GovProposalsRootsIn -> GovProposalsRootsIn
$cmin :: GovProposalsRootsIn -> GovProposalsRootsIn -> GovProposalsRootsIn
min :: GovProposalsRootsIn -> GovProposalsRootsIn -> GovProposalsRootsIn
Ord, Int -> GovProposalsRootsIn -> ShowS
[GovProposalsRootsIn] -> ShowS
GovProposalsRootsIn -> String
(Int -> GovProposalsRootsIn -> ShowS)
-> (GovProposalsRootsIn -> String)
-> ([GovProposalsRootsIn] -> ShowS)
-> Show GovProposalsRootsIn
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GovProposalsRootsIn -> ShowS
showsPrec :: Int -> GovProposalsRootsIn -> ShowS
$cshow :: GovProposalsRootsIn -> String
show :: GovProposalsRootsIn -> String
$cshowList :: [GovProposalsRootsIn] -> ShowS
showList :: [GovProposalsRootsIn] -> ShowS
Show, Int -> GovProposalsRootsIn
GovProposalsRootsIn -> Int
GovProposalsRootsIn -> [GovProposalsRootsIn]
GovProposalsRootsIn -> GovProposalsRootsIn
GovProposalsRootsIn -> GovProposalsRootsIn -> [GovProposalsRootsIn]
GovProposalsRootsIn
-> GovProposalsRootsIn
-> GovProposalsRootsIn
-> [GovProposalsRootsIn]
(GovProposalsRootsIn -> GovProposalsRootsIn)
-> (GovProposalsRootsIn -> GovProposalsRootsIn)
-> (Int -> GovProposalsRootsIn)
-> (GovProposalsRootsIn -> Int)
-> (GovProposalsRootsIn -> [GovProposalsRootsIn])
-> (GovProposalsRootsIn
    -> GovProposalsRootsIn -> [GovProposalsRootsIn])
-> (GovProposalsRootsIn
    -> GovProposalsRootsIn -> [GovProposalsRootsIn])
-> (GovProposalsRootsIn
    -> GovProposalsRootsIn
    -> GovProposalsRootsIn
    -> [GovProposalsRootsIn])
-> Enum GovProposalsRootsIn
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: GovProposalsRootsIn -> GovProposalsRootsIn
succ :: GovProposalsRootsIn -> GovProposalsRootsIn
$cpred :: GovProposalsRootsIn -> GovProposalsRootsIn
pred :: GovProposalsRootsIn -> GovProposalsRootsIn
$ctoEnum :: Int -> GovProposalsRootsIn
toEnum :: Int -> GovProposalsRootsIn
$cfromEnum :: GovProposalsRootsIn -> Int
fromEnum :: GovProposalsRootsIn -> Int
$cenumFrom :: GovProposalsRootsIn -> [GovProposalsRootsIn]
enumFrom :: GovProposalsRootsIn -> [GovProposalsRootsIn]
$cenumFromThen :: GovProposalsRootsIn -> GovProposalsRootsIn -> [GovProposalsRootsIn]
enumFromThen :: GovProposalsRootsIn -> GovProposalsRootsIn -> [GovProposalsRootsIn]
$cenumFromTo :: GovProposalsRootsIn -> GovProposalsRootsIn -> [GovProposalsRootsIn]
enumFromTo :: GovProposalsRootsIn -> GovProposalsRootsIn -> [GovProposalsRootsIn]
$cenumFromThenTo :: GovProposalsRootsIn
-> GovProposalsRootsIn
-> GovProposalsRootsIn
-> [GovProposalsRootsIn]
enumFromThenTo :: GovProposalsRootsIn
-> GovProposalsRootsIn
-> GovProposalsRootsIn
-> [GovProposalsRootsIn]
Enum, GovProposalsRootsIn
GovProposalsRootsIn
-> GovProposalsRootsIn -> Bounded GovProposalsRootsIn
forall a. a -> a -> Bounded a
$cminBound :: GovProposalsRootsIn
minBound :: GovProposalsRootsIn
$cmaxBound :: GovProposalsRootsIn
maxBound :: GovProposalsRootsIn
Bounded, (forall x. GovProposalsRootsIn -> Rep GovProposalsRootsIn x)
-> (forall x. Rep GovProposalsRootsIn x -> GovProposalsRootsIn)
-> Generic GovProposalsRootsIn
forall x. Rep GovProposalsRootsIn x -> GovProposalsRootsIn
forall x. GovProposalsRootsIn -> Rep GovProposalsRootsIn x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. GovProposalsRootsIn -> Rep GovProposalsRootsIn x
from :: forall x. GovProposalsRootsIn -> Rep GovProposalsRootsIn x
$cto :: forall x. Rep GovProposalsRootsIn x -> GovProposalsRootsIn
to :: forall x. Rep GovProposalsRootsIn x -> GovProposalsRootsIn
Generic)

keyGovProposalsRootsIn :: GovProposalsRootsIn -> Word8
keyGovProposalsRootsIn :: GovProposalsRootsIn -> Word8
keyGovProposalsRootsIn = Int -> Word8
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Word8)
-> (GovProposalsRootsIn -> Int) -> GovProposalsRootsIn -> Word8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GovProposalsRootsIn -> Int
forall a. Enum a => a -> Int
fromEnum

mapGovProposalsRootsIn :: Map Word8 GovProposalsRootsIn
mapGovProposalsRootsIn :: Map Word8 GovProposalsRootsIn
mapGovProposalsRootsIn = (GovProposalsRootsIn -> Word8) -> Map Word8 GovProposalsRootsIn
forall k a. (Ord k, Bounded a, Enum a) => (a -> k) -> Map k a
boundedEnumMap GovProposalsRootsIn -> Word8
keyGovProposalsRootsIn

instance IsKey GovProposalsRootsIn where
  keySize :: Int
keySize = forall (ns :: Symbol). KnownNat (NamespaceKeySize ns) => Int
namespaceKeySize @"gov/proposals/roots/v0"
  packKeyM :: forall b. GovProposalsRootsIn -> Pack b ()
packKeyM = Word8 -> Pack b ()
forall s. Word8 -> Pack s ()
forall a s. MemPack a => a -> Pack s ()
packM (Word8 -> Pack b ())
-> (GovProposalsRootsIn -> Word8)
-> GovProposalsRootsIn
-> Pack b ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GovProposalsRootsIn -> Word8
keyGovProposalsRootsIn
  unpackKeyM :: forall b s. Buffer b => Unpack' s b GovProposalsRootsIn
unpackKeyM = do
    tag :: Word8 <- Unpack s b Word8
forall a b s. (MemPack a, Buffer b) => Unpack s b a
forall b s. Buffer b => Unpack s b Word8
unpackM
    lookupMapFail "GovProposalsRootsIn tag" mapGovProposalsRootsIn tag

newtype GovProposalsRootsOut = GovProposalsRootsOut CanonicalGovActionId
  deriving (GovProposalsRootsOut -> GovProposalsRootsOut -> Bool
(GovProposalsRootsOut -> GovProposalsRootsOut -> Bool)
-> (GovProposalsRootsOut -> GovProposalsRootsOut -> Bool)
-> Eq GovProposalsRootsOut
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GovProposalsRootsOut -> GovProposalsRootsOut -> Bool
== :: GovProposalsRootsOut -> GovProposalsRootsOut -> Bool
$c/= :: GovProposalsRootsOut -> GovProposalsRootsOut -> Bool
/= :: GovProposalsRootsOut -> GovProposalsRootsOut -> Bool
Eq, Int -> GovProposalsRootsOut -> ShowS
[GovProposalsRootsOut] -> ShowS
GovProposalsRootsOut -> String
(Int -> GovProposalsRootsOut -> ShowS)
-> (GovProposalsRootsOut -> String)
-> ([GovProposalsRootsOut] -> ShowS)
-> Show GovProposalsRootsOut
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> GovProposalsRootsOut -> ShowS
showsPrec :: Int -> GovProposalsRootsOut -> ShowS
$cshow :: GovProposalsRootsOut -> String
show :: GovProposalsRootsOut -> String
$cshowList :: [GovProposalsRootsOut] -> ShowS
showList :: [GovProposalsRootsOut] -> ShowS
Show, (forall x. GovProposalsRootsOut -> Rep GovProposalsRootsOut x)
-> (forall x. Rep GovProposalsRootsOut x -> GovProposalsRootsOut)
-> Generic GovProposalsRootsOut
forall x. Rep GovProposalsRootsOut x -> GovProposalsRootsOut
forall x. GovProposalsRootsOut -> Rep GovProposalsRootsOut x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. GovProposalsRootsOut -> Rep GovProposalsRootsOut x
from :: forall x. GovProposalsRootsOut -> Rep GovProposalsRootsOut x
$cto :: forall x. Rep GovProposalsRootsOut x -> GovProposalsRootsOut
to :: forall x. Rep GovProposalsRootsOut x -> GovProposalsRootsOut
Generic)

deriving newtype instance
  ToCanonicalCBOR "gov/proposals/roots/v0" CanonicalGovActionId =>
  ToCanonicalCBOR "gov/proposals/roots/v0" GovProposalsRootsOut

deriving newtype instance
  FromCanonicalCBOR "gov/proposals/roots/v0" CanonicalGovActionId =>
  FromCanonicalCBOR "gov/proposals/roots/v0" GovProposalsRootsOut

instance
  (Era era, NamespaceEra "gov/proposals/roots/v0" ~ era) =>
  ToCanonicalCBOR "gov/proposals/roots/v0" CanonicalGovActionId
  where
  toCanonicalCBOR :: forall (proxy :: Symbol -> *).
proxy "gov/proposals/roots/v0"
-> CanonicalGovActionId -> CanonicalEncoding
toCanonicalCBOR proxy "gov/proposals/roots/v0"
v (CanonicalGovActionId {TxId
CanonicalGovActionIx
gaidTxId :: TxId
gaidGovActionIx :: CanonicalGovActionIx
gaidGovActionIx :: CanonicalGovActionId -> CanonicalGovActionIx
gaidTxId :: CanonicalGovActionId -> TxId
..}) =
    proxy "gov/proposals/roots/v0"
-> (TxId, CanonicalGovActionIx) -> CanonicalEncoding
forall (v :: Symbol) a (proxy :: Symbol -> *).
ToCanonicalCBOR v a =>
proxy v -> a -> CanonicalEncoding
forall (proxy :: Symbol -> *).
proxy "gov/proposals/roots/v0"
-> (TxId, CanonicalGovActionIx) -> CanonicalEncoding
toCanonicalCBOR proxy "gov/proposals/roots/v0"
v (TxId
gaidTxId, CanonicalGovActionIx
gaidGovActionIx)

instance
  (Era era, NamespaceEra "gov/proposals/roots/v0" ~ era) =>
  FromCanonicalCBOR "gov/proposals/roots/v0" CanonicalGovActionId
  where
  fromCanonicalCBOR :: forall s.
CanonicalDecoder
  s (Versioned "gov/proposals/roots/v0" CanonicalGovActionId)
fromCanonicalCBOR = do
    Versioned (gaidTxId, gaidGovActionIx) <- forall (v :: Symbol) a s.
FromCanonicalCBOR v a =>
CanonicalDecoder s (Versioned v a)
fromCanonicalCBOR @"gov/proposals/roots/v0"
    return $ Versioned CanonicalGovActionId {..}

deriving via
  LedgerCBOR v TxId
  instance
    (Era era, NamespaceEra v ~ era) =>
    ToCanonicalCBOR v TxId

deriving via
  LedgerCBOR v TxId
  instance
    (Era era, NamespaceEra v ~ era) =>
    FromCanonicalCBOR v TxId

type instance NamespaceKeySize "gov/proposals/roots/v0" = 1

instance
  (Era era, NamespaceEra "gov/proposals/roots/v0" ~ era) =>
  CanonicalCBOREntryEncoder "gov/proposals/roots/v0" GovProposalsRootsOut
  where
  encodeEntry :: GovProposalsRootsOut -> CanonicalEncoding
encodeEntry = Proxy "gov/proposals/roots/v0"
-> GovProposalsRootsOut -> CanonicalEncoding
forall (v :: Symbol) a (proxy :: Symbol -> *).
ToCanonicalCBOR v a =>
proxy v -> a -> CanonicalEncoding
forall (proxy :: Symbol -> *).
proxy "gov/proposals/roots/v0"
-> GovProposalsRootsOut -> CanonicalEncoding
toCanonicalCBOR (forall {k} (t :: k). Proxy t
forall (t :: Symbol). Proxy t
Proxy @"gov/proposals/roots/v0")

instance
  (Era era, NamespaceEra "gov/proposals/roots/v0" ~ era) =>
  CanonicalCBOREntryDecoder "gov/proposals/roots/v0" GovProposalsRootsOut
  where
  decodeEntry :: forall s.
CanonicalDecoder
  s (Versioned "gov/proposals/roots/v0" GovProposalsRootsOut)
decodeEntry = CanonicalDecoder
  s (Versioned "gov/proposals/roots/v0" GovProposalsRootsOut)
forall s.
CanonicalDecoder
  s (Versioned "gov/proposals/roots/v0" GovProposalsRootsOut)
forall (v :: Symbol) a s.
FromCanonicalCBOR v a =>
CanonicalDecoder s (Versioned v a)
fromCanonicalCBOR