{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}

module Cardano.Api.Era.Internal.Case
  ( -- Case on CardanoEra
    caseByronOrShelleyBasedEra
  -- Case on ShelleyBasedEra
  , caseShelleyEraOnlyOrAllegraEraOnwards
  , caseShelleyToBabbageOrConwayEraOnwards
  )
where

import Cardano.Api.Era.Internal.Core
import Cardano.Api.Era.Internal.Eon.AllegraEraOnwards
import Cardano.Api.Era.Internal.Eon.ConwayEraOnwards
import Cardano.Api.Era.Internal.Eon.ShelleyBasedEra
import Cardano.Api.Era.Internal.Eon.ShelleyEraOnly
import Cardano.Api.Era.Internal.Eon.ShelleyToBabbageEra

-- | @caseByronOrShelleyBasedEra f g era@ returns @f@ in Byron and applies @g@ to Shelley-based eras.
caseByronOrShelleyBasedEra
  :: ()
  => a
  -> (ShelleyBasedEraConstraints era => ShelleyBasedEra era -> a)
  -> CardanoEra era
  -> a
caseByronOrShelleyBasedEra :: forall a era.
a
-> (ShelleyBasedEraConstraints era => ShelleyBasedEra era -> a)
-> CardanoEra era
-> a
caseByronOrShelleyBasedEra a
l ShelleyBasedEraConstraints era => ShelleyBasedEra era -> a
r = \case
  CardanoEra era
ByronEra -> a
l -- We no longer provide the witness because Byron is isolated.
  -- This function will be deleted shortly after build-raw --byron-era is
  -- deprecated in cardano-cli
  CardanoEra era
ShelleyEra -> ShelleyBasedEraConstraints era => ShelleyBasedEra era -> a
ShelleyBasedEra era -> a
r ShelleyBasedEra era
ShelleyBasedEra ShelleyEra
ShelleyBasedEraShelley
  CardanoEra era
AllegraEra -> ShelleyBasedEraConstraints era => ShelleyBasedEra era -> a
ShelleyBasedEra era -> a
r ShelleyBasedEra era
ShelleyBasedEra AllegraEra
ShelleyBasedEraAllegra
  CardanoEra era
MaryEra -> ShelleyBasedEraConstraints era => ShelleyBasedEra era -> a
ShelleyBasedEra era -> a
r ShelleyBasedEra era
ShelleyBasedEra MaryEra
ShelleyBasedEraMary
  CardanoEra era
AlonzoEra -> ShelleyBasedEraConstraints era => ShelleyBasedEra era -> a
ShelleyBasedEra era -> a
r ShelleyBasedEra era
ShelleyBasedEra AlonzoEra
ShelleyBasedEraAlonzo
  CardanoEra era
BabbageEra -> ShelleyBasedEraConstraints era => ShelleyBasedEra era -> a
ShelleyBasedEra era -> a
r ShelleyBasedEra era
ShelleyBasedEra BabbageEra
ShelleyBasedEraBabbage
  CardanoEra era
ConwayEra -> ShelleyBasedEraConstraints era => ShelleyBasedEra era -> a
ShelleyBasedEra era -> a
r ShelleyBasedEra era
ShelleyBasedEra ConwayEra
ShelleyBasedEraConway
  CardanoEra era
