random-source-0.3: src/Data/Random/Internal/Prim.hs
{-# LANGUAGE GADTs, RankNTypes, DeriveDataTypeable #-}
-- |This is an internal interface to support the 'RVar' abstraction. It
-- reifies the operations provided by both MonadRandom and RandomSource in a
-- uniform and efficient way, as functions of type @Prim a -> m a@.
module Data.Random.Internal.Prim (Prim(..)) where
import Data.Word
import Data.Typeable
-- |A 'Prompt' GADT describing a request for a primitive random variate.
-- Random variable definitions will request their entropy via these prompts,
-- and entropy sources will satisfy those requests. The functions in
-- "Data.Random.Internal.TH" extend incomplete entropy-source definitions
-- to complete ones, essentially defining a very flexible
-- implementation-defaulting system.
--
-- Some possible future additions:
-- PrimFloat :: Prim Float
-- PrimInt :: Prim Int
-- PrimPair :: Prim a -> Prim b -> Prim (a :*: b)
-- PrimNormal :: Prim Double
-- PrimChoice :: [(Double :*: a)] -> Prim a
-- PrimBytes :: !Int -> Prim ByteString
--
-- Unfortunately, I cannot get Haddock to accept my comments about the
-- data constructors, but hopefully they should be reasonably self-explanatory.
data Prim a where
-- An unsigned byte, uniformly distributed from 0 to 0xff
PrimWord8 :: Prim Word8
-- An unsigned 16-bit word, uniformly distributed from 0 to 0xffff
PrimWord16 :: Prim Word16
-- An unsigned 32-bit word, uniformly distributed from 0 to 0xffffffff
PrimWord32 :: Prim Word32
-- An unsigned 64-bit word, uniformly distributed from 0 to 0xffffffffffffffff
PrimWord64 :: Prim Word64
-- A double-precision float U, uniformly distributed 0 <= U < 1
PrimDouble :: Prim Double
-- A uniformly distributed 'Integer' 0 <= U < 256^n
PrimNByteInteger :: !Int -> Prim Integer
deriving (Typeable)
instance Show (Prim a) where
showsPrec _p PrimWord8 = showString "PrimWord8"
showsPrec _p PrimWord16 = showString "PrimWord16"
showsPrec _p PrimWord32 = showString "PrimWord32"
showsPrec _p PrimWord64 = showString "PrimWord64"
showsPrec _p PrimDouble = showString "PrimDouble"
showsPrec p (PrimNByteInteger n) = showParen (p > 10) (showString "PrimNByteInteger " . showsPrec 11 n)