{-# LANGUAGE ScopedTypeVariables #-}

module Cardano.Slotting.EpochInfo.Impl
  ( fixedSizeEpochInfo,
  )
where

import Cardano.Slotting.EpochInfo.API
import Cardano.Slotting.Slot (EpochNo (..), EpochSize (..), SlotNo (..))

fixedSizeEpochInfo :: Monad m => EpochSize -> EpochInfo m
fixedSizeEpochInfo :: EpochSize -> EpochInfo m
fixedSizeEpochInfo (EpochSize Word64
size) = EpochInfo :: forall (m :: * -> *).
(HasCallStack => EpochNo -> m EpochSize)
-> (HasCallStack => EpochNo -> m SlotNo)
-> (HasCallStack => SlotNo -> m EpochNo)
-> EpochInfo m
EpochInfo
  { epochInfoSize_ :: HasCallStack => EpochNo -> m EpochSize
epochInfoSize_ = \EpochNo
_ ->
      EpochSize -> m EpochSize
forall (m :: * -> *) a. Monad m => a -> m a
return (EpochSize -> m EpochSize) -> EpochSize -> m EpochSize
forall a b. (a -> b) -> a -> b
$ Word64 -> EpochSize
EpochSize Word64
size,
    epochInfoFirst_ :: HasCallStack => EpochNo -> m SlotNo
epochInfoFirst_ = \(EpochNo Word64
epochNo) ->
      SlotNo -> m SlotNo
forall (m :: * -> *) a. Monad m => a -> m a
return (SlotNo -> m SlotNo) -> SlotNo -> m SlotNo
forall a b. (a -> b) -> a -> b
$ Word64 -> SlotNo
SlotNo (Word64
epochNo Word64 -> Word64 -> Word64
forall a. Num a => a -> a -> a
* Word64
size),
    epochInfoEpoch_ :: HasCallStack => SlotNo -> m EpochNo
epochInfoEpoch_ = \(SlotNo Word64
slot) ->
      EpochNo -> m EpochNo
forall (m :: * -> *) a. Monad m => a -> m a
return (EpochNo -> m EpochNo) -> EpochNo -> m EpochNo
forall a b. (a -> b) -> a -> b
$ Word64 -> EpochNo
EpochNo (Word64
slot Word64 -> Word64 -> Word64
forall a. Integral a => a -> a -> a
`div` Word64
size)
  }