module Stochastic.Exponential(Exponential, mkExp) where

import Stochastic.Distribution
import Stochastic.Uniform
import Data.Word
import Data.ReinterpretCast
import Helpers

data Exponential = Exponential Double Uniform

viaWord :: Double -> Int
viaWord w =  fromInteger $ toInteger $ doubleToWord w

mkExp :: Uniform -> Double -> Exponential
mkExp base y = Exponential y base

instance ContinuousDistribution Exponential where
  randDouble (Exponential y u) =
    mapTuple (\x -> (-1.0/y) * (log $ x)) (Exponential y) (randDouble u)