{-# LANGUAGE CPP               #-}
{-# LANGUAGE QuasiQuotes       #-}
{-# LANGUAGE TypeApplications  #-}
{-# LANGUAGE DataKinds         #-}
{-# LANGUAGE RankNTypes        #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE TypeFamilies      #-}
{-# LANGUAGE ViewPatterns      #-}
module GHCup.OptParse.Run where


import           GHCup
import           GHCup.Utils
import           GHCup.Utils.Parsers (fromVersion, ghcVersionTagEither, isolateParser, toolVersionTagEither)
import           GHCup.OptParse.Common
import           GHCup.Errors
import           GHCup.Types
import           GHCup.Types.Optics
import           GHCup.Prelude
import           GHCup.Prelude.File
#ifdef IS_WINDOWS
import           GHCup.Prelude.Process
import           GHCup.Prelude.Process.Windows ( execNoMinGW, resolveExecutable )
#endif
import           GHCup.Prelude.Logger
import           GHCup.Prelude.String.QQ

import           Control.Exception.Safe         ( MonadMask, MonadCatch )
#if !MIN_VERSION_base(4,13,0)
import           Control.Monad.Fail             ( MonadFail )
#endif
import           Control.Monad (when, forM_, forM, unless)
import           Control.Monad.Reader
import           Control.Monad.Trans.Resource
import           Data.Functor
import           Data.Maybe (isNothing, fromMaybe)
import           Data.List                      ( intercalate )
import           Data.Variant.Excepts
import           Options.Applicative     hiding ( style )
import           Prelude                 hiding ( appendFile )
import           System.FilePath
import           System.Environment
import           System.Exit

import qualified Data.Map.Strict               as Map
import qualified Data.Text                     as T
#ifndef IS_WINDOWS
import qualified System.Posix.Process          as SPP
#endif
import Data.Versions ( prettyVer, Version )





    ---------------
    --[ Options ]--
    ---------------


data RunOptions = RunOptions
  { RunOptions -> Bool
runAppendPATH :: Bool
  , RunOptions -> Bool
runInstTool'  :: Bool
  , RunOptions -> Bool
runMinGWPath  :: Bool
  , RunOptions -> Maybe ToolVersion
runGHCVer     :: Maybe ToolVersion
  , RunOptions -> Maybe ToolVersion
runCabalVer   :: Maybe ToolVersion
  , RunOptions -> Maybe ToolVersion
runHLSVer     :: Maybe ToolVersion
  , RunOptions -> Maybe ToolVersion
runStackVer   :: Maybe ToolVersion
  , RunOptions -> Maybe String
runBinDir     :: Maybe FilePath
  , RunOptions -> Bool
runQuick      :: Bool
  , RunOptions -> [String]
runCOMMAND    :: [String]
  } deriving (RunOptions -> RunOptions -> Bool
(RunOptions -> RunOptions -> Bool)
-> (RunOptions -> RunOptions -> Bool) -> Eq RunOptions
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RunOptions -> RunOptions -> Bool
== :: RunOptions -> RunOptions -> Bool
$c/= :: RunOptions -> RunOptions -> Bool
/= :: RunOptions -> RunOptions -> Bool
Eq, Int -> RunOptions -> ShowS
[RunOptions] -> ShowS
RunOptions -> String
(Int -> RunOptions -> ShowS)
-> (RunOptions -> String)
-> ([RunOptions] -> ShowS)
-> Show RunOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RunOptions -> ShowS
showsPrec :: Int -> RunOptions -> ShowS
$cshow :: RunOptions -> String
show :: RunOptions -> String
$cshowList :: [RunOptions] -> ShowS
showList :: [RunOptions] -> ShowS
Show)



    ---------------
    --[ Parsers ]--
    ---------------



runOpts :: Parser RunOptions
runOpts :: Parser RunOptions
runOpts =
  Bool
-> Bool
-> Bool
-> Maybe ToolVersion
-> Maybe ToolVersion
-> Maybe ToolVersion
-> Maybe ToolVersion
-> Maybe String
-> Bool
-> [String]
-> RunOptions
RunOptions
    (Bool
 -> Bool
 -> Bool
 -> Maybe ToolVersion
 -> Maybe ToolVersion
 -> Maybe ToolVersion
 -> Maybe ToolVersion
 -> Maybe String
 -> Bool
 -> [String]
 -> RunOptions)
-> Parser Bool
-> Parser
     (Bool
      -> Bool
      -> Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe String
      -> Bool
      -> [String]
      -> RunOptions)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Mod FlagFields Bool -> Parser Bool
switch
          (Char -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'a' Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"append" Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help String
"Append bin/ dir to PATH instead of prepending (this means that e.g. a system installation may take precedence)")
    Parser
  (Bool
   -> Bool
   -> Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe String
   -> Bool
   -> [String]
   -> RunOptions)
-> Parser Bool
-> Parser
     (Bool
      -> Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe String
      -> Bool
      -> [String]
      -> RunOptions)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
          (Char -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'i' Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"install" Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help String
"Install the tool, if missing")
    Parser
  (Bool
   -> Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe String
   -> Bool
   -> [String]
   -> RunOptions)
-> Parser Bool
-> Parser
     (Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe String
      -> Bool
      -> [String]
      -> RunOptions)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
          (Char -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'm' Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"mingw-path" Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help String
"On windows, add mingw64 PATHs to environment (does nothing on unix)")
    Parser
  (Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe String
   -> Bool
   -> [String]
   -> RunOptions)
-> Parser (Maybe ToolVersion)
-> Parser
     (Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe String
      -> Bool
      -> [String]
      -> RunOptions)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser ToolVersion -> Parser (Maybe ToolVersion)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional
          (ReadM ToolVersion
-> Mod OptionFields ToolVersion -> Parser ToolVersion
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
            ((String -> Either String ToolVersion) -> ReadM ToolVersion
forall a. (String -> Either String a) -> ReadM a
eitherReader String -> Either String ToolVersion
ghcVersionTagEither)
            (String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"GHC_VERSION" Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"ghc" Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. String -> Mod f a
help String
"The ghc version"
            Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> Completer -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (Tool -> [String] -> Completer
tagCompleter Tool
GHC [])
            Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> (Completer -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (Completer -> Mod OptionFields ToolVersion)
-> Completer -> Mod OptionFields ToolVersion
forall a b. (a -> b) -> a -> b
$ [ListCriteria] -> Tool -> Completer
versionCompleter [] Tool
GHC)
            )
          )
    Parser
  (Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe String
   -> Bool
   -> [String]
   -> RunOptions)
-> Parser (Maybe ToolVersion)
-> Parser
     (Maybe ToolVersion
      -> Maybe ToolVersion
      -> Maybe String
      -> Bool
      -> [String]
      -> RunOptions)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser ToolVersion -> Parser (Maybe ToolVersion)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional
          (ReadM ToolVersion
-> Mod OptionFields ToolVersion -> Parser ToolVersion
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
            ((String -> Either String ToolVersion) -> ReadM ToolVersion
forall a. (String -> Either String a) -> ReadM a
eitherReader String -> Either String ToolVersion
toolVersionTagEither)
            (String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"CABAL_VERSION" Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"cabal" Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. String -> Mod f a
help String
"The cabal version"
            Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> Completer -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (Tool -> [String] -> Completer
tagCompleter Tool
Cabal [])
            Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> (Completer -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (Completer -> Mod OptionFields ToolVersion)
-> Completer -> Mod OptionFields ToolVersion
forall a b. (a -> b) -> a -> b
$ [ListCriteria] -> Tool -> Completer
versionCompleter [] Tool
Cabal)
            )
          )
    Parser
  (Maybe ToolVersion
   -> Maybe ToolVersion
   -> Maybe String
   -> Bool
   -> [String]
   -> RunOptions)
-> Parser (Maybe ToolVersion)
-> Parser
     (Maybe ToolVersion
      -> Maybe String -> Bool -> [String] -> RunOptions)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser ToolVersion -> Parser (Maybe ToolVersion)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional
          (ReadM ToolVersion
-> Mod OptionFields ToolVersion -> Parser ToolVersion
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
            ((String -> Either String ToolVersion) -> ReadM ToolVersion
forall a. (String -> Either String a) -> ReadM a
eitherReader String -> Either String ToolVersion
toolVersionTagEither)
            (String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"HLS_VERSION" Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"hls" Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. String -> Mod f a
help String
"The HLS version"
            Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> Completer -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (Tool -> [String] -> Completer
tagCompleter Tool
HLS [])
            Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> (Completer -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (Completer -> Mod OptionFields ToolVersion)
-> Completer -> Mod OptionFields ToolVersion
forall a b. (a -> b) -> a -> b
$ [ListCriteria] -> Tool -> Completer
versionCompleter [] Tool
HLS)
            )
          )
    Parser
  (Maybe ToolVersion
   -> Maybe String -> Bool -> [String] -> RunOptions)
-> Parser (Maybe ToolVersion)
-> Parser (Maybe String -> Bool -> [String] -> RunOptions)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser ToolVersion -> Parser (Maybe ToolVersion)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional
          (ReadM ToolVersion
-> Mod OptionFields ToolVersion -> Parser ToolVersion
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
            ((String -> Either String ToolVersion) -> ReadM ToolVersion
forall a. (String -> Either String a) -> ReadM a
eitherReader String -> Either String ToolVersion
toolVersionTagEither)
            (String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"STACK_VERSION" Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"stack" Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. String -> Mod f a
help String
"The stack version"
            Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> Completer -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (Tool -> [String] -> Completer
tagCompleter Tool
Stack [])
            Mod OptionFields ToolVersion
-> Mod OptionFields ToolVersion -> Mod OptionFields ToolVersion
forall a. Semigroup a => a -> a -> a
<> (Completer -> Mod OptionFields ToolVersion
forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (Completer -> Mod OptionFields ToolVersion)
-> Completer -> Mod OptionFields ToolVersion
forall a b. (a -> b) -> a -> b
$ [ListCriteria] -> Tool -> Completer
versionCompleter [] Tool
Stack)
            )
          )
    Parser (Maybe String -> Bool -> [String] -> RunOptions)
-> Parser (Maybe String) -> Parser (Bool -> [String] -> RunOptions)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String -> Parser (Maybe String)
forall (f :: * -> *) a. Alternative f => f a -> f (Maybe a)
optional
          (ReadM String -> Mod OptionFields String -> Parser String
forall a. ReadM a -> Mod OptionFields a -> Parser a
option
           ((String -> Either String String) -> ReadM String
forall a. (String -> Either String a) -> ReadM a
eitherReader String -> Either String String
isolateParser)
           (  Char -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'b'
           Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"bindir"
           Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"DIR"
           Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod OptionFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"directory where to create the tool symlinks (default: newly created system temp dir)"
           Mod OptionFields String
-> Mod OptionFields String -> Mod OptionFields String
forall a. Semigroup a => a -> a -> a
<> Completer -> Mod OptionFields String
forall (f :: * -> *) a. HasCompleter f => Completer -> Mod f a
completer (String -> Completer
bashCompleter String
"directory")
           )
          )
    Parser (Bool -> [String] -> RunOptions)
-> Parser Bool -> Parser ([String] -> RunOptions)
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Mod FlagFields Bool -> Parser Bool
switch
          (Char -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => Char -> Mod f a
short Char
'q' Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. HasName f => String -> Mod f a
long String
"quick" Mod FlagFields Bool -> Mod FlagFields Bool -> Mod FlagFields Bool
forall a. Semigroup a => a -> a -> a
<> String -> Mod FlagFields Bool
forall (f :: * -> *) a. String -> Mod f a
help String
"Avoid any expensive work (such as downloads, version/tag resolution etc.). Disables --install.")
    Parser ([String] -> RunOptions)
-> Parser [String] -> Parser RunOptions
forall a b. Parser (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser String -> Parser [String]
forall a. Parser a -> Parser [a]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (ReadM String -> Mod ArgumentFields String -> Parser String
forall a. ReadM a -> Mod ArgumentFields a -> Parser a
argument ReadM String
forall s. IsString s => ReadM s
str (String -> Mod ArgumentFields String
forall (f :: * -> *) a. HasMetavar f => String -> Mod f a
metavar String
"COMMAND" Mod ArgumentFields String
-> Mod ArgumentFields String -> Mod ArgumentFields String
forall a. Semigroup a => a -> a -> a
<> String -> Mod ArgumentFields String
forall (f :: * -> *) a. String -> Mod f a
help String
"The command to run, with arguments (use longopts --). If omitted, just prints the created bin/ dir to stdout and exits."))




    --------------
    --[ Footer ]--
    --------------


runFooter :: String
runFooter :: String
runFooter = [s|Discussion:
  Adds the given tools to a dedicated bin/ directory and adds them to PATH, exposing
  the relevant binaries, then executes a command.

Examples:
  # run VSCode with all latest toolchain exposed, installing missing versions if necessary
  ghcup run --ghc latest --cabal latest --hls latest --stack latest --install -- code Setup.hs

  # create a custom toolchain bin/ dir with GHC and cabal that can be manually added to PATH
  ghcup run --ghc 8.10.7 --cabal 3.2.0.0 --bindir $HOME/toolchain/bin

  # run a specific ghc version
  ghcup run --ghc 8.10.7 -- ghc --version|]




    ---------------------------
    --[ Effect interpreters ]--
    ---------------------------


type RunEffects = '[ AlreadyInstalled
                   , UnknownArchive
                   , ArchiveResult
                   , FileDoesNotExistError
                   , CopyError
                   , NotInstalled
                   , DirNotEmpty
                   , NoDownload
                   , NotInstalled
                   , BuildFailed
                   , TagNotFound
                   , DayNotFound
                   , DigestError
                   , ContentLengthError
                   , GPGError
                   , DownloadFailed
                   , TarDirDoesNotExist
                   , NextVerNotFound
                   , NoToolVersionSet
                   , FileAlreadyExistsError
                   , ProcessError
                   , UninstallFailed
                   , MergeFileTreeError
                   , NoCompatiblePlatform
                   , GHCup.Errors.ParseError
                   , UnsupportedSetupCombo
                   , DistroNotFound
                   , NoCompatibleArch
                   , URIParseError
                   ]

runLeanRUN :: (MonadUnliftIO m, MonadIO m)
           => LeanAppState
           -> Excepts RunEffects (ReaderT LeanAppState m) a
           -> m (VEither RunEffects a)
runLeanRUN :: forall (m :: * -> *) a.
(MonadUnliftIO m, MonadIO m) =>
LeanAppState
-> Excepts RunEffects (ReaderT LeanAppState m) a
-> m (VEither RunEffects a)
runLeanRUN LeanAppState
leanAppstate =
    -- Don't use runLeanAppState here, which is disabled on windows.
    -- This is the only command on all platforms that doesn't need full appstate.
    (ReaderT LeanAppState m (VEither RunEffects a)
 -> LeanAppState -> m (VEither RunEffects a))
-> LeanAppState
-> ReaderT LeanAppState m (VEither RunEffects a)
-> m (VEither RunEffects a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT LeanAppState m (VEither RunEffects a)
-> LeanAppState -> m (VEither RunEffects a)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT LeanAppState
leanAppstate
    (ReaderT LeanAppState m (VEither RunEffects a)
 -> m (VEither RunEffects a))
-> (Excepts RunEffects (ReaderT LeanAppState m) a
    -> ReaderT LeanAppState m (VEither RunEffects a))
-> Excepts RunEffects (ReaderT LeanAppState m) a
-> m (VEither RunEffects a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (es :: [*]) a (m :: * -> *).
Excepts es m a -> m (VEither es a)
runE
      @RunEffects

runRUN :: MonadUnliftIO m
      => IO AppState
      -> Excepts RunEffects (ResourceT (ReaderT AppState m)) a
      -> m (VEither RunEffects a)
runRUN :: forall (m :: * -> *) a.
MonadUnliftIO m =>
IO AppState
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) a
-> m (VEither RunEffects a)
runRUN IO AppState
appState Excepts RunEffects (ResourceT (ReaderT AppState m)) a
action' = do
  AppState
s' <- IO AppState -> m AppState
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO AppState
appState
  (ReaderT AppState m (VEither RunEffects a)
 -> AppState -> m (VEither RunEffects a))
-> AppState
-> ReaderT AppState m (VEither RunEffects a)
-> m (VEither RunEffects a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT AppState m (VEither RunEffects a)
-> AppState -> m (VEither RunEffects a)
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT AppState
s'
    (ReaderT AppState m (VEither RunEffects a)
 -> m (VEither RunEffects a))
-> (Excepts RunEffects (ResourceT (ReaderT AppState m)) a
    -> ReaderT AppState m (VEither RunEffects a))
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) a
-> m (VEither RunEffects a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ResourceT (ReaderT AppState m) (VEither RunEffects a)
-> ReaderT AppState m (VEither RunEffects a)
forall (m :: * -> *) a. MonadUnliftIO m => ResourceT m a -> m a
runResourceT
    (ResourceT (ReaderT AppState m) (VEither RunEffects a)
 -> ReaderT AppState m (VEither RunEffects a))
-> (Excepts RunEffects (ResourceT (ReaderT AppState m)) a
    -> ResourceT (ReaderT AppState m) (VEither RunEffects a))
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) a
-> ReaderT AppState m (VEither RunEffects a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (es :: [*]) a (m :: * -> *).
Excepts es m a -> m (VEither es a)
runE
      @RunEffects
    (Excepts RunEffects (ResourceT (ReaderT AppState m)) a
 -> m (VEither RunEffects a))
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) a
-> m (VEither RunEffects a)
forall a b. (a -> b) -> a -> b
$ Excepts RunEffects (ResourceT (ReaderT AppState m)) a
action'



    ------------------
    --[ Entrypoint ]--
    ------------------



run :: forall m .
       ( MonadFail m
       , MonadMask m
       , MonadCatch m
       , MonadIO m
       , MonadUnliftIO m
       , Alternative m
       )
   => RunOptions
   -> Settings
   -> IO AppState
   -> LeanAppState
   -> (ReaderT LeanAppState m () -> m ())
   -> m ExitCode
run :: forall (m :: * -> *).
(MonadFail m, MonadMask m, MonadCatch m, MonadIO m,
 MonadUnliftIO m, Alternative m) =>
RunOptions
-> Settings
-> IO AppState
-> LeanAppState
-> (ReaderT LeanAppState m () -> m ())
-> m ExitCode
run RunOptions{Bool
[String]
Maybe String
Maybe ToolVersion
runAppendPATH :: RunOptions -> Bool
runInstTool' :: RunOptions -> Bool
runMinGWPath :: RunOptions -> Bool
runGHCVer :: RunOptions -> Maybe ToolVersion
runCabalVer :: RunOptions -> Maybe ToolVersion
runHLSVer :: RunOptions -> Maybe ToolVersion
runStackVer :: RunOptions -> Maybe ToolVersion
runBinDir :: RunOptions -> Maybe String
runQuick :: RunOptions -> Bool
runCOMMAND :: RunOptions -> [String]
runAppendPATH :: Bool
runInstTool' :: Bool
runMinGWPath :: Bool
runGHCVer :: Maybe ToolVersion
runCabalVer :: Maybe ToolVersion
runHLSVer :: Maybe ToolVersion
runStackVer :: Maybe ToolVersion
runBinDir :: Maybe String
runQuick :: Bool
runCOMMAND :: [String]
..} Settings
settings IO AppState
runAppState LeanAppState
leanAppstate ReaderT LeanAppState m () -> m ()
runLogger = do
   VEither RunEffects String
r <- if Bool -> Bool
not Bool
runQuick
        then IO AppState
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) String
-> m (VEither RunEffects String)
forall (m :: * -> *) a.
MonadUnliftIO m =>
IO AppState
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) a
-> m (VEither RunEffects a)
runRUN IO AppState
runAppState (Excepts RunEffects (ResourceT (ReaderT AppState m)) String
 -> m (VEither RunEffects String))
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) String
-> m (VEither RunEffects String)
forall a b. (a -> b) -> a -> b
$ do
         Toolchain
toolchain <- Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
  (ResourceT (ReaderT AppState m))
  Toolchain
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) Toolchain
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
  (ResourceT (ReaderT AppState m))
  Toolchain
(MonadFail m, MonadThrow m, MonadIO m, MonadCatch m) =>
Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
  (ResourceT (ReaderT AppState m))
  Toolchain
resolveToolchainFull

         -- oh dear
         AppState
r <- ResourceT (ReaderT AppState m) AppState
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) AppState
forall (m :: * -> *) a. Monad m => m a -> Excepts RunEffects m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ResourceT (ReaderT AppState m) AppState
forall r (m :: * -> *). MonadReader r m => m r
ask
         String
tmp <- ResourceT (ReaderT AppState m) String
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) String
forall (m :: * -> *) a. Monad m => m a -> Excepts RunEffects m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ResourceT (ReaderT AppState m) String
 -> Excepts RunEffects (ResourceT (ReaderT AppState m)) String)
