{-# LANGUAGE TypeSynonymInstances, TypeSynonymInstances, TypeFamilies, FlexibleInstances, GeneralizedNewtypeDeriving, UndecidableInstances, TemplateHaskell, MultiParamTypeClasses, BangPatterns, StandaloneDeriving #-}
module NLP.Probability.Chain (simpleObserve,
                              JointModel (..)
        --                      M2(..), M3(..), M4(..), M5(..), M7(..), HolderPretty, holderPretty, hPretty
                             ) where 
import NLP.Probability.ConditionalDistribution
import NLP.Probability.Distribution 
import NLP.Probability.Observation
import qualified Data.Map as M



class JointModel a where 
    data FullEvent a
    data FullContext a
    data Probs a
    data Observation a
    data Pairs a 
    chainRule :: FullEvent a -> FullContext a -> Pairs a
    observe :: Pairs a -> Observation a
    prob :: Probs a -> Pairs a -> Prob
    estimate :: Observation a -> Probs a

class Estimate a where 
    type Dist a 

instance Event String where type EventMap String = M.Map
instance Event Int where type EventMap Int = M.Map

simpleObserve a b = observe $ chainRule a b