{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE UndecidableInstances #-}

module Cardano.Chain.Slotting.EpochNumber (
  EpochNumber (..),
  isBootstrapEra,
) where

import Cardano.Ledger.Binary (
  DecCBOR (..),
  EncCBOR (..),
  FromCBOR (..),
  ToCBOR (..),
  fromByronCBOR,
  toByronCBOR,
 )
import Cardano.Prelude
import qualified Data.Aeson as Aeson
import Data.Data (Data)
import Data.Ix (Ix)
import Formatting (bprint, int)
import Formatting.Buildable (Buildable (..))
import NoThunks.Class (NoThunks (..))
import Text.JSON.Canonical (FromJSON (..), ToJSON (..))

-- | Index of epoch.
newtype EpochNumber = EpochNumber
  { EpochNumber -> Word64
getEpochNumber :: Word64
  }
  deriving
    ( Int -> EpochNumber -> ShowS
[EpochNumber] -> ShowS
EpochNumber -> String
(Int -> EpochNumber -> ShowS)
-> (EpochNumber -> String)
-> ([EpochNumber] -> ShowS)
-> Show EpochNumber
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EpochNumber -> ShowS
showsPrec :: Int -> EpochNumber -> ShowS
$cshow :: EpochNumber -> String
show :: EpochNumber -> String
$cshowList :: [EpochNumber] -> ShowS
showList :: [EpochNumber] -> ShowS
Show
    , Typeable EpochNumber
Typeable EpochNumber =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> EpochNumber -> c EpochNumber)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c EpochNumber)
-> (EpochNumber -> Constr)
-> (EpochNumber -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c EpochNumber))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c EpochNumber))
-> ((forall b. Data b => b -> b) -> EpochNumber -> EpochNumber)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> EpochNumber -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> EpochNumber -> r)
-> (forall u. (forall d. Data d => d -> u) -> EpochNumber -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> EpochNumber -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber)
-> Data EpochNumber
EpochNumber -> Constr
EpochNumber -> DataType
(forall b. Data b => b -> b) -> EpochNumber -> EpochNumber
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> EpochNumber -> u
forall u. (forall d. Data d => d -> u) -> EpochNumber -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> EpochNumber -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> EpochNumber -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c EpochNumber
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> EpochNumber -> c EpochNumber
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c EpochNumber)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c EpochNumber)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> EpochNumber -> c EpochNumber
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> EpochNumber -> c EpochNumber
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c EpochNumber
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c EpochNumber
$ctoConstr :: EpochNumber -> Constr
toConstr :: EpochNumber -> Constr
$cdataTypeOf :: EpochNumber -> DataType
dataTypeOf :: EpochNumber -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c EpochNumber)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c EpochNumber)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c EpochNumber)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c EpochNumber)
$cgmapT :: (forall b. Data b => b -> b) -> EpochNumber -> EpochNumber
gmapT :: (forall b. Data b => b -> b) -> EpochNumber -> EpochNumber
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> EpochNumber -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> EpochNumber -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> EpochNumber -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> EpochNumber -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> EpochNumber -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> EpochNumber -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> EpochNumber -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> EpochNumber -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> EpochNumber -> m EpochNumber
Data
    , EpochNumber -> EpochNumber -> Bool
(EpochNumber -> EpochNumber -> Bool)
-> (EpochNumber -> EpochNumber -> Bool) -> Eq EpochNumber
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EpochNumber -> EpochNumber -> Bool
== :: EpochNumber -> EpochNumber -> Bool
$c/= :: EpochNumber -> EpochNumber -> Bool
/= :: EpochNumber -> EpochNumber -> Bool
Eq
    , Eq EpochNumber
Eq EpochNumber =>
(EpochNumber -> EpochNumber -> Ordering)
-> (EpochNumber -> EpochNumber -> Bool)
-> (EpochNumber -> EpochNumber -> Bool)
-> (EpochNumber -> EpochNumber -> Bool)
-> (EpochNumber -> EpochNumber -> Bool)
-> (EpochNumber -> EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber -> EpochNumber)
-> Ord EpochNumber
EpochNumber -> EpochNumber -> Bool
EpochNumber -> EpochNumber -> Ordering
EpochNumber -> EpochNumber -> EpochNumber
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 :: EpochNumber -> EpochNumber -> Ordering
compare :: EpochNumber -> EpochNumber -> Ordering
$c< :: EpochNumber -> EpochNumber -> Bool
< :: EpochNumber -> EpochNumber -> Bool
$c<= :: EpochNumber -> EpochNumber -> Bool
<= :: EpochNumber -> EpochNumber -> Bool
$c> :: EpochNumber -> EpochNumber -> Bool
> :: EpochNumber -> EpochNumber -> Bool
$c>= :: EpochNumber -> EpochNumber -> Bool
>= :: EpochNumber -> EpochNumber -> Bool
$cmax :: EpochNumber -> EpochNumber -> EpochNumber
max :: EpochNumber -> EpochNumber -> EpochNumber
$cmin :: EpochNumber -> EpochNumber -> EpochNumber
min :: EpochNumber -> EpochNumber -> EpochNumber
Ord
    , Integer -> EpochNumber
