-- {-# LANGUAGE UndecidableInstances #-}
module Data.Git.Phoenix.App where

import Conduit (MonadUnliftIO, MonadResource)
import Data.Git.Phoenix.CmdArgs
import Data.Git.Phoenix.Io
import Data.Tagged (Tagged)
import Relude
import UnliftIO.QSem qualified as U

type PhoenixM m = (HasCallStack, MonadUnliftIO m, MonadFail m, HasInHandlesSem m)

data PhoenixUberConf
  = PhoenixUberConf
    { PhoenixUberConf -> Tagged OutDir FilePath
destObjectDir :: Tagged OutDir FilePath
    , PhoenixUberConf -> QSem
inHandlesSem  :: U.QSem
    }

instance HasInHandlesSem (ReaderT PhoenixUberConf IO) where
  getInHandlesSem :: ReaderT PhoenixUberConf IO QSem
getInHandlesSem = (PhoenixUberConf -> QSem) -> ReaderT PhoenixUberConf IO QSem
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks PhoenixUberConf -> QSem
inHandlesSem

type PhoenixUberM m = (PhoenixM m, MonadReader PhoenixUberConf m)

data PhoenixExtractConf
  = PhoenixExtractConf
    { PhoenixExtractConf -> Tagged OutDir FilePath
destGitDir :: Tagged OutDir FilePath
    , PhoenixExtractConf -> Tagged InDir FilePath
uberDir :: Tagged InDir FilePath
    , PhoenixExtractConf -> QSem
inHandlesSem' :: U.QSem
    }

type PhoenixExtractM m = (PhoenixM m, MonadReader PhoenixExtractConf m)

instance HasInHandlesSem (ReaderT PhoenixExtractConf IO) where
  getInHandlesSem :: ReaderT PhoenixExtractConf IO QSem
getInHandlesSem = (PhoenixExtractConf -> QSem) -> ReaderT PhoenixExtractConf IO QSem
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks PhoenixExtractConf -> QSem
inHandlesSem'

data PhoenixSearchConf
  = PhoenixSearchConf
    { PhoenixSearchConf -> Tagged InDir FilePath
uberRepoDir :: Tagged InDir FilePath
    , PhoenixSearchConf -> QSem
inHandlesSem'' :: U.QSem
    }

type PhoenixSearchM m = (PhoenixM m, MonadReader PhoenixSearchConf m)

instance HasInHandlesSem (ReaderT PhoenixSearchConf IO) where
  getInHandlesSem :: ReaderT PhoenixSearchConf IO QSem
getInHandlesSem = (PhoenixSearchConf -> QSem) -> ReaderT PhoenixSearchConf IO QSem
forall r (m :: * -> *) a. MonadReader r m => (r -> a) -> m a
asks PhoenixSearchConf -> QSem
inHandlesSem''

type PhoenixCoCon m = (PhoenixM m, MonadResource m)