module Stochastic.Geometric (mkGeometric, Geometric) where

import Stochastic.Distribution
import Stochastic.Uniform
import Helpers

data Geometric = Geometric Double Uniform

mkGeometric :: Uniform -> Double -> Geometric
mkGeometric base p = Geometric p base

instance DiscreteDistribution Geometric where
  randIntIn (a, b) (Geometric p g0) = mapTuple
               (\u -> trunc $ invert u)
               (Geometric p)
               (randDouble g0)
    where
      invert u = ceiling $ (log u) / (log (1-p))
      trunc x
        | x > (b-a) = b
        | otherwise = a+x

toDbl = fromInteger . toInteger