{-
 -      ``Data/Random/Distribution/Exponential''
 -}
{-# LANGUAGE
    MultiParamTypeClasses,
    FlexibleInstances, FlexibleContexts,
    UndecidableInstances
  #-}

module Data.Random.Distribution.Exponential where

import Data.Random.Source
import Data.Random.RVar
import Data.Random.Distribution
import Data.Random.Distribution.Uniform

data Exponential a = Exp a

realFloatExponential :: RealFloat a => a -> RVar a
realFloatExponential lambdaRecip = do
    x <- realFloatStdUniform
    return (negate (log x) * lambdaRecip)

exponential :: Distribution Exponential a => a -> RVar a
exponential = sample . Exp

instance (RealFloat a) => Distribution Exponential a where
    rvar (Exp lambdaRecip) = realFloatExponential lambdaRecip