EpochNumber -> EpochNumber
EpochNumber -> EpochNumber -> EpochNumber
(EpochNumber -> EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber)
-> (Integer -> EpochNumber)
-> Num EpochNumber
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: EpochNumber -> EpochNumber -> EpochNumber
+ :: EpochNumber -> EpochNumber -> EpochNumber
$c- :: EpochNumber -> EpochNumber -> EpochNumber
- :: EpochNumber -> EpochNumber -> EpochNumber
$c* :: EpochNumber -> EpochNumber -> EpochNumber
* :: EpochNumber -> EpochNumber -> EpochNumber
$cnegate :: EpochNumber -> EpochNumber
negate :: EpochNumber -> EpochNumber
$cabs :: EpochNumber -> EpochNumber
abs :: EpochNumber -> EpochNumber
$csignum :: EpochNumber -> EpochNumber
signum :: EpochNumber -> EpochNumber
$cfromInteger :: Integer -> EpochNumber
fromInteger :: Integer -> EpochNumber
Num
    , Int -> EpochNumber
EpochNumber -> Int
EpochNumber -> [EpochNumber]
EpochNumber -> EpochNumber
EpochNumber -> EpochNumber -> [EpochNumber]
EpochNumber -> EpochNumber -> EpochNumber -> [EpochNumber]
(EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber)
-> (Int -> EpochNumber)
-> (EpochNumber -> Int)
-> (EpochNumber -> [EpochNumber])
-> (EpochNumber -> EpochNumber -> [EpochNumber])
-> (EpochNumber -> EpochNumber -> [EpochNumber])
-> (EpochNumber -> EpochNumber -> EpochNumber -> [EpochNumber])
-> Enum EpochNumber
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 :: EpochNumber -> EpochNumber
succ :: EpochNumber -> EpochNumber
$cpred :: EpochNumber -> EpochNumber
pred :: EpochNumber -> EpochNumber
$ctoEnum :: Int -> EpochNumber
toEnum :: Int -> EpochNumber
$cfromEnum :: EpochNumber -> Int
fromEnum :: EpochNumber -> Int
$cenumFrom :: EpochNumber -> [EpochNumber]
enumFrom :: EpochNumber -> [EpochNumber]
$cenumFromThen :: EpochNumber -> EpochNumber -> [EpochNumber]
enumFromThen :: EpochNumber -> EpochNumber -> [EpochNumber]
$cenumFromTo :: EpochNumber -> EpochNumber -> [EpochNumber]
enumFromTo :: EpochNumber -> EpochNumber -> [EpochNumber]
$cenumFromThenTo :: EpochNumber -> EpochNumber -> EpochNumber -> [EpochNumber]
enumFromThenTo :: EpochNumber -> EpochNumber -> EpochNumber -> [EpochNumber]
Enum
    , Ord EpochNumber
Ord EpochNumber =>
((EpochNumber, EpochNumber) -> [EpochNumber])
-> ((EpochNumber, EpochNumber) -> EpochNumber -> Int)
-> ((EpochNumber, EpochNumber) -> EpochNumber -> Int)
-> ((EpochNumber, EpochNumber) -> EpochNumber -> Bool)
-> ((EpochNumber, EpochNumber) -> Int)
-> ((EpochNumber, EpochNumber) -> Int)
-> Ix EpochNumber
(EpochNumber, EpochNumber) -> Int
(EpochNumber, EpochNumber) -> [EpochNumber]
(EpochNumber, EpochNumber) -> EpochNumber -> Bool
(EpochNumber, EpochNumber) -> EpochNumber -> Int
forall a.
Ord a =>
((a, a) -> [a])
-> ((a, a) -> a -> Int)
-> ((a, a) -> a -> Int)
-> ((a, a) -> a -> Bool)
-> ((a, a) -> Int)
-> ((a, a) -> Int)
-> Ix a
$crange :: (EpochNumber, EpochNumber) -> [EpochNumber]
range :: (EpochNumber, EpochNumber) -> [EpochNumber]
$cindex :: (EpochNumber, EpochNumber) -> EpochNumber -> Int
index :: (EpochNumber, EpochNumber) -> EpochNumber -> Int
$cunsafeIndex :: (EpochNumber, EpochNumber) -> EpochNumber -> Int
unsafeIndex :: (EpochNumber, EpochNumber) -> EpochNumber -> Int
$cinRange :: (EpochNumber, EpochNumber) -> EpochNumber -> Bool
inRange :: (EpochNumber, EpochNumber) -> EpochNumber -> Bool
$crangeSize :: (EpochNumber, EpochNumber) -> Int
rangeSize :: (EpochNumber, EpochNumber) -> Int
$cunsafeRangeSize :: (EpochNumber, EpochNumber) -> Int
unsafeRangeSize :: (EpochNumber, EpochNumber) -> Int
Ix
    , Enum EpochNumber
