parameterized-utils-2.1.9.0: Classes and data structures for working with data-kind indexed types
Copyright(c) Galois Inc 2014-2019
MaintainerJoe Hendrix <jhendrix@galois.com>
Safe HaskellTrustworthy
LanguageHaskell2010

Data.Parameterized.Nonce

Description

This module provides a simple generator of new indexes in the ST monad. It is predictable and not intended for cryptographic purposes.

This module also provides a global nonce generator that will generate 2^64 nonces before repeating.

NOTE: The TestEquality and OrdF instances for the Nonce type simply compare the generated nonce values and then assert to the compiler (via unsafeCoerce) that the types ascribed to the nonces are equal if their values are equal.

Synopsis

NonceGenerator

data NonceGenerator (m :: Type -> Type) (s :: Type) Source #

Provides a monadic action for getting fresh typed names.

The first type parameter m is the monad used for generating names, and the second parameter s is used for the counter.

freshNonce :: forall m s k (tp :: k). NonceGenerator m s -> m (Nonce s tp) Source #

countNoncesGenerated :: NonceGenerator m s -> m Integer Source #

The number of nonces generated so far by this generator. Only really useful for profiling.

data Nonce (s :: Type) (tp :: k) Source #

An index generated by the counter.

Instances

Instances details
TestEquality (Nonce s :: k -> Type) Source # 
Instance details

Defined in Data.Parameterized.Nonce

Methods

testEquality :: forall (a :: k0) (b :: k0). Nonce s a -> Nonce s b -> Maybe (a :~: b) #

HashableF (Nonce s :: k -> Type) Source # 
Instance details

Defined in Data.Parameterized.Nonce

Methods

hashWithSaltF :: forall (tp :: k0). Int -> Nonce s tp -> Int Source #

hashF :: forall (tp :: k0). Nonce s tp -> Int Source #

OrdF (Nonce s :: k -> Type) Source # 
Instance details

Defined in Data.Parameterized.Nonce

Methods

compareF :: forall (x :: k0) (y :: k0). Nonce s x -> Nonce s y -> OrderingF x y Source #

leqF :: forall (x :: k0) (y :: k0). Nonce s x -> Nonce s y -> Bool Source #

ltF :: forall (x :: k0) (y :: k0). Nonce s x -> Nonce s y -> Bool Source #

geqF :: forall (x :: k0) (y :: k0). Nonce s x -> Nonce s y -> Bool Source #

gtF :: forall (x :: k0) (y :: k0). Nonce s x -> Nonce s y -> Bool Source #

ShowF (Nonce s :: k -> Type) Source # 
Instance details

Defined in Data.Parameterized.Nonce

Methods

withShow :: forall p q (tp :: k0) a. p (Nonce s) -> q tp -> (Show (Nonce s tp) => a) -> a Source #

showF :: forall (tp :: k0). Nonce s tp -> String Source #

showsPrecF :: forall (tp :: k0). Int -> Nonce s tp -> String -> String Source #

Show (Nonce s tp) Source # 
Instance details

Defined in Data.Parameterized.Nonce

Methods

showsPrec :: Int -> Nonce s tp -> ShowS #

show :: Nonce s tp -> String #

showList :: [Nonce s tp] -> ShowS #

Eq (Nonce s tp) Source # 
Instance details

Defined in Data.Parameterized.Nonce

Methods

(==) :: Nonce s tp -> Nonce s tp -> Bool #

(/=) :: Nonce s tp -> Nonce s tp -> Bool #

Ord (Nonce s tp) Source # 
Instance details

Defined in Data.Parameterized.Nonce

Methods

compare :: Nonce s tp -> Nonce s tp -> Ordering #

(<) :: Nonce s tp -> Nonce s tp -> Bool #

(<=) :: Nonce s tp -> Nonce s tp -> Bool #

(>) :: Nonce s tp -> Nonce s tp -> Bool #

(>=) :: Nonce s tp -> Nonce s tp -> Bool #

max :: Nonce s tp -> Nonce s tp -> Nonce s tp #

min :: Nonce s tp -> Nonce s tp -> Nonce s tp #

Hashable (Nonce s tp) Source # 
Instance details

Defined in Data.Parameterized.Nonce

Methods

hashWithSalt :: Int -> Nonce s tp -> Int #

hash :: Nonce s tp -> Int #

Accessing a nonce generator

newSTNonceGenerator :: ST t (Some (NonceGenerator (ST t))) Source #

Create a new nonce generator in the ST monad.

newIONonceGenerator :: IO (Some (NonceGenerator IO)) Source #

Create a new nonce generator in the IO monad.

withIONonceGenerator :: (forall s. NonceGenerator IO s -> IO r) -> IO r Source #

Run an IO computation with a new nonce generator in the IO monad.

withSTNonceGenerator :: (forall s. NonceGenerator (ST t) s -> ST t r) -> ST t r Source #

Run an ST computation with a new nonce generator in the ST monad.

runSTNonceGenerator :: (forall s. NonceGenerator (ST s) s -> ST s a) -> a Source #

This combines runST and newSTNonceGenerator to create a nonce generator that shares the same phantom type parameter as the ST monad.

This can be used to reduce the number of type parameters when we know a ST computation only needs a single NonceGenerator.

Global nonce generator

withGlobalSTNonceGenerator :: (forall t. NonceGenerator (ST t) t -> ST t r) -> r Source #

Create a new counter.

globalNonceGenerator :: NonceGenerator IO GlobalNonceGenerator Source #

A nonce generator that uses a globally-defined counter.