-- | A module with functions for querying the probabilities of various outcomes.
module Numeric.Probability.Game.Query (chancePred, chanceRel, chanceTrue) where

import Control.Applicative ((<$>), liftA2)
import Data.Maybe (fromMaybe)

import Numeric.Probability.Game.Event (EventM, outcomes)

-- | Gets the probability that the outcome will satisfy the given predicate.  For
-- example:
--
-- > chancePred (<= 2) d6 == 1/3   -- The chance of getting 2 or less on a d6
-- > chancePred even d6 == 1/2     -- The chance of rolling an event number on a d6
chancePred :: (a -> Bool) -> EventM a -> Rational
chancePred f e = fromMaybe 0 $ lookup True (outcomes (f <$> e))

-- | Gets the probability that the given relation will hold between the two events.
--  For example:
--
-- > chanceRel (==) d6 d6 == 1/6   -- The chance of rolling doubles on d6
-- > chanceRel (>) (2*d6) d12      -- The chance of beating a d12 with two d6
chanceRel :: (a -> a -> Bool) -> EventM a -> EventM a -> Rational
chanceRel f a b = chanceTrue (liftA2 f a b)

-- | Gets the probability that the given boolean-outcome event will give a True
-- outcome.  For example:
--
-- > chanceTrue coinToss == 1/2
-- > chanceTrue ((== 3) <$> d6) == 1/6
--
-- (For the latter example, 'chancePred' is more concise.)
chanceTrue :: EventM Bool -> Rational
chanceTrue = chancePred id