module Language.Hakaru.Types where
import Data.Dynamic
import Control.Monad.Primitive
import qualified System.Random.MWC as MWC
type PRNG m = MWC.Gen (PrimState m)
data Density a = Lebesgue !a | Discrete !a deriving Typeable
type Cond = Maybe Dynamic
fromDiscrete :: Density t -> t
fromDiscrete (Discrete a) = a
fromDiscrete _ = error "got a non-discrete sampler"
fromLebesgue :: Density t -> t
fromLebesgue (Lebesgue a) = a
fromLebesgue _ = error "got a discrete sampler"
fromDensity :: Density t -> t
fromDensity (Discrete a) = a
fromDensity (Lebesgue a) = a
type LogLikelihood = Double
data Dist a = Dist {logDensity :: Density a -> LogLikelihood,
distSample :: (PrimMonad m) => PRNG m -> m (Density a)}
deriving instance Typeable1 Dist