{-# LANGUAGE ViewPatterns #-}
{-# OPTIOnS_GHC -Wall -fno-warn-tabs #-}

module Shaderc.Middle where

import Foreign.Storable
import Control.Monad.Trans
import Control.Monad.Cont

import qualified Data.ByteString as BS

import Language.SpirV.ShaderKind.Core

import qualified Shaderc.Core as C
import qualified Language.SpirV.Shaderc.CompileOptions.Internal as CompileOptions
import qualified Shaderc.CompilationResult.Core as CompilationResult

compileIntoSpv :: Storable ud =>
	C.CompilerT -> BS.ByteString -> ShaderKind ->
	BS.ByteString -> BS.ByteString -> CompileOptions.C ud ->
	ContT r IO CompilationResult.T
compileIntoSpv :: forall ud r.
Storable ud =>
CompilerT
-> ByteString
-> ShaderKind
-> ByteString
-> ByteString
-> C ud
-> ContT r IO T
compileIntoSpv CompilerT
cmp ByteString
src ShaderKind
knd ByteString
ifnm ByteString
epnm C ud
opts = do
	(Ptr CChar
csrc, Int -> Word64
forall a b. (Integral a, Num b) => a -> b
fromIntegral -> Word64
csrcln) <- (((Ptr CChar, Int) -> IO r) -> IO r) -> ContT r IO (Ptr CChar, Int)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT ((((Ptr CChar, Int) -> IO r) -> IO r)
 -> ContT r IO (Ptr CChar, Int))
-> (((Ptr CChar, Int) -> IO r) -> IO r)
-> ContT r IO (Ptr CChar, Int)
forall a b. (a -> b) -> a -> b
$ ByteString -> ((Ptr CChar, Int) -> IO r) -> IO r
forall a. ByteString -> ((Ptr CChar, Int) -> IO a) -> IO a
BS.useAsCStringLen ByteString
src
	Ptr CChar
cifnm <- ((Ptr CChar -> IO r) -> IO r) -> ContT r IO (Ptr CChar)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr CChar -> IO r) -> IO r) -> ContT r IO (Ptr CChar))
-> ((Ptr CChar -> IO r) -> IO r) -> ContT r IO (Ptr CChar)
forall a b. (a -> b) -> a -> b
$ ByteString -> (Ptr CChar -> IO r) -> IO r
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
BS.useAsCString ByteString
ifnm
	Ptr CChar
cepnm <- ((Ptr CChar -> IO r) -> IO r) -> ContT r IO (Ptr CChar)
forall {k} (r :: k) (m :: k -> *) a.
((a -> m r) -> m r) -> ContT r m a
ContT (((Ptr CChar -> IO r) -> IO r) -> ContT r IO (Ptr CChar))
-> ((Ptr CChar -> IO r) -> IO r) -> ContT r IO (Ptr CChar)
forall a b. (a -> b) -> a -> b
$ ByteString -> (Ptr CChar -> IO r) -> IO r
forall a. ByteString -> (Ptr CChar -> IO a) -> IO a
BS.useAsCString ByteString
epnm
	C
copts <- C ud -> ContT r IO C
forall ud r. Storable ud => C ud -> ContT r IO C
CompileOptions.tToCore C ud
opts
	IO T -> ContT r IO T
forall (m :: * -> *) a. Monad m => m a -> ContT r m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (IO T -> ContT r IO T) -> IO T -> ContT r IO T
forall a b. (a -> b) -> a -> b
$ CompilerT
-> Ptr CChar
-> Word64
-> ShaderKind
-> Ptr CChar
-> Ptr CChar
-> C
-> IO T
C.compileIntoSpv CompilerT
cmp Ptr CChar
csrc Word64
csrcln ShaderKind
knd Ptr CChar
cifnm Ptr CChar
cepnm C
copts