{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE TypeApplications, RankNTypes #-}
{-# LANGUAGE MonoLocalBinds, GADTs, TypeFamilies #-}
{-# LANGUAGE DataKinds, PolyKinds #-}
{-# LANGUAGE KindSignatures, TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts, FlexibleInstances #-}
{-# LANGUAGE PatternSynonyms, ViewPatterns #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Pipeline.Compute (

	-- * CREATE

	createCs, C(..), CreateInfo(..),
	CreateInfoListToMiddle, FromMiddleList

	) where

import Foreign.Storable.PeekPoke
import Foreign.Storable.HeteroList
import Control.Exception
import Data.TypeLevel.Maybe qualified as TMaybe
import Data.TypeLevel.ParMaybe qualified as TPMaybe
import Data.TypeLevel.Tuple.Uncurry
import Data.TypeLevel.Tuple.MapIndex qualified as TMapIndex
import qualified Data.HeteroParList as HeteroParList
import Data.HeteroParList (pattern (:**))
import Data.Kind
import Data.Int

import Language.SpirV.ShaderKind

import Gpu.Vulkan.Pipeline.Enum

import qualified Gpu.Vulkan.AllocationCallbacks as AllocationCallbacks
import qualified Gpu.Vulkan.AllocationCallbacks.Type as AllocationCallbacks
import qualified Gpu.Vulkan.Device.Type as Device
import qualified Gpu.Vulkan.Pipeline.ShaderStage.Internal as ShaderStage
import qualified Gpu.Vulkan.DescriptorSetLayout.Type as DescriptorSetLayout
import qualified Gpu.Vulkan.PipelineLayout.Type as Layout
import qualified Gpu.Vulkan.PipelineCache.Type as Cache
import qualified Gpu.Vulkan.Pipeline.Compute.Middle as M


newtype C s (lyta ::
	(Type, [(Type, [DescriptorSetLayout.BindingType])], [Type])) = C M.C
	deriving Int -> C s lyta -> ShowS
[C s lyta] -> ShowS
C s lyta -> String
(Int -> C s lyta -> ShowS)
-> (C s lyta -> String) -> ([C s lyta] -> ShowS) -> Show (C s lyta)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
Int -> C s lyta -> ShowS
forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
[C s lyta] -> ShowS
forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
C s lyta -> String
$cshowsPrec :: forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
Int -> C s lyta -> ShowS
showsPrec :: Int -> C s lyta -> ShowS
$cshow :: forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
C s lyta -> String
show :: C s lyta -> String
$cshowList :: forall k (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
[C s lyta] -> ShowS
showList :: [C s lyta] -> ShowS
Show

data CreateInfo mn ssta lyta bpha = CreateInfo {
	forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> M mn
createInfoNext :: TMaybe.M mn,
	forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> CreateFlags
createInfoFlags :: CreateFlags,
	forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U5 CreateInfo ssta
createInfoStage :: U5 ShaderStage.CreateInfo ssta,
	forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U3 P lyta
createInfoLayout :: U3 Layout.P lyta,
	forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> Maybe (Either (U2 C bpha) Int32)
createInfoBasePipelineHandleOrIndex ::
		Maybe (Either (U2 C bpha) Int32) }

createInfoToMiddle ::
	(WithPoked (TMaybe.M n'), AllocationCallbacks.ToMiddle mscc) =>
	Device.D ds ->
	CreateInfo n '(n1, n', 'GlslComputeShader, mscc, vs) lyta bpha ->
	IO (M.CreateInfo n n1 vs)
createInfoToMiddle :: forall {k} (n' :: Maybe (*)) (mscc :: Maybe (*, *)) ds
       (n :: Maybe (*)) (n1 :: Maybe (*)) (vs :: [*])
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
(WithPoked (M n'), ToMiddle mscc) =>
D ds
-> CreateInfo n '(n1, n', 'GlslComputeShader, mscc, vs) lyta bpha
-> IO (CreateInfo n n1 vs)
createInfoToMiddle D ds
dvc CreateInfo {
	createInfoNext :: forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> M mn
createInfoNext = M n
mnxt,
	createInfoFlags :: forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> CreateFlags
createInfoFlags = CreateFlags
flgs,
	createInfoStage :: forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U5 CreateInfo ssta
createInfoStage = U5 CreateInfo s1 s2 s3 s4 s5
stg,
	createInfoLayout :: forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U3 P lyta
createInfoLayout = U3 (Layout.P P
lyt),
	createInfoBasePipelineHandleOrIndex :: forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> Maybe (Either (U2 C bpha) Int32)
createInfoBasePipelineHandleOrIndex = Maybe (Either (U2 C bpha) Int32)
mbphi } = do
	stg' <- D ds -> CreateInfo s1 s2 s3 s4 s5 -> IO (CreateInfo s1 s3 s5)
forall (mnsm :: Maybe (*)) (mac :: Maybe (*, *)) ds
       (n :: Maybe (*)) (sknd :: ShaderKind) (vs :: [*]).
(WithPoked (M mnsm), ToMiddle mac) =>
D ds -> CreateInfo n mnsm sknd mac vs -> IO (CreateInfo n sknd vs)
ShaderStage.createInfoToMiddle D ds
dvc CreateInfo s1 s2 s3 s4 s5
stg
	let	(bph, bpi) = case mbphi of
			Maybe (Either (U2 C bpha) Int32)
Nothing -> (Maybe C
forall a. Maybe a
Nothing, Maybe Int32
forall a. Maybe a
Nothing)
			Just (Left (U2 (C C
h))) -> (C -> Maybe C
forall a. a -> Maybe a
Just C
h, Maybe Int32
forall a. Maybe a
Nothing)
			Just (Right Int32
i) -> (Maybe C
forall a. Maybe a
Nothing, Int32 -> Maybe Int32
forall a. a -> Maybe a
Just Int32
i)
	pure M.CreateInfo {
		M.createInfoNext = mnxt,
		M.createInfoFlags = flgs,
		M.createInfoStage = stg',
		M.createInfoLayout = lyt,
		M.createInfoBasePipelineHandle = bph,
		M.createInfoBasePipelineIndex = bpi }

class (	M.CreateInfoListToCore (MiddleArgs as),
	DestroyCreateInfoMiddleList (MiddleArgs as) as ) =>
	CreateInfoListToMiddle as where
	type MiddleArgs as :: [(Maybe Type, Maybe Type, [Type])]
	createInfoListToMiddle ::
		Device.D sd -> HeteroParList.PL (U4 CreateInfo) as ->
		IO (HeteroParList.PL (U3 M.CreateInfo) (MiddleArgs as))

instance CreateInfoListToMiddle '[] where
	type MiddleArgs '[] = '[]
	createInfoListToMiddle :: forall sd.
D sd
-> PL (U4 CreateInfo) '[]
-> IO (PL (U3 CreateInfo) (MiddleArgs '[]))
createInfoListToMiddle D sd
_ PL (U4 CreateInfo) '[]
HeteroParList.Nil = PL (U3 CreateInfo) '[] -> IO (PL (U3 CreateInfo) '[])
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure PL (U3 CreateInfo) '[]
forall {k} (t :: k -> *). PL t '[]
HeteroParList.Nil

instance (
	WithPoked (TMaybe.M n'), CreateInfoListToMiddle as,
	AllocationCallbacks.ToMiddle mscc,

	WithPoked (TMaybe.M n), WithPoked (TMaybe.M n1), PokableList vs
	) =>
	CreateInfoListToMiddle (
		'(n, '(n1, n', 'GlslComputeShader, mscc, vs), lyta, bpha
		) ': as) where
	type MiddleArgs (
		'(n, '(n1, n', 'GlslComputeShader, mscc, vs), lyta, bpha) ':
		as ) = '(n, n1, vs) ': MiddleArgs as
	createInfoListToMiddle :: forall sd.
D sd
-> PL
     (U4 CreateInfo)
     ('(n, '(n1, n', 'GlslComputeShader, mscc, vs), lyta, bpha) : as)
-> IO
     (PL
        (U3 CreateInfo)
        (MiddleArgs
           ('(n, '(n1, n', 'GlslComputeShader, mscc, vs), lyta, bpha) : as)))
createInfoListToMiddle D sd
dvc (U4 CreateInfo s1 s2 s3 s4
ci :** PL (U4 CreateInfo) ss1
cis) = U3 CreateInfo '(s1, n1, vs)
-> PL (U3 CreateInfo) (MiddleArgs as)
-> PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as)
forall {k} (t :: k -> *) (s :: k) (ss1 :: [k]).
t s -> PL t ss1 -> PL t (s : ss1)
(:**)
		(U3 CreateInfo '(s1, n1, vs)
 -> PL (U3 CreateInfo) (MiddleArgs as)
 -> PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as))
-> IO (U3 CreateInfo '(s1, n1, vs))
-> IO
     (PL (U3 CreateInfo) (MiddleArgs as)
      -> PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CreateInfo s1 n1 vs -> U3 CreateInfo '(s1, n1, vs)
forall {k} {k1} {k2} (t :: k -> k1 -> k2 -> *) (s1 :: k) (s2 :: k1)
       (s3 :: k2).
t s1 s2 s3 -> U3 t '(s1, s2, s3)
U3 (CreateInfo s1 n1 vs -> U3 CreateInfo '(s1, n1, vs))
-> IO (CreateInfo s1 n1 vs) -> IO (U3 CreateInfo '(s1, n1, vs))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> D sd
-> CreateInfo s1 '(n1, n', 'GlslComputeShader, mscc, vs) s3 s4
-> IO (CreateInfo s1 n1 vs)
forall {k} (n' :: Maybe (*)) (mscc :: Maybe (*, *)) ds
       (n :: Maybe (*)) (n1 :: Maybe (*)) (vs :: [*])
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
(WithPoked (M n'), ToMiddle mscc) =>
D ds
-> CreateInfo n '(n1, n', 'GlslComputeShader, mscc, vs) lyta bpha
-> IO (CreateInfo n n1 vs)
createInfoToMiddle D sd
dvc CreateInfo s1 s2 s3 s4
CreateInfo s1 '(n1, n', 'GlslComputeShader, mscc, vs) s3 s4
ci)
		IO
  (PL (U3 CreateInfo) (MiddleArgs as)
   -> PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as))
-> IO (PL (U3 CreateInfo) (MiddleArgs as))
-> IO (PL (U3 CreateInfo) ('(s1, n1, vs) : MiddleArgs as))
forall a b. IO (a -> b) -> IO a -> IO b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> D sd
-> PL (U4 CreateInfo) ss1
-> IO (PL (U3 CreateInfo) (MiddleArgs ss1))
forall sd.
D sd
-> PL (U4 CreateInfo) ss1
-> IO (PL (U3 CreateInfo) (MiddleArgs ss1))
forall {k}
       (as :: [(Maybe (*),
                (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]),
                (*, [(*, [BindingType])], [*]),
                (k, (*, [(*, [BindingType])], [*])))])
       sd.
CreateInfoListToMiddle as =>
D sd
-> PL (U4 CreateInfo) as -> IO (PL (U3 CreateInfo) (MiddleArgs as))
createInfoListToMiddle D sd
dvc PL (U4 CreateInfo) ss1
cis

destroyCreateInfoMiddle ::
	AllocationCallbacks.ToMiddle mscc =>
	Device.D sd -> M.CreateInfo n n1 vs ->
	CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha -> IO ()
destroyCreateInfoMiddle :: forall {k} (mscc :: Maybe (*, *)) sd (n :: Maybe (*))
       (n1 :: Maybe (*)) (vs :: [*]) (n2 :: Maybe (*))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
ToMiddle mscc =>
D sd
-> CreateInfo n n1 vs
-> CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
-> IO ()
destroyCreateInfoMiddle D sd
dvc CreateInfo n n1 vs
mci CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
ci = D sd
-> CreateInfo n1 'GlslComputeShader vs -> M (U2 A) mscc -> IO ()
forall (mac :: Maybe (*, *)) sd (n :: Maybe (*))
       (sknd :: ShaderKind) (vs :: [*]).
ToMiddle mac =>
D sd -> CreateInfo n sknd vs -> M (U2 A) mac -> IO ()
ShaderStage.destroyShaderModule D sd
dvc
	(CreateInfo n n1 vs -> CreateInfo n1 'GlslComputeShader vs
forall (mn :: Maybe (*)) (ss :: Maybe (*)) (sivs :: [*]).
CreateInfo mn ss sivs -> CreateInfo ss 'GlslComputeShader sivs
M.createInfoStage CreateInfo n n1 vs
mci) ((\(U5 CreateInfo s1 s2 s3 s4 s5
s) -> (CreateInfo n2 'GlslComputeShader, M (U2 A) mscc) -> M (U2 A) mscc
forall a b. (a, b) -> b
snd ((CreateInfo n2 'GlslComputeShader, M (U2 A) mscc)
 -> M (U2 A) mscc)
-> (CreateInfo n2 'GlslComputeShader, M (U2 A) mscc)
-> M (U2 A) mscc
forall a b. (a -> b) -> a -> b
$ CreateInfo n1 n2 'GlslComputeShader mscc vs
-> (CreateInfo n2 'GlslComputeShader, M (U2 A) mscc)
forall (mn :: Maybe (*)) (mnsm :: Maybe (*)) (sknd :: ShaderKind)
       (mac :: Maybe (*, *)) (vs :: [*]).
CreateInfo mn mnsm sknd mac vs
-> (CreateInfo mnsm sknd, M (U2 A) mac)
ShaderStage.createInfoModule CreateInfo n1 n2 'GlslComputeShader mscc vs
CreateInfo s1 s2 s3 s4 s5
s) (U5 CreateInfo '(n1, n2, 'GlslComputeShader, mscc, vs)
 -> M (U2 A) mscc)
-> U5 CreateInfo '(n1, n2, 'GlslComputeShader, mscc, vs)
-> M (U2 A) mscc
forall a b. (a -> b) -> a -> b
$ CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
-> U5 CreateInfo '(n1, n2, 'GlslComputeShader, mscc, vs)
forall {k} (mn :: Maybe (*))
       (ssta :: (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
CreateInfo mn ssta lyta bpha -> U5 CreateInfo ssta
createInfoStage CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
ci)

class DestroyCreateInfoMiddleList vss vss' where
	destroyCreateInfoMiddleList ::
		Device.D sd ->
		HeteroParList.PL (U3 M.CreateInfo) vss ->
		HeteroParList.PL (U4 CreateInfo) vss' -> IO ()

instance DestroyCreateInfoMiddleList '[] '[] where
	destroyCreateInfoMiddleList :: forall sd.
D sd -> PL (U3 CreateInfo) '[] -> PL (U4 CreateInfo) '[] -> IO ()
destroyCreateInfoMiddleList D sd
_ PL (U3 CreateInfo) '[]
HeteroParList.Nil PL (U4 CreateInfo) '[]
HeteroParList.Nil = () -> IO ()
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

instance (
	DestroyCreateInfoMiddleList vss vss',
	AllocationCallbacks.ToMiddle mscc ) =>
	DestroyCreateInfoMiddleList
		('(n, n1, vs) ': vss)
		('(n, '(n1, n2, 'GlslComputeShader, mscc, vs), lyta, bpha) ': vss') where
	destroyCreateInfoMiddleList :: forall sd.
D sd
-> PL (U3 CreateInfo) ('(n, n1, vs) : vss)
-> PL
     (U4 CreateInfo)
     ('(n, '(n1, n2, 'GlslComputeShader, mscc, vs), lyta, bpha) : vss')
-> IO ()
destroyCreateInfoMiddleList D sd
dvc
		(U3 CreateInfo s1 s2 s3
mci :** PL (U3 CreateInfo) ss1
mcis) (U4 CreateInfo s1 s2 s3 s4
ci :** PL (U4 CreateInfo) ss1
cis) = do
		D sd
-> CreateInfo s1 s2 s3
-> CreateInfo s1 '(s2, n2, 'GlslComputeShader, mscc, s3) s3 s4
-> IO ()
forall {k} (mscc :: Maybe (*, *)) sd (n :: Maybe (*))
       (n1 :: Maybe (*)) (vs :: [*]) (n2 :: Maybe (*))
       (lyta :: (*, [(*, [BindingType])], [*]))
       (bpha :: (k, (*, [(*, [BindingType])], [*]))).
ToMiddle mscc =>
D sd
-> CreateInfo n n1 vs
-> CreateInfo n '(n1, n2, 'GlslComputeShader, mscc, vs) lyta bpha
-> IO ()
destroyCreateInfoMiddle D sd
dvc CreateInfo s1 s2 s3
mci CreateInfo s1 '(s2, n2, 'GlslComputeShader, mscc, s3) s3 s4
CreateInfo s1 s2 s3 s4
ci
		D sd -> PL (U3 CreateInfo) ss1 -> PL (U4 CreateInfo) ss1 -> IO ()
forall sd.
D sd -> PL (U3 CreateInfo) ss1 -> PL (U4 CreateInfo) ss1 -> IO ()
forall {k} (vss :: [(Maybe (*), Maybe (*), [*])])
       (vss' :: [(Maybe (*),
                  (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]),
                  (*, [(*, [BindingType])], [*]),
                  (k, (*, [(*, [BindingType])], [*])))])
       sd.
DestroyCreateInfoMiddleList vss vss' =>
D sd -> PL (U3 CreateInfo) vss -> PL (U4 CreateInfo) vss' -> IO ()
destroyCreateInfoMiddleList D sd
dvc PL (U3 CreateInfo) ss1
mcis PL (U4 CreateInfo) ss1
cis

createCs :: (
	CreateInfoListToMiddle cias, AllocationCallbacks.ToMiddle mac,
	FromMiddleList (TMapIndex.M2_4 cias) ) =>
	Device.D sd -> Maybe (Cache.P spc) -> HeteroParList.PL (U4 CreateInfo) cias ->
	TPMaybe.M (U2 AllocationCallbacks.A) mac ->
	(forall s . HeteroParList.PL (C s) (TMapIndex.M2_4 cias) -> IO a) -> IO a
createCs :: forall {k} {k}
       (cias :: [(Maybe (*),
                  (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]),
                  (*, [(*, [BindingType])], [*]),
                  (k, (*, [(*, [BindingType])], [*])))])
       (mac :: Maybe (*, *)) sd spc a.
(CreateInfoListToMiddle cias, ToMiddle mac,
 FromMiddleList (M2_4 cias)) =>
D sd
-> Maybe (P spc)
-> PL (U4 CreateInfo) cias
-> M (U2 A) mac
-> (forall (s :: k). PL (C s) (M2_4 cias) -> IO a)
-> IO a
createCs dvc :: D sd
dvc@(Device.D D
mdvc) Maybe (P spc)
mcch PL (U4 CreateInfo) cias
cis
	(M (U2 A) mac -> M A (Snd mac)
forall (msa :: Maybe (*, *)).
ToMiddle msa =>
M (U2 A) msa -> M A (Snd msa)
AllocationCallbacks.toMiddle -> M A (Snd mac)
mac) forall (s :: k). PL (C s) (M2_4 cias) -> IO a
f = do
	cis' <- D sd
-> PL (U4 CreateInfo) cias
-> IO (PL (U3 CreateInfo) (MiddleArgs cias))
forall sd.
D sd
-> PL (U4 CreateInfo) cias
-> IO (PL (U3 CreateInfo) (MiddleArgs cias))
forall {k}
       (as :: [(Maybe (*),
                (Maybe (*), Maybe (*), ShaderKind, Maybe (*, *), [*]),
                (*, [(*, [BindingType])], [*]),
                (k, (*, [(*, [BindingType])], [*])))])
       sd.
CreateInfoListToMiddle as =>
D sd
-> PL (U4 CreateInfo) as -> IO (PL (U3 CreateInfo) (MiddleArgs as))
createInfoListToMiddle D sd
dvc PL (U4 CreateInfo) cias
cis
	let	mcch' = (\(Cache.P P
c) -> P
c) (P spc -> P) -> Maybe (P spc) -> Maybe P
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe (P spc)
mcch
	bracket
		(M.createCs mdvc mcch' cis' mac
			<* destroyCreateInfoMiddleList dvc cis' cis)
		(mapM_ \C
c -> D -> C -> M A (Snd mac) -> IO ()
forall (md :: Maybe (*)). D -> C -> M A md -> IO ()
M.destroy D
mdvc C
c M A (Snd mac)
mac)
		(f . fromMiddleList)

class FromMiddleList ss where
	fromMiddleList :: [M.C] -> HeteroParList.PL (C sc) ss

instance FromMiddleList '[] where fromMiddleList :: forall {k} (sc :: k). [C] -> PL (C sc) '[]
fromMiddleList [] = PL (C sc) '[]
forall {k} (t :: k -> *). PL t '[]
HeteroParList.Nil

instance FromMiddleList ss => FromMiddleList (s ': ss) where
	fromMiddleList :: forall {k} (sc :: k). [C] -> PL (C sc) (s : ss)
fromMiddleList (C
c : [C]
cs) = C -> C sc s
forall {k} (s :: k) (lyta :: (*, [(*, [BindingType])], [*])).
C -> C s lyta
C C
c C sc s -> PL (C sc) ss -> PL (C sc) (s : ss)
forall {k} (t :: k -> *) (s :: k) (ss1 :: [k]).
t s -> PL t ss1 -> PL t (s : ss1)
:** [C] -> PL (C sc) ss
forall (ss :: [(*, [(*, [BindingType])], [*])]) {k} (sc :: k).
FromMiddleList ss =>
[C] -> PL (C sc) ss
forall {k} (sc :: k). [C] -> PL (C sc) ss
fromMiddleList [C]
cs