Real EpochNumber
(Real EpochNumber, Enum EpochNumber) =>
(EpochNumber -> EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber -> EpochNumber)
-> (EpochNumber -> EpochNumber -> (EpochNumber, EpochNumber))
-> (EpochNumber -> EpochNumber -> (EpochNumber, EpochNumber))
-> (EpochNumber -> Integer)
-> Integral EpochNumber
EpochNumber -> Integer
EpochNumber -> EpochNumber -> (EpochNumber, EpochNumber)
EpochNumber -> EpochNumber -> EpochNumber
forall a.
(Real a, Enum a) =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
$cquot :: EpochNumber -> EpochNumber -> EpochNumber
quot :: EpochNumber -> EpochNumber -> EpochNumber
$crem :: EpochNumber -> EpochNumber -> EpochNumber
rem :: EpochNumber -> EpochNumber -> EpochNumber
$cdiv :: EpochNumber -> EpochNumber -> EpochNumber
div :: EpochNumber -> EpochNumber -> EpochNumber
$cmod :: EpochNumber -> EpochNumber -> EpochNumber
mod :: EpochNumber -> EpochNumber -> EpochNumber
$cquotRem :: EpochNumber -> EpochNumber -> (EpochNumber, EpochNumber)
quotRem :: EpochNumber -> EpochNumber -> (EpochNumber, EpochNumber)
$cdivMod :: EpochNumber -> EpochNumber -> (EpochNumber, EpochNumber)
divMod :: EpochNumber -> EpochNumber -> (EpochNumber, EpochNumber)
$ctoInteger :: EpochNumber -> Integer
toInteger :: EpochNumber -> Integer
Integral
    , Num EpochNumber
Ord EpochNumber
(Num EpochNumber, Ord EpochNumber) =>
(EpochNumber -> Rational) -> Real EpochNumber
EpochNumber -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: EpochNumber -> Rational
toRational :: EpochNumber -> Rational
Real
    , (forall x. EpochNumber -> Rep EpochNumber x)
-> (forall x. Rep EpochNumber x -> EpochNumber)
-> Generic EpochNumber
forall x. Rep EpochNumber x -> EpochNumber
forall x. EpochNumber -> Rep EpochNumber x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. EpochNumber -> Rep EpochNumber x
from :: forall x. EpochNumber -> Rep EpochNumber x
$cto :: forall x. Rep EpochNumber x -> EpochNumber
to :: forall x. Rep EpochNumber x -> EpochNumber
Generic
    , EpochNumber
EpochNumber -> EpochNumber -> Bounded EpochNumber
forall a. a -> a -> Bounded a
$cminBound :: EpochNumber
minBound :: EpochNumber
$cmaxBound :: EpochNumber
maxBound :: EpochNumber
Bounded
    , EpochNumber -> ()
(EpochNumber -> ()) -> NFData EpochNumber
forall a. (a -> ()) -> NFData a
$crnf :: EpochNumber -> ()
rnf :: EpochNumber -> ()
NFData
    , Context -> EpochNumber -> IO (Maybe ThunkInfo)
Proxy EpochNumber -> String
(Context -> EpochNumber -> IO (Maybe ThunkInfo))
-> (Context -> EpochNumber -> IO (Maybe ThunkInfo))
-> (Proxy EpochNumber -> String)
-> NoThunks EpochNumber
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> EpochNumber -> IO (Maybe ThunkInfo)
noThunks :: Context -> EpochNumber -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> EpochNumber -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> EpochNumber -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy EpochNumber -> String
showTypeOf :: Proxy EpochNumber -> String
NoThunks
    )

instance Buildable EpochNumber where
  build :: EpochNumber -> Builder