-> (ReaderT LeanAppState m String
    -> ResourceT (ReaderT AppState m) String)
-> ReaderT LeanAppState m String
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReaderT AppState m String -> ResourceT (ReaderT AppState m) String
forall (m :: * -> *) a. Monad m => m a -> ResourceT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ReaderT AppState m String
 -> ResourceT (ReaderT AppState m) String)
-> (ReaderT LeanAppState m String -> ReaderT AppState m String)
-> ReaderT LeanAppState m String
-> ResourceT (ReaderT AppState m) String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m String -> ReaderT AppState m String
forall (m :: * -> *) a. Monad m => m a -> ReaderT AppState m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m String -> ReaderT AppState m String)
-> (ReaderT LeanAppState m String -> m String)
-> ReaderT LeanAppState m String
-> ReaderT AppState m String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ReaderT LeanAppState m String -> LeanAppState -> m String)
-> LeanAppState -> ReaderT LeanAppState m String -> m String
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT LeanAppState m String -> LeanAppState -> m String
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (AppState -> LeanAppState
fromAppState AppState
r) (ReaderT LeanAppState m String
 -> Excepts RunEffects (ResourceT (ReaderT AppState m)) String)
-> ReaderT LeanAppState m String
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) String
forall a b. (a -> b) -> a -> b
$ (MonadUnliftIO m, MonadCatch m, MonadThrow m, MonadMask m,
 MonadIO m) =>
