{-# Language FlexibleContexts #-}

module GitHUD.Types (
  OutputConfig(..)
  , buildOutputConfig
  , Prompt
  , TerminalState
  , ShellOutput
  , askShell
  , askRepoState
  , askConfig
  ) where

import Control.Monad.Reader (Reader, MonadReader, asks)
import Control.Monad.Writer (WriterT)

import GitHUD.Config.Types
import GitHUD.Git.Types
import GitHUD.Terminal.Types

data OutputConfig = OutputConfig {
  _shell :: Shell
  , _repoState :: GitRepoState
  , _config :: Config
}

buildOutputConfig :: Shell
                  -> GitRepoState
                  -> Config
                  -> OutputConfig
buildOutputConfig shell repoState config = OutputConfig {
  _shell = shell
  , _repoState = repoState
  , _config = config
}

askShell :: MonadReader OutputConfig m => m Shell
askShell = asks _shell

askRepoState :: MonadReader OutputConfig m => m GitRepoState
askRepoState = asks _repoState

askConfig :: MonadReader OutputConfig m => m Config
askConfig = asks _config

type Prompt = String

type TerminalState = Reader OutputConfig String

type ShellOutput = WriterT Prompt (Reader OutputConfig) ()