ouroboros-consensus-0.1.0.0: Consensus layer for the Ouroboros blockchain protocol
Safe HaskellNone
LanguageHaskell2010

Ouroboros.Consensus.HardFork.History.Qry

Synopsis

Documentation

data Qry :: Type -> Type Source #

Query

Qry adds a monadic interface on top of Expr. Although means that Qry itself is not showable, the PastHorizonException can nonetheless show the offending expression alongside the Summary against which it was evaluated.

Instances

Instances details
Monad Qry Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Qry

Methods

(>>=) :: Qry a -> (a -> Qry b) -> Qry b #

(>>) :: Qry a -> Qry b -> Qry b #

return :: a -> Qry a #

Functor Qry Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Qry

Methods

fmap :: (a -> b) -> Qry a -> Qry b #

(<$) :: a -> Qry b -> Qry a #

Applicative Qry Source # 
Instance details

Defined in Ouroboros.Consensus.HardFork.History.Qry

Methods

pure :: a -> Qry a #

(<*>) :: Qry (a -> b) -> Qry a -> Qry b #

liftA2 :: (a -> b -> c) -> Qry a -> Qry b -> Qry c #

(*>) :: Qry a -> Qry b -> Qry b #

(<*) :: Qry a -> Qry b -> Qry a #

data Expr (f :: Type -> Type) :: Type -> Type where Source #

Query expressions in PHOAS

Constructors

EVar :: f a -> Expr f a 
ELit :: Show a => a -> Expr f a 
ELet :: Expr f a -> (f a -> Expr f b) -> Expr f b 
EPair :: Expr f a -> Expr f b -> Expr f (a, b) 
EFst :: Expr f (a, b) -> Expr f a 
ESnd :: Expr f (a, b) -> Expr f b 
EAbsToRelTime :: Expr f RelativeTime -> Expr f TimeInEra 
EAbsToRelSlot :: Expr f SlotNo -> Expr f SlotInEra 
EAbsToRelEpoch :: Expr f EpochNo -> Expr f EpochInEra 
ERelToAbsTime :: Expr f TimeInEra -> Expr f RelativeTime 
ERelToAbsSlot :: Expr f (SlotInEra, TimeInSlot) -> Expr f SlotNo 
ERelToAbsEpoch :: Expr f (EpochInEra, SlotInEpoch) -> Expr f EpochNo 
ERelTimeToSlot :: Expr f TimeInEra -> Expr f (SlotInEra, TimeInSlot) 
ERelSlotToTime :: Expr f SlotInEra -> Expr f TimeInEra 
ERelSlotToEpoch :: Expr f SlotInEra -> Expr f (EpochInEra, SlotInEpoch) 
ERelEpochToSlot :: Expr f EpochInEra -> Expr f SlotInEra 
ESlotLength :: Expr f SlotNo -> Expr f SlotLength 
EEpochSize :: Expr f EpochNo -> Expr f EpochSize 

data PastHorizonException Source #

We tried to convert something that is past the horizon

That is, we tried to convert something that is past the point in time beyond which we lack information due to uncertainty about the next hard fork.

Constructors

PastHorizon 

Fields

qryFromExpr :: (forall f. Expr f a) -> Qry a Source #

Construct a Qry from a closed Expr

runQuery :: forall a xs. HasCallStack => Qry a -> Summary xs -> Either PastHorizonException a Source #

Run a query

Unlike an Expr, which is evaluated in a single era, a Qry is evaluated against all eras. Only if all Exprs embedded in the Qry can be evaluated in the same era (we don't want to mix properties of different eras in one query) do we return the result. If there is no era in which we can evaluate all Exprs in the Qry, we report a PastHorizonException.

NOTE: this means that queries about separate eras have to be run separately, they should not be composed into a single query. How could we know to which era which relative slot/time refers?

Interpreter

data Interpreter xs Source #

Can be sent across the LocalStateQuery protocol to interpret queries in the wallet.

The Summary should be considered internal.

Specific queries

wallclockToSlot :: RelativeTime -> Qry (SlotNo, NominalDiffTime, NominalDiffTime) Source #

Translate UTCTime to SlotNo

Additionally returns the time spent and time left in this slot.

slotToWallclock :: SlotNo -> Qry (RelativeTime, SlotLength) Source #

Translate SlotNo to the UTCTime at the start of that slot

Additionally returns the length of the slot.

slotToEpoch' :: SlotNo -> Qry (EpochNo, Word64) Source #

Convert SlotNo to EpochNo and the relative slot within the epoch

slotToEpoch :: SlotNo -> Qry (EpochNo, Word64, Word64) Source #

Translate SlotNo to its corresponding EpochNo

Additionally returns the relative slot within this epoch and how many slots are left in this slot.

epochToSlot :: EpochNo -> Qry (SlotNo, EpochSize) Source #

Translate EpochNo to the SlotNo of the first slot in that epoch

Additionally returns the size of the epoch.