{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE FlexibleContexts, UndecidableInstances #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Buffer.Type where

import GHC.TypeLits
import Data.Kind
import Data.HeteroParList qualified as HeteroParList

import Gpu.Vulkan.Object qualified as VObj
import Gpu.Vulkan.Buffer.Middle qualified as M

data B s (nm :: Symbol) (objs :: [VObj.O]) =
	B (HeteroParList.PL VObj.Length objs) M.B

deriving instance Show (HeteroParList.PL VObj.Length objs) =>
	Show (B s nm objs)

deriving instance Eq (HeteroParList.PL VObj.Length objs) =>
	Eq (B s nm objs)

data Binded (sm :: Type) (sb :: Type) (nm :: Symbol) (objs :: [VObj.O]) =
	Binded (HeteroParList.PL VObj.Length objs) M.B

lengthBinded :: Binded sm sb nm objs -> HeteroParList.PL VObj.Length objs
lengthBinded :: forall sm sb (nm :: Symbol) (objs :: [O]).
Binded sm sb nm objs -> PL Length objs
lengthBinded (Binded PL Length objs
ln B
_) = PL Length objs
ln

deriving instance Show (HeteroParList.PL VObj.Length objs) =>
	Show (Binded sm sb nm objs)

deriving instance Eq (HeteroParList.PL VObj.Length objs) =>
	Eq (Binded sm sb nm objs)