Toolchain -> ReaderT LeanAppState m String
Toolchain -> ReaderT LeanAppState m String
createTmpDir Toolchain
toolchain

         Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
    UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
    NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
    ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
    FileAlreadyExistsError, CopyError, UninstallFailed,
    MergeFileTreeError, NoCompatiblePlatform, ParseError,
    UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
    URIParseError]
  (ResourceT (ReaderT AppState m))
  ()
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) ()
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts RunEffects (ResourceT (ReaderT AppState m)) ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) ()
forall a b. (a -> b) -> a -> b
$ (MonadFail m, MonadThrow m, MonadIO m, MonadCatch m,
 Alternative m) =>
Toolchain
-> String
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
Toolchain
-> String
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
installToolChainFull Toolchain
toolchain String
tmp
         String
-> Excepts RunEffects (ResourceT (ReaderT AppState m)) String
forall a.
a -> Excepts RunEffects (ResourceT (ReaderT AppState m)) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
tmp
        else LeanAppState
-> Excepts RunEffects (ReaderT LeanAppState m) String
-> m (VEither RunEffects String)
forall (m :: * -> *) a.
(MonadUnliftIO m, MonadIO m) =>
LeanAppState
-> Excepts RunEffects (ReaderT LeanAppState m) a
-> m (VEither RunEffects a)
runLeanRUN LeanAppState
leanAppstate (Excepts RunEffects (ReaderT LeanAppState m) String
 -> m (VEither RunEffects String))
-> Excepts RunEffects (ReaderT LeanAppState m) String
-> m (VEither RunEffects String)
forall a b. (a -> b) -> a -> b
$ do
         Toolchain
toolchain <- Excepts RunEffects (ReaderT LeanAppState m) Toolchain
resolveToolchain
         String
tmp <- ReaderT LeanAppState m String
-> Excepts RunEffects (ReaderT LeanAppState m) String
forall (m :: * -> *) a. Monad m => m a -> Excepts RunEffects m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ReaderT LeanAppState m String
 -> Excepts RunEffects (ReaderT LeanAppState m) String)
-> ReaderT LeanAppState m String
-> Excepts RunEffects (ReaderT LeanAppState m) String
forall a b. (a -> b) -> a -> b
$ (MonadUnliftIO m, MonadCatch m, MonadThrow m, MonadMask m,
 MonadIO m) =>
Toolchain -> ReaderT LeanAppState m String
Toolchain -> ReaderT LeanAppState m String
createTmpDir Toolchain
toolchain
         Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
-> Excepts RunEffects (ReaderT LeanAppState m) ()
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
 -> Excepts RunEffects (ReaderT LeanAppState m) ())
-> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
-> Excepts RunEffects (ReaderT LeanAppState m) ()
forall a b. (a -> b) -> a -> b
$ (MonadFail m, MonadThrow m, MonadIO m, MonadCatch m) =>
Toolchain
-> String -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
Toolchain
-> String -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
installToolChain Toolchain
toolchain String
tmp
         String -> Excepts RunEffects (ReaderT LeanAppState m) String
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure String
tmp
   case VEither RunEffects String
r of
         VRight String
tmp -> do
           case [String]
runCOMMAND of
             [] -> do
               IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
putStr String
tmp
               ExitCode -> m ExitCode
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ExitCode
ExitSuccess
             (String
cmd:[String]
args) -> do
               [(String, String)]
newEnv <- IO [(String, String)] -> m [(String, String)]
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO [(String, String)] -> m [(String, String)])
-> IO [(String, String)] -> m [(String, String)]
forall a b. (a -> b) -> a -> b
$ [String] -> Bool -> IO [(String, String)]
addToPath [String
tmp] Bool
runAppendPATH
               let pathVar :: String
pathVar = if Bool
isWindows then String
"Path" else String
"PATH"
               Maybe String -> (String -> m ()) -> m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ (String -> Map String String -> Maybe String
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup String
pathVar (Map String String -> Maybe String)
-> ([(String, String)] -> Map String String)
-> [(String, String)]
-> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(String, String)] -> Map String String
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(String, String)] -> Maybe String)
-> [(String, String)] -> Maybe String
forall a b. (a -> b) -> a -> b
$ [(String, String)]
newEnv) ((String -> m ()) -> m ()) -> (String -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (String -> IO ()) -> String -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String -> IO ()
setEnv String
pathVar
#ifndef IS_WINDOWS
               m Any -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m Any -> m ()) -> m Any -> m ()
forall a b. (a -> b) -> a -> b
$ IO Any -> m Any
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Any -> m Any) -> IO Any -> m Any
forall a b. (a -> b) -> a -> b
$ String -> Bool -> [String] -> Maybe [(String, String)] -> IO Any
forall a.
String -> Bool -> [String] -> Maybe [(String, String)] -> IO a
SPP.executeFile String
cmd Bool
True [String]
args ([(String, String)] -> Maybe [(String, String)]
forall a. a -> Maybe a
Just [(String, String)]
newEnv)
               ExitCode -> m ExitCode
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ExitCode
ExitSuccess
#else
               resolvedCmd <- fmap (fromMaybe cmd) $ liftIO $ resolveExecutable cmd runMinGWPath
               r' <- if runMinGWPath
                     then runLeanRUN leanAppstate $ liftE $ lEM @_ @'[ProcessError] $ exec resolvedCmd args Nothing (Just newEnv)
                     else runLeanRUN leanAppstate $ liftE $ lEM @_ @'[ProcessError] $ execNoMinGW resolvedCmd args Nothing (Just newEnv)
               case r' of
                 VRight _ -> pure ExitSuccess
                 VLeft e -> do
                   runLogger $ logError $ T.pack $ prettyHFError e
                   pure $ ExitFailure 28
#endif
         VLeft V RunEffects
e -> do
           ReaderT LeanAppState m () -> m ()
runLogger (ReaderT LeanAppState m () -> m ())
-> ReaderT LeanAppState m () -> m ()
forall a b. (a -> b) -> a -> b
$ Text -> ReaderT LeanAppState m ()
forall env (m :: * -> *).
(MonadReader env m,
 LabelOptic' "loggerConfig" A_Lens env LoggerConfig, MonadIO m) =>
Text -> m ()
logError (Text -> ReaderT LeanAppState m ())
-> Text -> ReaderT LeanAppState m ()
forall a b. (a -> b) -> a -> b
$ String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ V RunEffects -> String
forall e. (Pretty e, HFErrorProject e) => e -> String
prettyHFError V RunEffects
e
           ExitCode -> m ExitCode
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (ExitCode -> m ExitCode) -> ExitCode -> m ExitCode
forall a b. (a -> b) -> a -> b
$ Int -> ExitCode
ExitFailure Int
27

  where

   guessMode :: GuessMode
guessMode = if Settings -> Bool
guessVersion Settings
settings then GuessMode
GLaxWithInstalled else GuessMode
GStrict

   -- TODO: doesn't work for cross
   resolveToolchainFull :: ( MonadFail m
                           , MonadThrow m
                           , MonadIO m
                           , MonadCatch m
                           )
                        => Excepts
                             '[ TagNotFound
                              , DayNotFound
                              , NextVerNotFound
                              , NoToolVersionSet
                              ] (ResourceT (ReaderT AppState m)) Toolchain
   resolveToolchainFull :: (MonadFail m, MonadThrow m, MonadIO m, MonadCatch m) =>
Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
  (ResourceT (ReaderT AppState m))
  Toolchain
resolveToolchainFull = do
         Maybe GHCTargetVersion
ghcVer <- Maybe ToolVersion
-> (ToolVersion
    -> Excepts
         '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
         (ResourceT (ReaderT AppState m))
         GHCTargetVersion)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (Maybe GHCTargetVersion)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM Maybe ToolVersion
runGHCVer ((ToolVersion
  -> Excepts
       '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
       (ResourceT (ReaderT AppState m))
       GHCTargetVersion)
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
      (ResourceT (ReaderT AppState m))
      (Maybe GHCTargetVersion))
-> (ToolVersion
    -> Excepts
         '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
         (ResourceT (ReaderT AppState m))
         GHCTargetVersion)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (Maybe GHCTargetVersion)
