module Web.Apiary.Database.Redis
    ( 
      RedisConn
    , initRedis
    
    , redis
    ) where
import Control.Monad.IO.Class(MonadIO(..))
import qualified Database.Redis as Redis
import Data.Proxy(Proxy(..))
import Data.Apiary.Extension
    (Has, Initializer, initializer', Extension, MonadExts, getExt)
newtype RedisConn = RedisConn Redis.Connection
instance Extension RedisConn
initRedis :: (Monad m)
             => Redis.Connection -> Initializer m exts (RedisConn ': exts)
initRedis conn = initializer' $ return (RedisConn conn)
redis :: (MonadExts es m, Has RedisConn es, MonadIO m) => Redis.Redis a -> m a
redis r = do
    getExt (Proxy :: Proxy RedisConn) >>= \ (RedisConn c) ->
        liftIO $ Redis.runRedis c r