DijkstraEra -> [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"TODO Dijkstra: caseByronOrShelleyBasedEra: era not supported"

-- | @caseShelleyEraOnlyOrAllegraEraOnwards f g era@ applies @f@ to shelley;
-- and applies @g@ to allegra and later eras.
caseShelleyEraOnlyOrAllegraEraOnwards
  :: ()
  => (ShelleyEraOnlyConstraints era => ShelleyEraOnly era -> a)
  -> (AllegraEraOnwardsConstraints era => AllegraEraOnwards era -> a)
  -> ShelleyBasedEra era
  -> a
caseShelleyEraOnlyOrAllegraEraOnwards :: forall era a.
(ShelleyEraOnlyConstraints era => ShelleyEraOnly era -> a)
-> (AllegraEraOnwardsConstraints era => AllegraEraOnwards era -> a)
-> ShelleyBasedEra era
-> a
caseShelleyEraOnlyOrAllegraEraOnwards ShelleyEraOnlyConstraints era => ShelleyEraOnly era -> a
l AllegraEraOnwardsConstraints era => AllegraEraOnwards era -> a
r = \case
  ShelleyBasedEra era
ShelleyBasedEraShelley -> ShelleyEraOnlyConstraints era => ShelleyEraOnly era -> a
ShelleyEraOnly era -> a
l ShelleyEraOnly era
ShelleyEraOnly ShelleyEra
ShelleyEraOnlyShelley
  ShelleyBasedEra era
ShelleyBasedEraAllegra -> AllegraEraOnwardsConstraints era => AllegraEraOnwards era -> a
AllegraEraOnwards era -> a
r AllegraEraOnwards era
AllegraEraOnwards AllegraEra
AllegraEraOnwardsAllegra
  ShelleyBasedEra era
ShelleyBasedEraMary -> AllegraEraOnwardsConstraints era => AllegraEraOnwards era -> a
AllegraEraOnwards era -> a
r AllegraEraOnwards era
AllegraEraOnwards MaryEra
AllegraEraOnwardsMary
  ShelleyBasedEra era
ShelleyBasedEraAlonzo -> AllegraEraOnwardsConstraints era => AllegraEraOnwards era -> a
AllegraEraOnwards era -> a
r AllegraEraOnwards era
AllegraEraOnwards AlonzoEra
AllegraEraOnwardsAlonzo
  ShelleyBasedEra era
ShelleyBasedEraBabbage -> AllegraEraOnwardsConstraints era => AllegraEraOnwards era -> a
AllegraEraOnwards era -> a
r AllegraEraOnwards era
AllegraEraOnwards BabbageEra
AllegraEraOnwardsBabbage
  ShelleyBasedEra era
ShelleyBasedEraConway -> AllegraEraOnwardsConstraints era => AllegraEraOnwards era -> a
AllegraEraOnwards era -> a
r AllegraEraOnwards era
AllegraEraOnwards ConwayEra
AllegraEraOnwardsConway
  ShelleyBasedEra era
ShelleyBasedEraDijkstra -> [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"TODO Dijkstra: caseShelleyEraOnlyOrAllegraEraOnwards: era not supported"

-- | @caseShelleyToBabbageOrConwayEraOnwards f g era@ applies @f@ to eras before conway;
-- and applies @g@ to conway and later eras.
caseShelleyToBabbageOrConwayEraOnwards
  :: ()
  => (ShelleyToBabbageEraConstraints era => ShelleyToBabbageEra era -> a)
  -> (ConwayEraOnwardsConstraints era => ConwayEraOnwards era -> a)
  -> ShelleyBasedEra era
  -> a
caseShelleyToBabbageOrConwayEraOnwards :: forall era a.
(ShelleyToBabbageEraConstraints era =>
 ShelleyToBabbageEra era -> a)
-> (ConwayEraOnwardsConstraints era => ConwayEraOnwards era -> a)
-> ShelleyBasedEra era
-> a
caseShelleyToBabbageOrConwayEraOnwards ShelleyToBabbageEraConstraints era => ShelleyToBabbageEra era -> a
l ConwayEraOnwardsConstraints era => ConwayEraOnwards era -> a
r = \case
  ShelleyBasedEra era
ShelleyBasedEraShelley -> ShelleyToBabbageEraConstraints era => ShelleyToBabbageEra era -> a
ShelleyToBabbageEra era -> a
l ShelleyToBabbageEra era
ShelleyToBabbageEra ShelleyEra
ShelleyToBabbageEraShelley
  ShelleyBasedEra era
ShelleyBasedEraAllegra -> ShelleyToBabbageEraConstraints era => ShelleyToBabbageEra era -> a
ShelleyToBabbageEra era -> a
l ShelleyToBabbageEra era
ShelleyToBabbageEra AllegraEra
ShelleyToBabbageEraAllegra
  ShelleyBasedEra era
ShelleyBasedEraMary -> ShelleyToBabbageEraConstraints era => ShelleyToBabbageEra era -> a
ShelleyToBabbageEra era -> a
l ShelleyToBabbageEra era
ShelleyToBabbageEra MaryEra
ShelleyToBabbageEraMary
  ShelleyBasedEra era
ShelleyBasedEraAlonzo -> ShelleyToBabbageEraConstraints era => ShelleyToBabbageEra era -> a
ShelleyToBabbageEra era -> a
l ShelleyToBabbageEra era
ShelleyToBabbageEra AlonzoEra
ShelleyToBabbageEraAlonzo
  ShelleyBasedEra era
ShelleyBasedEraBabbage -> ShelleyToBabbageEraConstraints era => ShelleyToBabbageEra era -> a
ShelleyToBabbageEra era -> a
l ShelleyToBabbageEra era
ShelleyToBabbageEra BabbageEra
ShelleyToBabbageEraBabbage
  ShelleyBasedEra era
ShelleyBasedEraConway -> ConwayEraOnwardsConstraints era => ConwayEraOnwards era -> a
ConwayEraOnwards era -> a
r ConwayEraOnwards era
ConwayEraOnwards ConwayEra
ConwayEraOnwardsConway
  ShelleyBasedEra era
ShelleyBasedEraDijkstra -> [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"TODO Dijkstra: caseShelleyToBabbageOrConwayEraOnwards: era not supported"