forall a b. (a -> b) -> a -> b
$ \ToolVersion
ver -> do
           (GHCTargetVersion
v, Maybe VersionInfo
_) <- Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
  (ResourceT (ReaderT AppState m))
  (GHCTargetVersion, Maybe VersionInfo)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
   (ResourceT (ReaderT AppState m))
   (GHCTargetVersion, Maybe VersionInfo)
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
      (ResourceT (ReaderT AppState m))
      (GHCTargetVersion, Maybe VersionInfo))
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall a b. (a -> b) -> a -> b
$ Maybe ToolVersion
-> GuessMode
-> Tool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall env (m :: * -> *).
(HasLog env, MonadFail m, MonadReader env m, HasGHCupInfo env,
 HasDirs env, MonadThrow m, MonadIO m, MonadCatch m) =>
Maybe ToolVersion
-> GuessMode
-> Tool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     m
     (GHCTargetVersion, Maybe VersionInfo)
fromVersion (ToolVersion -> Maybe ToolVersion
forall a. a -> Maybe a
Just ToolVersion
ver) GuessMode
guessMode Tool
GHC
           GHCTargetVersion
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     GHCTargetVersion
forall a.
a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     a
forall (f :: * -> *) a. Applicative f => a -> f a
pure GHCTargetVersion
v
         Maybe Version
cabalVer <- Maybe ToolVersion
-> (ToolVersion
    -> Excepts
         '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
         (ResourceT (ReaderT AppState m))
         Version)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (Maybe Version)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM Maybe ToolVersion
runCabalVer ((ToolVersion
  -> Excepts
       '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
       (ResourceT (ReaderT AppState m))
       Version)
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
      (ResourceT (ReaderT AppState m))
      (Maybe Version))
-> (ToolVersion
    -> Excepts
         '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
         (ResourceT (ReaderT AppState m))
         Version)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (Maybe Version)
forall a b. (a -> b) -> a -> b
$ \ToolVersion
ver -> do
           (GHCTargetVersion
v, Maybe VersionInfo
_) <- Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
  (ResourceT (ReaderT AppState m))
  (GHCTargetVersion, Maybe VersionInfo)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
   (ResourceT (ReaderT AppState m))
   (GHCTargetVersion, Maybe VersionInfo)
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
      (ResourceT (ReaderT AppState m))
      (GHCTargetVersion, Maybe VersionInfo))
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall a b. (a -> b) -> a -> b
$ Maybe ToolVersion
-> GuessMode
-> Tool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall env (m :: * -> *).
(HasLog env, MonadFail m, MonadReader env m, HasGHCupInfo env,
 HasDirs env, MonadThrow m, MonadIO m, MonadCatch m) =>
Maybe ToolVersion
-> GuessMode
-> Tool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     m
     (GHCTargetVersion, Maybe VersionInfo)
fromVersion (ToolVersion -> Maybe ToolVersion
forall a. a -> Maybe a
Just ToolVersion
ver) GuessMode
guessMode Tool
Cabal
           Version
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     Version
forall a.
a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GHCTargetVersion -> Version
_tvVersion GHCTargetVersion
v)
         Maybe Version
hlsVer <- Maybe ToolVersion
-> (ToolVersion
    -> Excepts
         '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
         (ResourceT (ReaderT AppState m))
         Version)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (Maybe Version)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM Maybe ToolVersion
runHLSVer ((ToolVersion
  -> Excepts
       '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
       (ResourceT (ReaderT AppState m))
       Version)
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
      (ResourceT (ReaderT AppState m))
      (Maybe Version))
-> (ToolVersion
    -> Excepts
         '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
         (ResourceT (ReaderT AppState m))
         Version)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (Maybe Version)
forall a b. (a -> b) -> a -> b
$ \ToolVersion
ver -> do
           (GHCTargetVersion
v, Maybe VersionInfo
_) <- Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
  (ResourceT (ReaderT AppState m))
  (GHCTargetVersion, Maybe VersionInfo)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
   (ResourceT (ReaderT AppState m))
   (GHCTargetVersion, Maybe VersionInfo)
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
      (ResourceT (ReaderT AppState m))
      (GHCTargetVersion, Maybe VersionInfo))
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall a b. (a -> b) -> a -> b
$ Maybe ToolVersion
-> GuessMode
-> Tool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall env (m :: * -> *).
(HasLog env, MonadFail m, MonadReader env m, HasGHCupInfo env,
 HasDirs env, MonadThrow m, MonadIO m, MonadCatch m) =>
Maybe ToolVersion
-> GuessMode
-> Tool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     m
     (GHCTargetVersion, Maybe VersionInfo)
fromVersion (ToolVersion -> Maybe ToolVersion
forall a. a -> Maybe a
Just ToolVersion
ver) GuessMode
guessMode Tool
HLS
           Version
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     Version
forall a.
a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GHCTargetVersion -> Version
_tvVersion GHCTargetVersion
v)
         Maybe Version
stackVer <- Maybe ToolVersion
-> (ToolVersion
    -> Excepts
         '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
         (ResourceT (ReaderT AppState m))
         Version)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (Maybe Version)
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM Maybe ToolVersion
runStackVer ((ToolVersion
  -> Excepts
       '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
       (ResourceT (ReaderT AppState m))
       Version)
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
      (ResourceT (ReaderT AppState m))
      (Maybe Version))
-> (ToolVersion
    -> Excepts
         '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
         (ResourceT (ReaderT AppState m))
         Version)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (Maybe Version)
forall a b. (a -> b) -> a -> b
$ \ToolVersion
ver -> do
           (GHCTargetVersion
v, Maybe VersionInfo
_) <- Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
  (ResourceT (ReaderT AppState m))
  (GHCTargetVersion, Maybe VersionInfo)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
   (ResourceT (ReaderT AppState m))
   (GHCTargetVersion, Maybe VersionInfo)
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
      (ResourceT (ReaderT AppState m))
      (GHCTargetVersion, Maybe VersionInfo))
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall a b. (a -> b) -> a -> b
$ Maybe ToolVersion
-> GuessMode
-> Tool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     (GHCTargetVersion, Maybe VersionInfo)
forall env (m :: * -> *).
(HasLog env, MonadFail m, MonadReader env m, HasGHCupInfo env,
 HasDirs env, MonadThrow m, MonadIO m, MonadCatch m) =>
Maybe ToolVersion
-> GuessMode
-> Tool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     m
     (GHCTargetVersion, Maybe VersionInfo)
fromVersion (ToolVersion -> Maybe ToolVersion
forall a. a -> Maybe a
Just ToolVersion
ver) GuessMode
guessMode Tool
Stack
           Version
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     Version
forall a.
a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GHCTargetVersion -> Version
_tvVersion GHCTargetVersion
v)
         Toolchain
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     Toolchain
forall a.
a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet]
     (ResourceT (ReaderT AppState m))
     a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Toolchain{Maybe GHCTargetVersion
Maybe Version
ghcVer :: Maybe GHCTargetVersion
cabalVer :: Maybe Version
hlsVer :: Maybe Version
stackVer :: Maybe Version
ghcVer :: Maybe GHCTargetVersion
cabalVer :: Maybe Version
hlsVer :: Maybe Version
stackVer :: Maybe Version
..}

   resolveToolchain :: Excepts RunEffects (ReaderT LeanAppState m) Toolchain
resolveToolchain = do
         Maybe GHCTargetVersion
ghcVer <- case Maybe ToolVersion
runGHCVer of
            Just (GHCVersion GHCTargetVersion
v) -> Maybe GHCTargetVersion
-> Excepts
     RunEffects (ReaderT LeanAppState m) (Maybe GHCTargetVersion)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe GHCTargetVersion
 -> Excepts
      RunEffects (ReaderT LeanAppState m) (Maybe GHCTargetVersion))
-> Maybe GHCTargetVersion
-> Excepts
     RunEffects (ReaderT LeanAppState m) (Maybe GHCTargetVersion)
forall a b. (a -> b) -> a -> b
$ GHCTargetVersion -> Maybe GHCTargetVersion
forall a. a -> Maybe a
Just GHCTargetVersion
v
            Just (ToolVersion Version
v) -> Maybe GHCTargetVersion
-> Excepts
     RunEffects (ReaderT LeanAppState m) (Maybe GHCTargetVersion)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe GHCTargetVersion
 -> Excepts
      RunEffects (ReaderT LeanAppState m) (Maybe GHCTargetVersion))
-> Maybe GHCTargetVersion
-> Excepts
     RunEffects (ReaderT LeanAppState m) (Maybe GHCTargetVersion)
forall a b. (a -> b) -> a -> b
$ GHCTargetVersion -> Maybe GHCTargetVersion
forall a. a -> Maybe a
Just (Version -> GHCTargetVersion
mkTVer Version
v)
            Maybe ToolVersion
Nothing -> Maybe GHCTargetVersion
-> Excepts
     RunEffects (ReaderT LeanAppState m) (Maybe GHCTargetVersion)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe GHCTargetVersion
forall a. Maybe a
Nothing
            Maybe ToolVersion
_ -> String
-> Excepts
     RunEffects (ReaderT LeanAppState m) (Maybe GHCTargetVersion)
forall a. String -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Internal error"
         Maybe Version
cabalVer <- case Maybe ToolVersion
runCabalVer of
            Just (GHCVersion GHCTargetVersion
v) -> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Version
 -> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version))
-> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a b. (a -> b) -> a -> b
$ Version -> Maybe Version
forall a. a -> Maybe a
Just (GHCTargetVersion -> Version
_tvVersion GHCTargetVersion
v)
            Just (ToolVersion Version
v) -> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Version
 -> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version))
-> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a b. (a -> b) -> a -> b
$ Version -> Maybe Version
forall a. a -> Maybe a
Just Version
v
            Maybe ToolVersion
Nothing -> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Version
forall a. Maybe a
Nothing
            Maybe ToolVersion
_ -> String
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. String -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Internal error"
         Maybe Version
hlsVer <- case Maybe ToolVersion
runHLSVer of
            Just (GHCVersion GHCTargetVersion
v) -> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Version
 -> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version))
-> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a b. (a -> b) -> a -> b
$ Version -> Maybe Version
forall a. a -> Maybe a
Just (GHCTargetVersion -> Version
_tvVersion GHCTargetVersion
v)
            Just (ToolVersion Version
v) -> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Version
 -> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version))
-> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a b. (a -> b) -> a -> b
$ Version -> Maybe Version
forall a. a -> Maybe a
Just Version
v
            Maybe ToolVersion
Nothing -> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Version
forall a. Maybe a
Nothing
            Maybe ToolVersion
_ -> String
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. String -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Internal error"
         Maybe Version
