module Engine.App
  ( engineMain
  , engineMainWith
  ) where

import RIO

import RIO.App (appMain)
import Engine.Run (runStack)
import Engine.Setup (setup)
import Engine.Types qualified as Engine
import Engine.Types.Options (Options(..), getOptions)
import Engine.Stage.Bootstrap.Setup qualified as Bootstrap

engineMain :: Engine.StackStage -> IO ()
engineMain :: StackStage -> IO ()
engineMain StackStage
initialStage = forall a. (a -> StackStage) -> StageSetupRIO a -> IO ()
engineMainWith (\() -> StackStage
initialStage) (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())

engineMainWith :: (a -> Engine.StackStage) -> Engine.StageSetupRIO a -> IO ()
engineMainWith :: forall a. (a -> StackStage) -> StageSetupRIO a -> IO ()
engineMainWith a -> StackStage
handoff StageSetupRIO a
action =
  forall options env st.
IO options
-> (options -> Bool)
-> (options -> RIO SetupApp (env, st))
-> RIO (App env st) ()
-> IO ()
appMain IO Options
getOptions Options -> Bool
optionsVerbose forall env.
(HasLogFunc env, MonadResource (RIO env)) =>
Options -> RIO env (GlobalHandles, Maybe SwapchainResources)
setup forall a b. (a -> b) -> a -> b
$ StageStack -> StageRIO (Maybe SwapchainResources) ()
runStack
    [ -- XXX: run swapchain bootstrap and replace with next stage
      forall a. (a -> StackStage) -> StageSetupRIO a -> StackStage
Bootstrap.stackStage a -> StackStage
handoff StageSetupRIO a
action
    ]