Copyright | (c) Galois Inc 2014-2019 |
---|---|
Maintainer | Joe Hendrix <jhendrix@galois.com> |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
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
- data NonceGenerator (m :: Type -> Type) (s :: Type)
- freshNonce :: forall m s k (tp :: k). NonceGenerator m s -> m (Nonce s tp)
- countNoncesGenerated :: NonceGenerator m s -> m Integer
- data Nonce (s :: Type) (tp :: k)
- indexValue :: Nonce s tp -> Word64
- newSTNonceGenerator :: ST t (Some (NonceGenerator (ST t)))
- newIONonceGenerator :: IO (Some (NonceGenerator IO))
- withIONonceGenerator :: (forall s. NonceGenerator IO s -> IO r) -> IO r
- withSTNonceGenerator :: (forall s. NonceGenerator (ST t) s -> ST t r) -> ST t r
- runSTNonceGenerator :: (forall s. NonceGenerator (ST s) s -> ST s a) -> a
- withGlobalSTNonceGenerator :: (forall t. NonceGenerator (ST t) t -> ST t r) -> r
- data GlobalNonceGenerator
- globalNonceGenerator :: NonceGenerator IO GlobalNonceGenerator
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
TestEquality (Nonce s :: k -> Type) Source # | |
Defined in Data.Parameterized.Nonce | |
HashableF (Nonce s :: k -> Type) Source # | |
ShowF (Nonce s :: k -> Type) Source # | |
OrdF (Nonce s :: k -> Type) Source # | |
Defined in Data.Parameterized.Nonce 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 # | |
Eq (Nonce s tp) Source # | |
Ord (Nonce s tp) Source # | |
Show (Nonce s tp) Source # | |
Hashable (Nonce s tp) Source # | |
Defined in Data.Parameterized.Nonce |
indexValue :: Nonce s tp -> Word64 Source #
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 #
withSTNonceGenerator :: (forall s. NonceGenerator (ST t) s -> ST t r) -> ST t r Source #
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.
data GlobalNonceGenerator Source #
globalNonceGenerator :: NonceGenerator IO GlobalNonceGenerator Source #
A nonce generator that uses a globally-defined counter.