{-# LANGUAGE ScopedTypeVariables, RankNTypes, TypeApplications #-}
{-# LANGUAGE KindSignatures, DataKinds, ConstraintKinds, TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses, AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Gpu.Vulkan.Pipeline.VertexInputState.Data.Type.TypeValMap (MapTypeVal2(..), MapTypeValMaybe2(..)) where

import Data.Kind

class MapTypeVal2 c (as :: [Type]) where
	mapTypeVal2 :: (forall a . c a => a -> b) -> [b]

instance MapTypeVal2 c '[] where mapTypeVal2 :: forall b. (forall a. c a => a -> b) -> [b]
mapTypeVal2 forall a. c a => a -> b
_ = []

instance (c a, MapTypeVal2 c as) => MapTypeVal2 c (a ': as) where
	mapTypeVal2 :: forall b. (forall a. c a => a -> b) -> [b]
mapTypeVal2 forall a. c a => a -> b
x = a -> b
forall a. c a => a -> b
x (a
forall a. HasCallStack => a
undefined :: a) b -> [b] -> [b]
forall a. a -> [a] -> [a]
: forall (c :: * -> Constraint) (as :: [*]) b.
MapTypeVal2 c as =>
(forall a. c a => a -> b) -> [b]
mapTypeVal2 @c @as a -> b
forall a. c a => a -> b
x

class MapTypeValMaybe2 c (mas :: Maybe [Type]) where
	mapTypeValMaybe2 :: (forall a . c a => a -> b) -> Maybe [b]

instance MapTypeValMaybe2 c 'Nothing where mapTypeValMaybe2 :: forall b. (forall a. c a => a -> b) -> Maybe [b]
mapTypeValMaybe2 forall a. c a => a -> b
_ = Maybe [b]
forall a. Maybe a
Nothing

instance MapTypeVal2 c as => MapTypeValMaybe2 c ('Just as) where
	mapTypeValMaybe2 :: forall b. (forall a. c a => a -> b) -> Maybe [b]
mapTypeValMaybe2 forall a. c a => a -> b
x = [b] -> Maybe [b]
forall a. a -> Maybe a
Just ([b] -> Maybe [b]) -> [b] -> Maybe [b]
forall a b. (a -> b) -> a -> b
$ forall (c :: * -> Constraint) (as :: [*]) b.
MapTypeVal2 c as =>
(forall a. c a => a -> b) -> [b]
mapTypeVal2 @c @as a -> b
forall a. c a => a -> b
x