{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}

{- |
Stability    : experimental
Portability  : non-portable (multi-parameter type classes, flexible instances)

The 'MonadMarkov' class. This class abstracts over monads
which can transition from state to state probabilistically.

-}

module Control.Monad.Markov.Class (
  MonadMarkov(..)
 )
where

import System.Random (RandomGen)
import Control.Monad.Trans.Random (RandT)
import Control.Monad.Trans.Class (MonadTrans(..))

-- | An interface to Markov process monads.
class Monad m => MonadMarkov s m where
  -- | given the current state and transition table,
  -- return a new state.
  nextState :: m s

instance (MonadMarkov s m, RandomGen g) => MonadMarkov s (RandT g m) where
  nextState = lift nextState