stackVer <- case Maybe ToolVersion
runStackVer of
            Just (GHCVersion GHCTargetVersion
v) -> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Version
 -> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version))
-> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a b. (a -> b) -> a -> b
$ Version -> Maybe Version
forall a. a -> Maybe a
Just (GHCTargetVersion -> Version
_tvVersion GHCTargetVersion
v)
            Just (ToolVersion Version
v) -> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Version
 -> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version))
-> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a b. (a -> b) -> a -> b
$ Version -> Maybe Version
forall a. a -> Maybe a
Just Version
v
            Maybe ToolVersion
Nothing -> Maybe Version
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe Version
forall a. Maybe a
Nothing
            Maybe ToolVersion
_ -> String
-> Excepts RunEffects (ReaderT LeanAppState m) (Maybe Version)
forall a. String -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Internal error"
         Toolchain -> Excepts RunEffects (ReaderT LeanAppState m) Toolchain
forall a. a -> Excepts RunEffects (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Toolchain{Maybe GHCTargetVersion
Maybe Version
ghcVer :: Maybe GHCTargetVersion
cabalVer :: Maybe Version
hlsVer :: Maybe Version
stackVer :: Maybe Version
ghcVer :: Maybe GHCTargetVersion
cabalVer :: Maybe Version
hlsVer :: Maybe Version
stackVer :: Maybe Version
..}

   installToolChainFull :: ( MonadFail m
                           , MonadThrow m
                           , MonadIO m
                           , MonadCatch m
                           , Alternative m
                           )
                        => Toolchain
                        -> FilePath
                        -> Excepts
                             '[ TagNotFound
                              , DayNotFound
                              , NextVerNotFound
                              , NoToolVersionSet
                              , UnknownArchive
                              , TarDirDoesNotExist
                              , ProcessError
                              , NotInstalled
                              , NoDownload
                              , GPGError
                              , DownloadFailed
                              , DirNotEmpty
                              , DigestError
                              , ContentLengthError
                              , BuildFailed
                              , ArchiveResult
                              , AlreadyInstalled
                              , FileAlreadyExistsError
                              , CopyError
                              , UninstallFailed
                              , MergeFileTreeError
                              , NoCompatiblePlatform
                              , GHCup.Errors.ParseError
                              , UnsupportedSetupCombo
                              , DistroNotFound
                              , NoCompatibleArch
                              , URIParseError
                              ] (ResourceT (ReaderT AppState m)) ()
   installToolChainFull :: (MonadFail m, MonadThrow m, MonadIO m, MonadCatch m,
 Alternative m) =>
Toolchain
-> String
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
installToolChainFull Toolchain{Maybe GHCTargetVersion
Maybe Version
ghcVer :: Toolchain -> Maybe GHCTargetVersion
cabalVer :: Toolchain -> Maybe Version
hlsVer :: Toolchain -> Maybe Version
stackVer :: Toolchain -> Maybe Version
ghcVer :: Maybe GHCTargetVersion
cabalVer :: Maybe Version
hlsVer :: Maybe Version
stackVer :: Maybe Version
..} String
tmp = do
         case Maybe GHCTargetVersion
ghcVer of
           Just GHCTargetVersion
v -> do
             Bool
isInstalled <- ResourceT (ReaderT AppState m) Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     Bool
forall (m :: * -> *) a.
Monad m =>
m a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     m
     a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ResourceT (ReaderT AppState m) Bool
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      Bool)
-> ResourceT (ReaderT AppState m) Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     Bool
forall a b. (a -> b) -> a -> b
$ Tool -> GHCTargetVersion -> ResourceT (ReaderT AppState m) Bool
forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) =>
Tool -> GHCTargetVersion -> m Bool
checkIfToolInstalled' Tool
GHC GHCTargetVersion
v
             Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
isInstalled (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Bool
runInstTool' Bool -> Bool -> Bool
&& Maybe Text -> Bool
forall a. Maybe a -> Bool
isNothing (GHCTargetVersion -> Maybe Text
_tvTarget GHCTargetVersion
v)) (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
    UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
    NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
    ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
    FileAlreadyExistsError, CopyError, UninstallFailed,
    MergeFileTreeError, NoCompatiblePlatform, ParseError,
    UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
    URIParseError]
  (ResourceT (ReaderT AppState m))
  ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Excepts
  '[AlreadyInstalled, BuildFailed, DigestError, ContentLengthError,
    GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
    TarDirDoesNotExist, DirNotEmpty, ArchiveResult, ProcessError,
    UninstallFailed, MergeFileTreeError, NoCompatiblePlatform,
    ParseError, UnsupportedSetupCombo, DistroNotFound,
    NoCompatibleArch, URIParseError]
  (ResourceT (ReaderT AppState m))
  ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts
   '[AlreadyInstalled, BuildFailed, DigestError, ContentLengthError,
     GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
     TarDirDoesNotExist, DirNotEmpty, ArchiveResult, ProcessError,
     UninstallFailed, MergeFileTreeError, NoCompatiblePlatform,
     ParseError, UnsupportedSetupCombo, DistroNotFound,
     NoCompatibleArch, URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[AlreadyInstalled, BuildFailed, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, DirNotEmpty, ArchiveResult, ProcessError,
       UninstallFailed, MergeFileTreeError, NoCompatiblePlatform,
       ParseError, UnsupportedSetupCombo, DistroNotFound,
       NoCompatibleArch, URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ GHCTargetVersion
-> InstallDir
-> Bool
-> [Text]
-> Text
-> Excepts
     '[AlreadyInstalled, BuildFailed, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, DirNotEmpty, ArchiveResult, ProcessError,
       UninstallFailed, MergeFileTreeError, NoCompatiblePlatform,
       ParseError, UnsupportedSetupCombo, DistroNotFound,
       NoCompatibleArch, URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (m :: * -> *) env.
(MonadFail m, MonadMask m, MonadCatch m, MonadReader env m,
 HasPlatformReq env, HasGHCupInfo env, HasDirs env, HasSettings env,
 HasLog env, MonadResource m, MonadIO m, MonadUnliftIO m,
 Alternative m) =>
GHCTargetVersion
-> InstallDir
-> Bool
-> [Text]
-> Text
-> Excepts
     '[AlreadyInstalled, BuildFailed, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, DirNotEmpty, ArchiveResult, ProcessError,
       UninstallFailed, MergeFileTreeError, NoCompatiblePlatform,
       ParseError, UnsupportedSetupCombo, DistroNotFound,
       NoCompatibleArch, URIParseError]
     m
     ()
installGHCBin
               GHCTargetVersion
v
               InstallDir
GHCupInternal
               Bool
False
               []
               (String -> Text
T.pack String
"install")
             GHCTargetVersion
-> String
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall {es' :: [*]} {m :: * -> *} {env}.
(Index'
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es')
   es'
   es'
 ~ NotInstalled,
 MonadUnliftIO m, MonadMask m, MonadFail m,
 ToVariantMaybe NotInstalled es', PopVariant NotInstalled es',
 KnownNat
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es'),
 LabelOptic "dirs" A_Lens env env Dirs Dirs,
 LabelOptic "loggerConfig" A_Lens env env LoggerConfig LoggerConfig,
 MonadReader env m) =>
GHCTargetVersion -> String -> Excepts es' m ()
setGHC' GHCTargetVersion
v String
tmp
           Maybe GHCTargetVersion
_ -> ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a.
a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
         case Maybe Version
cabalVer of
           Just Version
v -> do
             Bool
isInstalled <- ResourceT (ReaderT AppState m) Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     Bool
forall (m :: * -> *) a.
Monad m =>
m a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     m
     a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ResourceT (ReaderT AppState m) Bool
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      Bool)
-> ResourceT (ReaderT AppState m) Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     Bool
forall a b. (a -> b) -> a -> b
$ Tool -> GHCTargetVersion -> ResourceT (ReaderT AppState m) Bool
forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) =>
Tool -> GHCTargetVersion -> m Bool
checkIfToolInstalled' Tool
Cabal (Version -> GHCTargetVersion
mkTVer Version
v)
             Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
isInstalled (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
runInstTool' (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
    UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
    NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
    ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
    FileAlreadyExistsError, CopyError, UninstallFailed,
    MergeFileTreeError, NoCompatiblePlatform, ParseError,
    UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
    URIParseError]
  (ResourceT (ReaderT AppState m))
  ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Excepts
  '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
    GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
    TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
    URIParseError]
  (ResourceT (ReaderT AppState m))
  ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts
   '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
     GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
     TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Version
-> InstallDir
-> Bool
-> Excepts
     '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (m :: * -> *) env.
(MonadMask m, MonadCatch m, MonadReader env m, HasPlatformReq env,
 HasGHCupInfo env, HasDirs env, HasSettings env, HasLog env,
 MonadResource m, MonadIO m, MonadUnliftIO m, MonadFail m) =>
Version
-> InstallDir
-> Bool
-> Excepts
     '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
       URIParseError]
     m
     ()
installCabalBin
               Version
v
               InstallDir
GHCupInternal
               Bool
False
             Version
-> String
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall {es' :: [*]} {m :: * -> *} {env}.
(Index'
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es')
   es'
   es'
 ~ NotInstalled,
 MonadUnliftIO m, MonadMask m, MonadFail m,
 ToVariantMaybe NotInstalled es', PopVariant NotInstalled es',
 KnownNat
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es'),
 LabelOptic "dirs" A_Lens env env Dirs Dirs,
 LabelOptic "loggerConfig" A_Lens env env LoggerConfig LoggerConfig,
 MonadReader env m) =>
Version -> String -> Excepts es' m ()
setCabal' Version
v String
tmp
           Maybe Version
_ -> ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a.
a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
         case Maybe Version
stackVer of
           Just Version
v -> do
             Bool
isInstalled <- ResourceT (ReaderT AppState m) Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     Bool
forall (m :: * -> *) a.
Monad m =>
m a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     m
     a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ResourceT (ReaderT AppState m) Bool
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      Bool)
-> ResourceT (ReaderT AppState m) Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     Bool
forall a b. (a -> b) -> a -> b
$ Tool -> GHCTargetVersion -> ResourceT (ReaderT AppState m) Bool
forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) =>
Tool -> GHCTargetVersion -> m Bool
checkIfToolInstalled' Tool
Stack (Version -> GHCTargetVersion
mkTVer Version
v)
             Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
