{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, UndecidableInstances #-}


{- |
Module      :  Control.Monad.ReaderX.Class
Copyright   :  (c) Mark Snyder 2008.
License     :  BSD-style
Maintainer  :  Mark Snyder, marks@ittc.ku.edu
Stability   :  experimental
Portability :  non-portable (multi-param classes, functional dependencies)
-}

module Control.Monad.ReaderX.Class (
    MonadReaderX(..),
    asksx
    ) where

import Control.Monad.Index

class (Monad m, Index ix) => MonadReaderX ix r m | ix m -> r where
    askx   :: ix -> m r
    localx :: ix -> (r -> r) -> m a -> m a

asksx :: (MonadReaderX ix r m) => ix -> (r -> a) -> m a
asksx ixv f =  do
    r <- askx ixv
    return  (f r)