build = Format Builder (EpochNumber -> Builder) -> EpochNumber -> Builder
forall a. Format Builder a -> a
bprint (Format (EpochNumber -> Builder) (EpochNumber -> Builder)
"#" Format (EpochNumber -> Builder) (EpochNumber -> Builder)
-> Format Builder (EpochNumber -> Builder)
-> Format Builder (EpochNumber -> Builder)
forall b c a. Format b c -> Format a b -> Format a c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. Format Builder (EpochNumber -> Builder)
forall a r. Integral a => Format r (a -> r)
int)

-- Used for debugging purposes only
instance Aeson.ToJSON EpochNumber

instance ToCBOR EpochNumber where
  toCBOR :: EpochNumber -> Encoding
toCBOR = EpochNumber -> Encoding
forall a. EncCBOR a => a -> Encoding
toByronCBOR

instance FromCBOR EpochNumber where
  fromCBOR :: forall s. Decoder s EpochNumber
fromCBOR = Decoder s EpochNumber
forall a s. DecCBOR a => Decoder s a
fromByronCBOR

instance EncCBOR EpochNumber where
  encCBOR :: EpochNumber -> Encoding
encCBOR (EpochNumber Word64
epoch) = Word64 -> Encoding
forall a. EncCBOR a => a -> Encoding
encCBOR Word64
epoch
  encodedSizeExpr :: (forall t. EncCBOR t => Proxy t -> Size)
-> Proxy EpochNumber -> Size
encodedSizeExpr forall t. EncCBOR t => Proxy t -> Size
size = (forall t. EncCBOR t => Proxy t -> Size) -> Proxy Word64 -> Size
forall a.
EncCBOR a =>
(forall t. EncCBOR t => Proxy t -> Size) -> Proxy a -> Size
encodedSizeExpr Proxy t -> Size
forall t. EncCBOR t => Proxy t -> Size
size (Proxy Word64 -> Size)
-> (Proxy EpochNumber -> Proxy Word64) -> Proxy EpochNumber -> Size
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. (EpochNumber -> Word64) -> Proxy EpochNumber -> Proxy Word64
forall a b. (a -> b) -> Proxy a -> Proxy b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap EpochNumber -> Word64
getEpochNumber

instance DecCBOR EpochNumber where
  decCBOR :: forall s. Decoder s EpochNumber
decCBOR = Word64 -> EpochNumber
EpochNumber (Word64 -> EpochNumber)
-> Decoder s Word64 -> Decoder s EpochNumber
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Decoder s Word64
forall s. Decoder s Word64
forall a s. DecCBOR a => Decoder s a
decCBOR

-- Note that it will be encoded as string, because 'EpochNumber' doesn't
-- necessary fit into JS number.
instance Monad m => ToJSON m EpochNumber where
  toJSON :: EpochNumber -> m JSValue
toJSON = Word64 -> m JSValue
forall (m :: * -> *) a. ToJSON m a => a -> m JSValue
toJSON (Word64 -> m JSValue)
-> (EpochNumber -> Word64) -> EpochNumber -> m JSValue
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. EpochNumber -> Word64
getEpochNumber

instance MonadError SchemaError m => FromJSON m EpochNumber where
  fromJSON :: JSValue -> m EpochNumber
fromJSON = (Word64 -> EpochNumber) -> m Word64 -> m EpochNumber
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Word64 -> EpochNumber
EpochNumber (m Word64 -> m EpochNumber)
-> (JSValue -> m Word64) -> JSValue -> m EpochNumber
forall b c a. (b -> c) -> (a -> b) -> a -> c
forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. JSValue -> m Word64
forall (m :: * -> *) a. FromJSON m a => JSValue -> m a
fromJSON

-- | Bootstrap era is ongoing until stakes are unlocked. The reward era starts
--   from the epoch specified as the epoch that unlocks stakes:
--
--   @
--                       [unlock stake epoch]
--                               /
--   Epoch: ...  E-3  E-2  E-1   E+0  E+1  E+2  E+3  ...
--          ------------------ | -----------------------
--               Bootstrap era   Reward era
--   @
isBootstrapEra ::
  -- | Unlock stake epoch
  EpochNumber ->
  -- | Epoch in question (for which we determine whether it belongs to the
  --   bootstrap era)
  EpochNumber ->
  Bool
isBootstrapEra :: EpochNumber -> EpochNumber -> Bool
isBootstrapEra EpochNumber
unlockStakeEpoch EpochNumber
epoch = EpochNumber
epoch EpochNumber -> EpochNumber -> Bool
forall a. Ord a => a -> a -> Bool
< EpochNumber
unlockStakeEpoch