isInstalled (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
runInstTool' (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
    UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
    NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
    ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
    FileAlreadyExistsError, CopyError, UninstallFailed,
    MergeFileTreeError, NoCompatiblePlatform, ParseError,
    UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
    URIParseError]
  (ResourceT (ReaderT AppState m))
  ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Excepts
  '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
    GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
    TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
    URIParseError]
  (ResourceT (ReaderT AppState m))
  ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts
   '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
     GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
     TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Version
-> InstallDir
-> Bool
-> Excepts
     '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (m :: * -> *) env.
(MonadMask m, MonadCatch m, MonadReader env m, HasDirs env,
 HasSettings env, HasPlatformReq env, HasGHCupInfo env, HasLog env,
 MonadResource m, MonadIO m, MonadUnliftIO m, MonadFail m) =>
Version
-> InstallDir
-> Bool
-> Excepts
     '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
       URIParseError]
     m
     ()
installStackBin
               Version
v
               InstallDir
GHCupInternal
               Bool
False
             Version
-> String
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall {es' :: [*]} {m :: * -> *} {env}.
(Index'
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es')
   es'
   es'
 ~ NotInstalled,
 MonadUnliftIO m, MonadMask m, MonadFail m,
 ToVariantMaybe NotInstalled es', PopVariant NotInstalled es',
 KnownNat
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es'),
 LabelOptic "dirs" A_Lens env env Dirs Dirs,
 LabelOptic "loggerConfig" A_Lens env env LoggerConfig LoggerConfig,
 MonadReader env m) =>
Version -> String -> Excepts es' m ()
setStack' Version
v String
tmp
           Maybe Version
_ -> ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a.
a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
         case Maybe Version
hlsVer of
           Just Version
v -> do
             Bool
isInstalled <- ResourceT (ReaderT AppState m) Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     Bool
forall (m :: * -> *) a.
Monad m =>
m a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     m
     a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ResourceT (ReaderT AppState m) Bool
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      Bool)
-> ResourceT (ReaderT AppState m) Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     Bool
forall a b. (a -> b) -> a -> b
$ Tool -> GHCTargetVersion -> ResourceT (ReaderT AppState m) Bool
forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) =>
Tool -> GHCTargetVersion -> m Bool
checkIfToolInstalled' Tool
HLS (Version -> GHCTargetVersion
mkTVer Version
v)
             Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
unless Bool
isInstalled (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Bool
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when Bool
runInstTool' (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Excepts
  '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
    UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
    NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
    ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
    FileAlreadyExistsError, CopyError, UninstallFailed,
    MergeFileTreeError, NoCompatiblePlatform, ParseError,
    UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
    URIParseError]
  (ResourceT (ReaderT AppState m))
  ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Excepts
   '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
     UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
     NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
     ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
     FileAlreadyExistsError, CopyError, UninstallFailed,
     MergeFileTreeError, NoCompatiblePlatform, ParseError,
     UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Excepts
  '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
    GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
    TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
    ProcessError, DirNotEmpty, UninstallFailed, MergeFileTreeError,
    URIParseError]
  (ResourceT (ReaderT AppState m))
  ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts
   '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
     GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
     TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
     ProcessError, DirNotEmpty, UninstallFailed, MergeFileTreeError,
     URIParseError]
   (ResourceT (ReaderT AppState m))
   ()
 -> Excepts
      '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
        UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
        NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
        ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
        FileAlreadyExistsError, CopyError, UninstallFailed,
        MergeFileTreeError, NoCompatiblePlatform, ParseError,
        UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
        URIParseError]
      (ResourceT (ReaderT AppState m))
      ())
-> Excepts
     '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
       ProcessError, DirNotEmpty, UninstallFailed, MergeFileTreeError,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a b. (a -> b) -> a -> b
$ Version
-> InstallDir
-> Bool
-> Excepts
     '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
       ProcessError, DirNotEmpty, UninstallFailed, MergeFileTreeError,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall (m :: * -> *) env.
(MonadMask m, MonadCatch m, MonadReader env m, HasPlatformReq env,
 HasGHCupInfo env, HasDirs env, HasSettings env, HasLog env,
 MonadResource m, MonadIO m, MonadUnliftIO m, MonadFail m) =>
Version
-> InstallDir
-> Bool
-> Excepts
     '[AlreadyInstalled, CopyError, DigestError, ContentLengthError,
       GPGError, DownloadFailed, NoDownload, NotInstalled, UnknownArchive,
       TarDirDoesNotExist, ArchiveResult, FileAlreadyExistsError,
       ProcessError, DirNotEmpty, UninstallFailed, MergeFileTreeError,
       URIParseError]
     m
     ()
installHLSBin
               Version
v
               InstallDir
GHCupInternal
               Bool
False
             Version
-> String
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall {w :: [*]} {m :: * -> *} {env}.
(Index'
   (IndexOf' (MaybeIndexOf' 0 NotInstalled w) NotInstalled w) w w
 ~ NotInstalled,
 MonadFail m, MonadUnliftIO m, ToVariantMaybe NotInstalled w,
 PopVariant NotInstalled w,
 KnownNat
   (IndexOf' (MaybeIndexOf' 0 NotInstalled w) NotInstalled w),
 MonadMask m, LabelOptic "dirs" A_Lens env env Dirs Dirs,
 LabelOptic "loggerConfig" A_Lens env env LoggerConfig LoggerConfig,
 MonadReader env m) =>
Version -> String -> Excepts w m ()
setHLS' Version
v String
tmp
           Maybe Version
_ -> ()
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     ()
forall a.
a
-> Excepts
     '[TagNotFound, DayNotFound, NextVerNotFound, NoToolVersionSet,
       UnknownArchive, TarDirDoesNotExist, ProcessError, NotInstalled,
       NoDownload, GPGError, DownloadFailed, DirNotEmpty, DigestError,
       ContentLengthError, BuildFailed, ArchiveResult, AlreadyInstalled,
       FileAlreadyExistsError, CopyError, UninstallFailed,
       MergeFileTreeError, NoCompatiblePlatform, ParseError,
       UnsupportedSetupCombo, DistroNotFound, NoCompatibleArch,
       URIParseError]
     (ResourceT (ReaderT AppState m))
     a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

   installToolChain :: ( MonadFail m
                       , MonadThrow m
                       , MonadIO m
                       , MonadCatch m
                       )
                    => Toolchain
                    -> FilePath
                    -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
   installToolChain :: (MonadFail m, MonadThrow m, MonadIO m, MonadCatch m) =>
Toolchain
-> String -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
installToolChain Toolchain{Maybe GHCTargetVersion
Maybe Version
ghcVer :: Toolchain -> Maybe GHCTargetVersion
cabalVer :: Toolchain -> Maybe Version
hlsVer :: Toolchain -> Maybe Version
stackVer :: Toolchain -> Maybe Version
ghcVer :: Maybe GHCTargetVersion
cabalVer :: Maybe Version
hlsVer :: Maybe Version
stackVer :: Maybe Version
..} String
tmp = do
         case Maybe GHCTargetVersion
ghcVer of
           Just GHCTargetVersion
v -> GHCTargetVersion
-> String -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
forall {es' :: [*]} {m :: * -> *} {env}.
(Index'
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es')
   es'
   es'
 ~ NotInstalled,
 MonadUnliftIO m, MonadMask m, MonadFail m,
 ToVariantMaybe NotInstalled es', PopVariant NotInstalled es',
 KnownNat
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es'),
 LabelOptic "dirs" A_Lens env env Dirs Dirs,
 LabelOptic "loggerConfig" A_Lens env env LoggerConfig LoggerConfig,
 MonadReader env m) =>
GHCTargetVersion -> String -> Excepts es' m ()
setGHC' GHCTargetVersion
v String
tmp
           Maybe GHCTargetVersion
_ -> () -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
forall a. a -> Excepts '[NotInstalled] (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
         case Maybe Version
cabalVer of
           Just Version
v -> Version
-> String -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
forall {es' :: [*]} {m :: * -> *} {env}.
(Index'
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es')
   es'
   es'
 ~ NotInstalled,
 MonadUnliftIO m, MonadMask m, MonadFail m,
 ToVariantMaybe NotInstalled es', PopVariant NotInstalled es',
 KnownNat
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es'),
 LabelOptic "dirs" A_Lens env env Dirs Dirs,
 LabelOptic "loggerConfig" A_Lens env env LoggerConfig LoggerConfig,
 MonadReader env m) =>
Version -> String -> Excepts es' m ()
setCabal' Version
v String
tmp
           Maybe Version
_ -> () -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
forall a. a -> Excepts '[NotInstalled] (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
         case Maybe Version
stackVer of
           Just Version
v -> Version
-> String -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
forall {es' :: [*]} {m :: * -> *} {env}.
(Index'
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es')
   es'
   es'
 ~ NotInstalled,
 MonadUnliftIO m, MonadMask m, MonadFail m,
 ToVariantMaybe NotInstalled es', PopVariant NotInstalled es',
 KnownNat
   (IndexOf' (MaybeIndexOf' 0 NotInstalled es') NotInstalled es'),
 LabelOptic "dirs" A_Lens env env Dirs Dirs,
 LabelOptic "loggerConfig" A_Lens env env LoggerConfig LoggerConfig,
 MonadReader env m) =>
Version -> String -> Excepts es' m ()
setStack' Version
v String
tmp
           Maybe Version
_ -> () -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
forall a. a -> Excepts '[NotInstalled] (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
         case Maybe Version
hlsVer of
           Just Version
v -> Version
-> String -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
forall {w :: [*]} {m :: * -> *} {env}.
(Index'
   (IndexOf' (MaybeIndexOf' 0 NotInstalled w) NotInstalled w) w w
 ~ NotInstalled,
 MonadFail m, MonadUnliftIO m, ToVariantMaybe NotInstalled w,
 PopVariant NotInstalled w,
 KnownNat
   (IndexOf' (MaybeIndexOf' 0 NotInstalled w) NotInstalled w),
 MonadMask m, LabelOptic "dirs" A_Lens env env Dirs Dirs,
 LabelOptic "loggerConfig" A_Lens env env LoggerConfig LoggerConfig,
 MonadReader env m) =>
Version -> String -> Excepts w m ()
setHLS' Version
v String
tmp
           Maybe Version
_ -> () -> Excepts '[NotInstalled] (ReaderT LeanAppState m) ()
forall a. a -> Excepts '[NotInstalled] (ReaderT LeanAppState m) a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

   setGHC' :: GHCTargetVersion -> String -> Excepts es' m ()
setGHC' GHCTargetVersion
v String
tmp = do
          Excepts es' m GHCTargetVersion -> Excepts es' m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Excepts es' m GHCTargetVersion -> Excepts es' m ())
