type-level-prng-0.1.0: src/Data/TypeLevel/PRNG/Common.hs
module Data.TypeLevel.PRNG.Common
( type PRNG, type SimplePRNG, type FromSimplePRNG
) where
import GHC.TypeNats ( type Natural )
import DeFun.Core ( type App, type (@@), type (~>) )
-- | A PRNG takes some state, and returns a new state and some random data.
--
-- The characteristics of the 'Natural' data returned are dependent on the PRNG.
type PRNG state = state ~> (state, Natural)
-- | A simple PRNG where the state is the previous output.
type SimplePRNG = Natural ~> Natural
-- | Turn a simple PRNG into a regular one.
type FromSimplePRNG :: SimplePRNG -> PRNG Natural
data FromSimplePRNG prng n
type instance App (FromSimplePRNG prng) n = Dup (prng @@ n)
-- @(prng @@ n, prng @@ n)@ probably re-does the computation, so.
type Dup :: a -> (a, a)
type Dup a = '(a, a)