{-# LANGUAGE TypeFamilies, KindSignatures, ConstraintKinds #-}

module BayesStack.Core.Types ( Probability
                             , HasLikelihood(..)
                             , FullConditionable(..)
                             ) where

import GHC.Prim (Constraint)
import Data.Number.LogFloat

type Probability = LogFloat

class HasLikelihood p where
  type LContext p a :: Constraint
  type LContext p a = ()
  likelihood :: LContext p a => p a -> Probability
  prob :: LContext p a => p a -> a -> Probability
 
-- | A distribution for which a full conditional factor can be produced
class FullConditionable p where
  type FCContext p a :: Constraint
  type FCContext p a = () 
  sampleProb :: FCContext p a => p a -> a -> Double