module Dice where

import Probability (Dist, Probability, prod, uniform, (??))
import Monad (liftM2)


type Die = Int

die :: Dist Die
die = uniform [1..6]

twoDice :: Dist (Die,Die)
twoDice = prod die die

dice :: Int -> Dist [Die]
dice n = sequence $ replicate n die
-- dice = replicateM


twoSixes :: Probability
twoSixes = (==(6,6)) ?? liftM2 (,) die die

{- |
@sixes p n@ computes the probability of getting
p sixes (@>1@, @==2@, ...) when rolling n dice
-}
sixes :: (Int -> Bool) -> Int -> Probability
sixes p n = (p . length . filter (==6)) ?? dice n

droll :: Dist Die
droll =
   liftM2 (+) (uniform [0,1]) die

g3 :: Probability
g3 = (>3) ?? die

addTwo :: Dist Die
addTwo =
   liftM2 (+) die die