{-
 -      ``Data/Random/Source/Std''
 -}
{-# LANGUAGE
    MultiParamTypeClasses, FlexibleInstances
  #-}

module Data.Random.Source.Std where

import Data.Random.Source
import Data.Tagged

-- |A token representing the \"standard\" entropy source in a 'MonadRandom'
-- monad.  Its sole purpose is to make the following true (when the types check):
--
-- > sampleFrom StdRandom === sample
data StdRandom = StdRandom

instance MonadRandom m => RandomSource m StdRandom where
    {-SPECIALIZE instance MonadRandom m => RandomSource m StdRandom -}
    supportedPrimsFrom w = supportedPrims (mkWit w)
        where
            mkWit :: Tagged a b -> a
            mkWit = error "supportedPrims tried to evaluate its phantom parameter"
    getSupportedRandomPrimFrom   StdRandom = getSupportedRandomPrim
    
    getRandomPrimFrom StdRandom = getRandomPrim