-> Excepts es' m GHCTargetVersion -> Excepts es' m ()
forall a b. (a -> b) -> a -> b
$ Excepts '[NotInstalled] m GHCTargetVersion
-> Excepts es' m GHCTargetVersion
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts '[NotInstalled] m GHCTargetVersion
 -> Excepts es' m GHCTargetVersion)
-> Excepts '[NotInstalled] m GHCTargetVersion
-> Excepts es' m GHCTargetVersion
forall a b. (a -> b) -> a -> b
$ GHCTargetVersion
-> SetGHC
-> Maybe String
-> Excepts '[NotInstalled] m GHCTargetVersion
forall env (m :: * -> *).
(MonadReader env m, HasDirs env, HasLog env, MonadThrow m,
 MonadFail m, MonadIO m, MonadCatch m, MonadMask m,
 MonadUnliftIO m) =>
GHCTargetVersion
-> SetGHC
-> Maybe String
-> Excepts '[NotInstalled] m GHCTargetVersion
setGHC GHCTargetVersion
v SetGHC
SetGHC_XYZ (String -> Maybe String
forall a. a -> Maybe a
Just String
tmp)
          Excepts es' m GHCTargetVersion -> Excepts es' m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (Excepts es' m GHCTargetVersion -> Excepts es' m ())
-> Excepts es' m GHCTargetVersion -> Excepts es' m ()
forall a b. (a -> b) -> a -> b
$ Excepts '[NotInstalled] m GHCTargetVersion
-> Excepts es' m GHCTargetVersion
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts '[NotInstalled] m GHCTargetVersion
 -> Excepts es' m GHCTargetVersion)
-> Excepts '[NotInstalled] m GHCTargetVersion
-> Excepts es' m GHCTargetVersion
forall a b. (a -> b) -> a -> b
$ GHCTargetVersion
-> SetGHC
-> Maybe String
-> Excepts '[NotInstalled] m GHCTargetVersion
forall env (m :: * -> *).
(MonadReader env m, HasDirs env, HasLog env, MonadThrow m,
 MonadFail m, MonadIO m, MonadCatch m, MonadMask m,
 MonadUnliftIO m) =>
GHCTargetVersion
-> SetGHC
-> Maybe String
-> Excepts '[NotInstalled] m GHCTargetVersion
setGHC GHCTargetVersion
v SetGHC
SetGHCOnly (String -> Maybe String
forall a. a -> Maybe a
Just String
tmp)
   setCabal' :: Version -> String -> Excepts es' m ()
setCabal' Version
v String
tmp = do
          String
bin  <- Excepts '[NotInstalled] m String -> Excepts es' m String
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts '[NotInstalled] m String -> Excepts es' m String)
-> Excepts '[NotInstalled] m String -> Excepts es' m String
forall a b. (a -> b) -> a -> b
$ Tool -> GHCTargetVersion -> Excepts '[NotInstalled] m String
forall env (m :: * -> *).
(MonadReader env m, HasDirs env, HasLog env, MonadThrow m,
 MonadFail m, MonadIO m, MonadCatch m, MonadMask m,
 MonadUnliftIO m) =>
Tool -> GHCTargetVersion -> Excepts '[NotInstalled] m String
whereIsTool Tool
Cabal (Version -> GHCTargetVersion
mkTVer Version
v)
          String
cbin <- IO String -> Excepts es' m String
forall a. IO a -> Excepts es' m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO String -> Excepts es' m String)
-> IO String -> Excepts es' m String
forall a b. (a -> b) -> a -> b
$ String -> IO String
canonicalizePath String
bin
          m () -> Excepts es' m ()
forall (m :: * -> *) a. Monad m => m a -> Excepts es' m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> Excepts es' m ()) -> m () -> Excepts es' m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> m ()
forall (m :: * -> *) env.
(MonadMask m, MonadThrow m, HasLog env, MonadIO m,
 MonadReader env m, HasDirs env, MonadUnliftIO m, MonadFail m) =>
String -> String -> m ()
createLink (String -> ShowS
relativeSymlink String
tmp String
cbin) (String
tmp String -> ShowS
</> (String
"cabal" String -> ShowS
<.> String
exeExt))
   setStack' :: Version -> String -> Excepts es' m ()
setStack' Version
v String
tmp = do
          String
bin  <- Excepts '[NotInstalled] m String -> Excepts es' m String
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts '[NotInstalled] m String -> Excepts es' m String)
-> Excepts '[NotInstalled] m String -> Excepts es' m String
forall a b. (a -> b) -> a -> b
$ Tool -> GHCTargetVersion -> Excepts '[NotInstalled] m String
forall env (m :: * -> *).
(MonadReader env m, HasDirs env, HasLog env, MonadThrow m,
 MonadFail m, MonadIO m, MonadCatch m, MonadMask m,
 MonadUnliftIO m) =>
Tool -> GHCTargetVersion -> Excepts '[NotInstalled] m String
whereIsTool Tool
Stack (Version -> GHCTargetVersion
mkTVer Version
v)
          String
cbin <- IO String -> Excepts es' m String
forall a. IO a -> Excepts es' m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO String -> Excepts es' m String)
-> IO String -> Excepts es' m String
forall a b. (a -> b) -> a -> b
$ String -> IO String
canonicalizePath String
bin
          m () -> Excepts es' m ()
forall (m :: * -> *) a. Monad m => m a -> Excepts es' m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> Excepts es' m ()) -> m () -> Excepts es' m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> m ()
forall (m :: * -> *) env.
(MonadMask m, MonadThrow m, HasLog env, MonadIO m,
 MonadReader env m, HasDirs env, MonadUnliftIO m, MonadFail m) =>
String -> String -> m ()
createLink (String -> ShowS
relativeSymlink String
tmp String
cbin) (String
tmp String -> ShowS
</> (String
"stack" String -> ShowS
<.> String
exeExt))
   setHLS' :: Version -> String -> Excepts w m ()
setHLS' Version
v String
tmp = do
          Dirs {String
GHCupPath
baseDir :: GHCupPath
binDir :: String
cacheDir :: GHCupPath
logsDir :: GHCupPath
confDir :: GHCupPath
dbDir :: GHCupPath
recycleDir :: GHCupPath
tmpDir :: GHCupPath
msys2Dir :: String
$sel:baseDir:Dirs :: Dirs -> GHCupPath
$sel:binDir:Dirs :: Dirs -> String
$sel:cacheDir:Dirs :: Dirs -> GHCupPath
$sel:logsDir:Dirs :: Dirs -> GHCupPath
$sel:confDir:Dirs :: Dirs -> GHCupPath
$sel:dbDir:Dirs :: Dirs -> GHCupPath
$sel:recycleDir:Dirs :: Dirs -> GHCupPath
$sel:tmpDir:Dirs :: Dirs -> GHCupPath
$sel:msys2Dir:Dirs :: Dirs -> String
..}  <- Excepts w m Dirs
forall env (m :: * -> *).
(MonadReader env m, LabelOptic' "dirs" A_Lens env Dirs) =>
m Dirs
getDirs
          Bool
legacy <- Version -> Excepts w m Bool
forall (m :: * -> *) env.
(MonadIO m, MonadReader env m, HasDirs env, MonadCatch m) =>
Version -> m Bool
isLegacyHLS Version
v
          if Bool
legacy
          then do
            -- TODO: factor this out
            String
hlsWrapper <- forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE @_ @'[NotInstalled] (Excepts '[NotInstalled] m String -> Excepts w m String)
-> Excepts '[NotInstalled] m String -> Excepts w m String
forall a b. (a -> b) -> a -> b
$ Version -> m (Maybe String)
forall env (m :: * -> *).
(MonadReader env m, HasDirs env, MonadThrow m, MonadIO m) =>
Version -> m (Maybe String)
hlsWrapperBinary Version
v m (Maybe String)
-> NotInstalled -> Excepts '[NotInstalled] m String
forall e (es :: [*]) a (m :: * -> *).
(Monad m, e :< es) =>
m (Maybe a) -> e -> Excepts es m a
!? (Tool -> GHCTargetVersion -> NotInstalled
NotInstalled Tool
HLS (Version -> GHCTargetVersion
mkTVer Version
v))
            String
cw <- IO String -> Excepts w m String
forall a. IO a -> Excepts w m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO String -> Excepts w m String)
-> IO String -> Excepts w m String
forall a b. (a -> b) -> a -> b
$ String -> IO String
canonicalizePath (String
binDir String -> ShowS
</> String
hlsWrapper)
            m () -> Excepts w m ()
forall (m :: * -> *) a. Monad m => m a -> Excepts w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> Excepts w m ()) -> m () -> Excepts w m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> m ()
forall (m :: * -> *) env.
(MonadMask m, MonadThrow m, HasLog env, MonadIO m,
 MonadReader env m, HasDirs env, MonadUnliftIO m, MonadFail m) =>
String -> String -> m ()
createLink (String -> ShowS
relativeSymlink String
tmp String
cw) (String
tmp String -> ShowS
</> ShowS
takeFileName String
cw)
            [String]
hlsBins <- Version -> Maybe Version -> Excepts w m [String]
forall env (m :: * -> *).
(MonadReader env m, HasDirs env, MonadIO m) =>
Version -> Maybe Version -> m [String]
hlsServerBinaries Version
v Maybe Version
forall a. Maybe a
Nothing Excepts w m [String]
-> ([String] -> Excepts w m [String]) -> Excepts w m [String]
forall a b. Excepts w m a -> (a -> Excepts w m b) -> Excepts w m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IO [String] -> Excepts w m [String]
forall a. IO a -> Excepts w m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO [String] -> Excepts w m [String])
-> ([String] -> IO [String]) -> [String] -> Excepts w m [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> IO String) -> [String] -> IO [String]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse (String -> IO String
canonicalizePath (String -> IO String) -> ShowS -> String -> IO String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
binDir String -> ShowS
</>))
            [String] -> (String -> Excepts w m ()) -> Excepts w m ()
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
t a -> (a -> m b) -> m ()
forM_ [String]
hlsBins ((String -> Excepts w m ()) -> Excepts w m ())
-> (String -> Excepts w m ()) -> Excepts w m ()
forall a b. (a -> b) -> a -> b
$ \String
bin ->
              m () -> Excepts w m ()
