{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
module Cardano.Ledger.Internal.Definition.Era (
Era (..),
EraHasName (..),
ByronEra,
ShelleyEra,
AllegraEra,
MaryEra,
AlonzoEra,
BabbageEra,
ConwayEra,
DijkstraEra,
) where
import Cardano.Ledger.Binary (MaxVersion, MinVersion)
import Data.Kind (Type)
import Data.Typeable (Typeable)
import GHC.Exts (Proxy#, proxy#)
import GHC.TypeLits
class
( Typeable era
, KnownNat (ProtVerLow era)
, KnownNat (ProtVerHigh era)
, ProtVerLow era <= ProtVerHigh era
, MinVersion <= ProtVerLow era
, MinVersion <= ProtVerHigh era
,
CmpNat (ProtVerLow era) MaxVersion ~ 'LT
, CmpNat (ProtVerHigh era) MaxVersion ~ 'LT
) =>
Era era
where
type EraName era :: Symbol
type PreviousEra era = (r :: Type) | r -> era
type ProtVerLow era :: Nat
type ProtVerHigh era :: Nat
type ProtVerHigh era = ProtVerLow era
eraName :: String
default eraName :: KnownSymbol (EraName era) => String
eraName = Proxy# (EraName era) -> String
forall (n :: Symbol). KnownSymbol n => Proxy# n -> String
symbolVal' (Proxy# (EraName era)
forall {k} (a :: k). Proxy# a
proxy# :: Proxy# (EraName era))
data VoidEra
data ByronEra
instance Era ByronEra where
type EraName ByronEra = "Byron"
type PreviousEra ByronEra = VoidEra
type ProtVerLow ByronEra = 0
type ProtVerHigh ByronEra = 1
data ShelleyEra
instance Era ShelleyEra where
type EraName ShelleyEra = "Shelley"
type PreviousEra ShelleyEra = ByronEra
type ProtVerLow ShelleyEra = 2
data AllegraEra
instance Era AllegraEra where
type EraName AllegraEra = "Allegra"
type PreviousEra AllegraEra = ShelleyEra
type ProtVerLow AllegraEra = 3
data MaryEra
instance Era MaryEra where
type EraName MaryEra = "Mary"
type PreviousEra MaryEra = AllegraEra
type ProtVerLow MaryEra = 4
data AlonzoEra
instance Era AlonzoEra where
type EraName AlonzoEra = "Alonzo"
type PreviousEra AlonzoEra = MaryEra
type ProtVerLow AlonzoEra = 5
type ProtVerHigh AlonzoEra = 6
data BabbageEra
instance Era BabbageEra where
type EraName BabbageEra = "Babbage"
type PreviousEra BabbageEra = AlonzoEra
type ProtVerLow BabbageEra = 7
type ProtVerHigh BabbageEra = 8
data ConwayEra
instance Era ConwayEra where
type EraName ConwayEra = "Conway"
type PreviousEra ConwayEra = BabbageEra
type ProtVerLow ConwayEra = 9
type ProtVerHigh ConwayEra = 11
data DijkstraEra
instance Era DijkstraEra where
type EraName DijkstraEra = "Dijkstra"
type PreviousEra DijkstraEra = ConwayEra
type ProtVerLow DijkstraEra = 12
type ProtVerHigh DijkstraEra = 12
class
( KnownSymbol eraName
, Era (EraFromName eraName)
, EraName (EraFromName eraName) ~ eraName
) =>
EraHasName eraName
where
type EraFromName eraName = (era :: Type) | era -> eraName
instance EraHasName "Byron" where
type EraFromName "Byron" = ByronEra
instance EraHasName "Shelley" where
type EraFromName "Shelley" = ShelleyEra
instance EraHasName "Allegra" where
type EraFromName "Allegra" = AllegraEra
instance EraHasName "Mary" where
type EraFromName "Mary" = MaryEra
instance EraHasName "Alonzo" where
type EraFromName "Alonzo" = AlonzoEra
instance EraHasName "Babbage" where
type EraFromName "Babbage" = BabbageEra
instance EraHasName "Conway" where
type EraFromName "Conway" = ConwayEra
instance EraHasName "Dijkstra" where
type EraFromName "Dijkstra" = DijkstraEra