module Vulkan.Utils.Internal where

import           Control.Monad.IO.Class
import           GHC.IO                         ( throwIO )
import           GHC.IO.Exception               ( IOErrorType(..)
                                                , IOException(..)
                                                )
import           System.IO                      ( hPutStrLn
                                                , stderr
                                                )
import Language.Haskell.TH.Quote

----------------------------------------------------------------
-- Internal utils
----------------------------------------------------------------

unsatisfiedConstraints :: String -> IO a
unsatisfiedConstraints :: forall a. String -> IO a
unsatisfiedConstraints String
message =
  forall e a. Exception e => e -> IO a
throwIO forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError forall a. Maybe a
Nothing IOErrorType
UnsatisfiedConstraints String
"" String
message forall a. Maybe a
Nothing forall a. Maybe a
Nothing

noSuchThing :: String -> IO a
noSuchThing :: forall a. String -> IO a
noSuchThing String
message =
  forall e a. Exception e => e -> IO a
throwIO forall a b. (a -> b) -> a -> b
$ Maybe Handle
-> IOErrorType
-> String
-> String
-> Maybe CInt
-> Maybe String
-> IOException
IOError forall a. Maybe a
Nothing IOErrorType
NoSuchThing String
"" String
message forall a. Maybe a
Nothing forall a. Maybe a
Nothing

sayErr :: MonadIO m => String -> m ()
sayErr :: forall (m :: * -> *). MonadIO m => String -> m ()
sayErr = forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handle -> String -> IO ()
hPutStrLn Handle
stderr

badQQ :: String -> QuasiQuoter
badQQ :: String -> QuasiQuoter
badQQ String
name = (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
QuasiQuoter (forall a. String -> a
bad String
"expression")
                         (forall a. String -> a
bad String
"pattern")
                         (forall a. String -> a
bad String
"type")
                         (forall a. String -> a
bad String
"declaration")
 where
  bad :: String -> a
  bad :: forall a. String -> a
bad String
context =
    forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"Can't use " forall a. Semigroup a => a -> a -> a
<> String
name forall a. Semigroup a => a -> a -> a
<> String
" quote in a " forall a. Semigroup a => a -> a -> a
<> String
context forall a. Semigroup a => a -> a -> a
<> String
" context"