forall (m :: * -> *) a. Monad m => m a -> Excepts w m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m () -> Excepts w m ()) -> m () -> Excepts w m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> m ()
forall (m :: * -> *) env.
(MonadMask m, MonadThrow m, HasLog env, MonadIO m,
 MonadReader env m, HasDirs env, MonadUnliftIO m, MonadFail m) =>
String -> String -> m ()
createLink (String -> ShowS
relativeSymlink String
tmp String
bin) (String
tmp String -> ShowS
</> ShowS
takeFileName String
bin)
            Excepts '[NotInstalled] m () -> Excepts w m ()
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts '[NotInstalled] m () -> Excepts w m ())
-> Excepts '[NotInstalled] m () -> Excepts w m ()
forall a b. (a -> b) -> a -> b
$ Version -> SetHLS -> Maybe String -> Excepts '[NotInstalled] m ()
forall env (m :: * -> *).
(MonadReader env m, HasDirs env, HasLog env, MonadIO m,
 MonadMask m, MonadFail m, MonadUnliftIO m) =>
Version -> SetHLS -> Maybe String -> Excepts '[NotInstalled] m ()
setHLS Version
v SetHLS
SetHLSOnly (String -> Maybe String
forall a. a -> Maybe a
Just String
tmp)
          else do
            Excepts '[NotInstalled] m () -> Excepts w m ()
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts '[NotInstalled] m () -> Excepts w m ())
-> Excepts '[NotInstalled] m () -> Excepts w m ()
forall a b. (a -> b) -> a -> b
$ Version -> SetHLS -> Maybe String -> Excepts '[NotInstalled] m ()
forall env (m :: * -> *).
(MonadReader env m, HasDirs env, HasLog env, MonadIO m,
 MonadMask m, MonadFail m, MonadUnliftIO m) =>
Version -> SetHLS -> Maybe String -> Excepts '[NotInstalled] m ()
setHLS Version
v SetHLS
SetHLS_XYZ (String -> Maybe String
forall a. a -> Maybe a
Just String
tmp)
            Excepts '[NotInstalled] m () -> Excepts w m ()
forall (es' :: [*]) (es :: [*]) a (m :: * -> *).
(Monad m, VEitherLift es es') =>
Excepts es m a -> Excepts es' m a
liftE (Excepts '[NotInstalled] m () -> Excepts w m ())
-> Excepts '[NotInstalled] m () -> Excepts w m ()
forall a b. (a -> b) -> a -> b
$ Version -> SetHLS -> Maybe String -> Excepts '[NotInstalled] m ()
forall env (m :: * -> *).
(MonadReader env m, HasDirs env, HasLog env, MonadIO m,
 MonadMask m, MonadFail m, MonadUnliftIO m) =>
Version -> SetHLS -> Maybe String -> Excepts '[NotInstalled] m ()
setHLS Version
v SetHLS
SetHLSOnly (String -> Maybe String
forall a. a -> Maybe a
Just String
tmp)

   createTmpDir :: ( MonadUnliftIO m
                   , MonadCatch m
                   , MonadThrow m
                   , MonadMask m
                   , MonadIO m
                   )
                => Toolchain
                -> ReaderT LeanAppState m FilePath
   createTmpDir :: (MonadUnliftIO m, MonadCatch m, MonadThrow m, MonadMask m,
 MonadIO m) =>
Toolchain -> ReaderT LeanAppState m String
createTmpDir Toolchain
toolchain =
     case Maybe String
runBinDir of
           Just String
bindir -> do
             IO () -> ReaderT LeanAppState m ()
forall a. IO a -> ReaderT LeanAppState m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ReaderT LeanAppState m ())
-> IO () -> ReaderT LeanAppState m ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
createDirRecursive' String
bindir
             IO String -> ReaderT LeanAppState m String
forall a. IO a -> ReaderT LeanAppState m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO String -> ReaderT LeanAppState m String)
-> IO String -> ReaderT LeanAppState m String
forall a b. (a -> b) -> a -> b
$ String -> IO String
canonicalizePath String
bindir
           Maybe String
Nothing -> do
             String
d <- Monad m => Toolchain -> ReaderT LeanAppState m String
Toolchain -> ReaderT LeanAppState m String
predictableTmpDir Toolchain
toolchain
             IO () -> ReaderT LeanAppState m ()
forall a. IO a -> ReaderT LeanAppState m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> ReaderT LeanAppState m ())
-> IO () -> ReaderT LeanAppState m ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
createDirRecursive' String
d
             IO String -> ReaderT LeanAppState m String
forall a. IO a -> ReaderT LeanAppState m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO String -> ReaderT LeanAppState m String)
-> IO String -> ReaderT LeanAppState m String
forall a b. (a -> b) -> a -> b
$ String -> IO String
canonicalizePath String
d

   predictableTmpDir :: Monad m
                     => Toolchain
                     -> ReaderT LeanAppState m FilePath
   predictableTmpDir :: Monad m => Toolchain -> ReaderT LeanAppState m String
predictableTmpDir (Toolchain Maybe GHCTargetVersion
Nothing Maybe Version
Nothing Maybe Version
Nothing Maybe Version
Nothing) = do
     Dirs { GHCupPath
$sel:tmpDir:Dirs :: Dirs -> GHCupPath
tmpDir :: GHCupPath
tmpDir } <- ReaderT LeanAppState m Dirs
forall env (m :: * -> *).
(MonadReader env m, LabelOptic' "dirs" A_Lens env Dirs) =>
m Dirs
getDirs
     String -> ReaderT LeanAppState m String
forall a. a -> ReaderT LeanAppState m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GHCupPath -> String
fromGHCupPath GHCupPath
tmpDir String -> ShowS
</> String
"ghcup-none")
   predictableTmpDir Toolchain{Maybe GHCTargetVersion
Maybe Version
ghcVer :: Toolchain -> Maybe GHCTargetVersion
cabalVer :: Toolchain -> Maybe Version
hlsVer :: Toolchain -> Maybe Version
stackVer :: Toolchain -> Maybe Version
ghcVer :: Maybe GHCTargetVersion
cabalVer :: Maybe Version
hlsVer :: Maybe Version
stackVer :: Maybe Version
..} = do
      Dirs { GHCupPath
$sel:tmpDir:Dirs :: Dirs -> GHCupPath
tmpDir :: GHCupPath
tmpDir } <- ReaderT LeanAppState m Dirs
forall env (m :: * -> *).
(MonadReader env m, LabelOptic' "dirs" A_Lens env Dirs) =>
m Dirs
getDirs
      String -> ReaderT LeanAppState m String
forall a. a -> ReaderT LeanAppState m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (String -> ReaderT LeanAppState m String)
-> String -> ReaderT LeanAppState m String
forall a b. (a -> b) -> a -> b
$ GHCupPath -> String
fromGHCupPath GHCupPath
tmpDir
        String -> ShowS
</> (String
"ghcup-" String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"_"
              (  [String]
-> (GHCTargetVersion -> [String])
-> Maybe GHCTargetVersion
-> [String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ( (String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[]) (String -> [String])
-> (GHCTargetVersion -> String) -> GHCTargetVersion -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"ghc-"   String -> ShowS
forall a. Semigroup a => a -> a -> a
<>) ShowS -> (GHCTargetVersion -> String) -> GHCTargetVersion -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack (Text -> String)
-> (GHCTargetVersion -> Text) -> GHCTargetVersion -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. GHCTargetVersion -> Text
tVerToText) Maybe GHCTargetVersion
ghcVer
              [String] -> [String] -> [String]
forall a. Semigroup a => a -> a -> a
<> [String] -> (Version -> [String]) -> Maybe Version -> [String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ( (String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[]) (String -> [String]) -> (Version -> String) -> Version -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"cabal-" String -> ShowS
forall a. Semigroup a => a -> a -> a
<>) ShowS -> (Version -> String) -> Version -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack (Text -> String) -> (Version -> Text) -> Version -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> Text
prettyVer) Maybe Version
cabalVer
              [String] -> [String] -> [String]
forall a. Semigroup a => a -> a -> a
<> [String] -> (Version -> [String]) -> Maybe Version -> [String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ( (String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[]) (String -> [String]) -> (Version -> String) -> Version -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"hls-"   String -> ShowS
forall a. Semigroup a => a -> a -> a
<>) ShowS -> (Version -> String) -> Version -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack (Text -> String) -> (Version -> Text) -> Version -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> Text
prettyVer) Maybe Version
hlsVer
              [String] -> [String] -> [String]
forall a. Semigroup a => a -> a -> a
<> [String] -> (Version -> [String]) -> Maybe Version -> [String]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ( (String -> [String] -> [String]
forall a. a -> [a] -> [a]
:[]) (String -> [String]) -> (Version -> String) -> Version -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"stack-" String -> ShowS
forall a. Semigroup a => a -> a -> a
<>) ShowS -> (Version -> String) -> Version -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack (Text -> String) -> (Version -> Text) -> Version -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Version -> Text
prettyVer) Maybe Version
stackVer
              )
            )



    -------------------------
    --[ Other local types ]--
    -------------------------



data Toolchain = Toolchain
  { Toolchain -> Maybe GHCTargetVersion
ghcVer     :: Maybe GHCTargetVersion
  , Toolchain -> Maybe Version
cabalVer   :: Maybe Version
  , Toolchain -> Maybe Version
hlsVer     :: Maybe Version
  , Toolchain -> Maybe Version
stackVer   :: Maybe Version
  } deriving Int -> Toolchain -> ShowS
[Toolchain] -> ShowS
Toolchain -> String
(Int -> Toolchain -> ShowS)
-> (Toolchain -> String)
-> ([Toolchain] -> ShowS)
-> Show Toolchain
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Toolchain -> ShowS
showsPrec :: Int -> Toolchain -> ShowS
$cshow :: Toolchain -> String
show :: Toolchain -> String
$cshowList :: [Toolchain] -> ShowS
showList :: [Toolchain] -> ShowS
Show