{-# LANGUAGE CPP #-}
-- | This module exposes a simple API to initialize Vty in a
-- platform-independent way. This module only provides @mkVty@
-- for initializing the terminal. The rest of the Vty API is
-- accessed through the @vty@ package's API. If you need access to
-- platform-specific settings, it might be best to depend on and use the
-- platform-specific packages directly instead of using this package.
module Graphics.Vty.CrossPlatform
  ( mkVty
  )
where

import Graphics.Vty (Vty)
import Graphics.Vty.Config (VtyUserConfig)

-- Import the platform-specific module that provides 'mkVty'. The
-- convention is that each platform package should export a 'mkVty' with
-- the type signature indicated below, so only branching at import time
-- like this ensures that the build will break if either 1) a platform
-- doesn't provide 'mkVty' or 2) provides it but at a different type.
--
-- This approach works fine for now with just two main platforms as
-- options, but if we need to support a third, we'll probably need to
-- make this check more sophisticated. This approach also has a slight
-- risk in that it may come to a different conclusion about the build
-- platform than the Cabal "if os(...)" check. We could avoid that
-- by using the Cabal API here to do OS detection, but that has the
-- drawback that we'd then be depending on the Cabal library, and that
-- gets to be a big pain when the version of Cabal we depend on happens
-- to be different than the one used to build the 'cabal-install' that
-- got used to do the build.
#if defined(mingw32_HOST_OS) || defined(__MINGW32__)
import qualified Graphics.Vty.Platform.Windows as Platform
#else
import qualified Graphics.Vty.Platform.Unix as Platform
#endif

-- | Build a 'Vty' handle with the specified configuration.
--
-- This dispatches to the appropriate platform-specific implementation
-- at build time based on the build environment's operating system.
mkVty :: VtyUserConfig
      -- ^ The configuration to use, usually
      -- 'Graphics.Vty.Config.defaultConfig' or the result of
      -- 'Graphics.Vty.Config.userConfig'.
      -> IO Vty
mkVty :: VtyUserConfig -> IO Vty
mkVty = VtyUserConfig -> IO Vty
Platform.mkVty