{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingVia #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Cardano.Slotting.Block (
  BlockNo (..),
)
where

import Cardano.Binary (FromCBOR (..), ToCBOR (..))
import Codec.Serialise (Serialise (..))
import Control.DeepSeq (NFData)
import Data.Aeson (FromJSON, ToJSON)
import Data.Word (Word64)
import GHC.Generics (Generic)
import NoThunks.Class (NoThunks)
import Quiet (Quiet (..))

-- | The 0-based index of the block in the blockchain.
-- BlockNo is <= SlotNo and is only equal at slot N if there is a block
-- for every slot where N <= SlotNo.
newtype BlockNo = BlockNo {BlockNo -> Word64
unBlockNo :: Word64}
  deriving stock (BlockNo -> BlockNo -> Bool
(BlockNo -> BlockNo -> Bool)
-> (BlockNo -> BlockNo -> Bool) -> Eq BlockNo
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: BlockNo -> BlockNo -> Bool
== :: BlockNo -> BlockNo -> Bool
$c/= :: BlockNo -> BlockNo -> Bool
/= :: BlockNo -> BlockNo -> Bool
Eq, Eq BlockNo
Eq BlockNo =>
(BlockNo -> BlockNo -> Ordering)
-> (BlockNo -> BlockNo -> Bool)
-> (BlockNo -> BlockNo -> Bool)
-> (BlockNo -> BlockNo -> Bool)
-> (BlockNo -> BlockNo -> Bool)
-> (BlockNo -> BlockNo -> BlockNo)
-> (BlockNo -> BlockNo -> BlockNo)
-> Ord BlockNo
BlockNo -> BlockNo -> Bool
BlockNo -> BlockNo -> Ordering
BlockNo -> BlockNo -> BlockNo
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 :: BlockNo -> BlockNo -> Ordering
compare :: BlockNo -> BlockNo -> Ordering
$c< :: BlockNo -> BlockNo -> Bool
< :: BlockNo -> BlockNo -> Bool
$c<= :: BlockNo -> BlockNo -> Bool
<= :: BlockNo -> BlockNo -> Bool
$c> :: BlockNo -> BlockNo -> Bool
> :: BlockNo -> BlockNo -> Bool
$c>= :: BlockNo -> BlockNo -> Bool
>= :: BlockNo -> BlockNo -> Bool
$cmax :: BlockNo -> BlockNo -> BlockNo
max :: BlockNo -> BlockNo -> BlockNo
$cmin :: BlockNo -> BlockNo -> BlockNo
min :: BlockNo -> BlockNo -> BlockNo
Ord, (forall x. BlockNo -> Rep BlockNo x)
-> (forall x. Rep BlockNo x -> BlockNo) -> Generic BlockNo
forall x. Rep BlockNo x -> BlockNo
forall x. BlockNo -> Rep BlockNo x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. BlockNo -> Rep BlockNo x
from :: forall x. BlockNo -> Rep BlockNo x
$cto :: forall x. Rep BlockNo x -> BlockNo
to :: forall x. Rep BlockNo x -> BlockNo
Generic)
  deriving (Int -> BlockNo -> ShowS
[BlockNo] -> ShowS
BlockNo -> String
(Int -> BlockNo -> ShowS)
-> (BlockNo -> String) -> ([BlockNo] -> ShowS) -> Show BlockNo
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> BlockNo -> ShowS
showsPrec :: Int -> BlockNo -> ShowS
$cshow :: BlockNo -> String
show :: BlockNo -> String
$cshowList :: [BlockNo] -> ShowS
showList :: [BlockNo] -> ShowS
Show) via Quiet BlockNo
  deriving newtype (Int -> BlockNo
BlockNo -> Int
BlockNo -> [BlockNo]
BlockNo -> BlockNo
BlockNo -> BlockNo -> [BlockNo]
BlockNo -> BlockNo -> BlockNo -> [BlockNo]
(BlockNo -> BlockNo)
-> (BlockNo -> BlockNo)
-> (Int -> BlockNo)
-> (BlockNo -> Int)
-> (BlockNo -> [BlockNo])
-> (BlockNo -> BlockNo -> [BlockNo])
-> (BlockNo -> BlockNo -> [BlockNo])
-> (BlockNo -> BlockNo -> BlockNo -> [BlockNo])
-> Enum BlockNo
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 :: BlockNo -> BlockNo
succ :: BlockNo -> BlockNo
$cpred :: BlockNo -> BlockNo
pred :: BlockNo -> BlockNo
$ctoEnum :: Int -> BlockNo
toEnum :: Int -> BlockNo
$cfromEnum :: BlockNo -> Int
fromEnum :: BlockNo -> Int
$cenumFrom :: BlockNo -> [BlockNo]
enumFrom :: BlockNo -> [BlockNo]
$cenumFromThen :: BlockNo -> BlockNo -> [BlockNo]
enumFromThen :: BlockNo -> BlockNo -> [BlockNo]
$cenumFromTo :: BlockNo -> BlockNo -> [BlockNo]
enumFromTo :: BlockNo -> BlockNo -> [BlockNo]
$cenumFromThenTo :: BlockNo -> BlockNo -> BlockNo -> [BlockNo]
enumFromThenTo :: BlockNo -> BlockNo -> BlockNo -> [BlockNo]
Enum, BlockNo
BlockNo -> BlockNo -> Bounded BlockNo
forall a. a -> a -> Bounded a
$cminBound :: BlockNo
minBound :: BlockNo
$cmaxBound :: BlockNo
maxBound :: BlockNo
Bounded, Integer -> BlockNo
BlockNo -> BlockNo
BlockNo -> BlockNo -> BlockNo
(BlockNo -> BlockNo -> BlockNo)
-> (BlockNo -> BlockNo -> BlockNo)
-> (BlockNo -> BlockNo -> BlockNo)
-> (BlockNo -> BlockNo)
-> (BlockNo -> BlockNo)
-> (BlockNo -> BlockNo)
-> (Integer -> BlockNo)
-> Num BlockNo
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: BlockNo -> BlockNo -> BlockNo
+ :: BlockNo -> BlockNo -> BlockNo
$c- :: BlockNo -> BlockNo -> BlockNo
- :: BlockNo -> BlockNo -> BlockNo
$c* :: BlockNo -> BlockNo -> BlockNo
* :: BlockNo -> BlockNo -> BlockNo
$cnegate :: BlockNo -> BlockNo
negate :: BlockNo -> BlockNo
$cabs :: BlockNo -> BlockNo
abs :: BlockNo -> BlockNo
$csignum :: BlockNo -> BlockNo
signum :: BlockNo -> BlockNo
$cfromInteger :: Integer -> BlockNo
fromInteger :: Integer -> BlockNo
Num, [BlockNo] -> Encoding
BlockNo -> Encoding
(BlockNo -> Encoding)
-> (forall s. Decoder s BlockNo)
-> ([BlockNo] -> Encoding)
-> (forall s. Decoder s [BlockNo])
-> Serialise BlockNo
forall s. Decoder s [BlockNo]
forall s. Decoder s BlockNo
forall a.
(a -> Encoding)
-> (forall s. Decoder s a)
-> ([a] -> Encoding)
-> (forall s. Decoder s [a])
-> Serialise a
$cencode :: BlockNo -> Encoding
encode :: BlockNo -> Encoding
$cdecode :: forall s. Decoder s BlockNo
decode :: forall s. Decoder s BlockNo
$cencodeList :: [BlockNo] -> Encoding
encodeList :: [BlockNo] -> Encoding
$cdecodeList :: forall s. Decoder s [BlockNo]
decodeList :: forall s. Decoder s [BlockNo]
Serialise, Context -> BlockNo -> IO (Maybe ThunkInfo)
Proxy BlockNo -> String
(Context -> BlockNo -> IO (Maybe ThunkInfo))
-> (Context -> BlockNo -> IO (Maybe ThunkInfo))
-> (Proxy BlockNo -> String)
-> NoThunks BlockNo
forall a.
(Context -> a -> IO (Maybe ThunkInfo))
-> (Context -> a -> IO (Maybe ThunkInfo))
-> (Proxy a -> String)
-> NoThunks a
$cnoThunks :: Context -> BlockNo -> IO (Maybe ThunkInfo)
noThunks :: Context -> BlockNo -> IO (Maybe ThunkInfo)
$cwNoThunks :: Context -> BlockNo -> IO (Maybe ThunkInfo)
wNoThunks :: Context -> BlockNo -> IO (Maybe ThunkInfo)
$cshowTypeOf :: Proxy BlockNo -> String
showTypeOf :: Proxy BlockNo -> String
NoThunks, BlockNo -> ()
(BlockNo -> ()) -> NFData BlockNo
forall a. (a -> ()) -> NFData a
$crnf :: BlockNo -> ()
rnf :: BlockNo -> ()
NFData, [BlockNo] -> Value
[BlockNo] -> Encoding
BlockNo -> Bool
BlockNo -> Value
BlockNo -> Encoding
(BlockNo -> Value)
-> (BlockNo -> Encoding)
-> ([BlockNo] -> Value)
-> ([BlockNo] -> Encoding)
-> (BlockNo -> Bool)
-> ToJSON BlockNo
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: BlockNo -> Value
toJSON :: BlockNo -> Value
$ctoEncoding :: BlockNo -> Encoding
toEncoding :: BlockNo -> Encoding
$ctoJSONList :: [BlockNo] -> Value
toJSONList :: [BlockNo] -> Value
$ctoEncodingList :: [BlockNo] -> Encoding
toEncodingList :: [BlockNo] -> Encoding
$comitField :: BlockNo -> Bool
omitField :: BlockNo -> Bool
ToJSON, Maybe BlockNo
Value -> Parser [BlockNo]
Value -> Parser BlockNo
(Value -> Parser BlockNo)
-> (Value -> Parser [BlockNo]) -> Maybe BlockNo -> FromJSON BlockNo
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser BlockNo
parseJSON :: Value -> Parser BlockNo
$cparseJSONList :: Value -> Parser [BlockNo]
parseJSONList :: Value -> Parser [BlockNo]
$comittedField :: Maybe BlockNo
omittedField :: Maybe BlockNo
FromJSON)

