{-# LANGUAGE ConstraintKinds  #-}
{-# LANGUAGE FlexibleContexts #-}

module Package.C.Monad ( PkgM
                       , MonadPkg
                       , runPkgM
                       ) where

import           Control.Monad.Reader
import           Control.Monad.State
import           Package.C.Db.Memory
import           Package.C.Db.Type
import           Package.C.Type.Verbosity

-- TODO: should this take a 'Maybe Platform' as well?
type PkgM = StateT InstallDb (ReaderT Verbosity IO)

type MonadPkg m = (MonadState InstallDb m, MonadReader Verbosity m, MonadIO m)

runPkgM :: Verbosity -> PkgM a -> IO a
runPkgM :: forall a. Verbosity -> PkgM a -> IO a
runPkgM Verbosity
v PkgM a
act = do
    InstallDb
pSet <- IO InstallDb
forall (m :: * -> *). MonadIO m => m InstallDb
strictIndex
    (ReaderT Verbosity IO a -> Verbosity -> IO a)
-> Verbosity -> ReaderT Verbosity IO a -> IO a
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT Verbosity IO a -> Verbosity -> IO a
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT Verbosity
v (ReaderT Verbosity IO a -> IO a) -> ReaderT Verbosity IO a -> IO a
forall a b. (a -> b) -> a -> b
$ PkgM a -> InstallDb -> ReaderT Verbosity IO a
forall (m :: * -> *) s a. Monad m => StateT s m a -> s -> m a
evalStateT PkgM a
act InstallDb
pSet