instance ToCBOR BlockNo where
  toCBOR :: BlockNo -> Encoding
toCBOR = BlockNo -> Encoding
forall a. Serialise a => a -> Encoding
encode
  encodedSizeExpr :: (forall t. ToCBOR t => Proxy t -> Size) -> Proxy BlockNo -> Size
encodedSizeExpr forall t. ToCBOR t => Proxy t -> Size
size = (forall t. ToCBOR t => Proxy t -> Size) -> Proxy Word64 -> Size
forall a.
ToCBOR a =>
(forall t. ToCBOR t => Proxy t -> Size) -> Proxy a -> Size
encodedSizeExpr Proxy t -> Size
forall t. ToCBOR t => Proxy t -> Size
size (Proxy Word64 -> Size)
-> (Proxy BlockNo -> Proxy Word64) -> Proxy BlockNo -> Size
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (BlockNo -> Word64) -> Proxy BlockNo -> Proxy Word64
forall a b. (a -> b) -> Proxy a -> Proxy b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap BlockNo -> Word64
unBlockNo

instance FromCBOR BlockNo where
  fromCBOR :: forall s. Decoder s BlockNo
fromCBOR = Decoder s BlockNo
forall s. Decoder s BlockNo
forall a s. Serialise a => Decoder s a
decode