{-# LANGUAGE TypeFamilies, FlexibleContexts, GADTs, TypeSynonymInstances, ScopedTypeVariables, FlexibleInstances, GeneralizedNewtypeDeriving, Arrows, MultiParamTypeClasses, AllowAmbiguousTypes #-}
module Graphics.GPipe.Internal.Uniform where
import Graphics.GPipe.Internal.Buffer
import Graphics.GPipe.Internal.Shader
import Graphics.GPipe.Internal.Compiler
import Graphics.GPipe.Internal.Expr
import Control.Arrow
import Control.Monad.Trans.Writer
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Class (lift)
import Control.Category hiding ((.))
import qualified Data.IntMap as Map
import Data.IntMap.Lazy (insert)
import Data.Word
import Graphics.GL.Core45
import Data.IORef
import Data.Int
import Linear.V4
import Linear.V3
import Linear.V2
import Linear.V1
import Linear.V0
import Linear.Plucker (Plucker(..))
import Linear.Quaternion (Quaternion(..))
class BufferFormat a => UniformInput a where
type UniformFormat a x
toUniform :: ToUniform x a (UniformFormat a x)
getUniform :: forall os s b x. (UniformInput b) => (s -> (Buffer os (Uniform b), Int)) -> Shader os s (UniformFormat b x)
getUniform :: (s -> (Buffer os (Uniform b), Int))
-> Shader os s (UniformFormat b x)
getUniform s -> (Buffer os (Uniform b), Int)
sf = ShaderM s (UniformFormat b x) -> Shader os s (UniformFormat b x)
forall os s a. ShaderM s a -> Shader os s a
Shader (ShaderM s (UniformFormat b x) -> Shader os s (UniformFormat b x))
-> ShaderM s (UniformFormat b x) -> Shader os s (UniformFormat b x)
forall a b. (a -> b) -> a -> b
$ do
Int
uniAl <- ShaderM s Int
forall s. ShaderM s Int
askUniformAlignment
Int
blockId <- ShaderM s Int
forall s. ShaderM s Int
getNewName
let (UniformFormat b x
u, OffsetToSType
offToStype) = (Int -> ExprM String) -> (UniformFormat b x, OffsetToSType)
shaderGen (GlobDeclM () -> Int -> Int -> ExprM String
useUniform (OffsetToSType -> GlobDeclM ()
buildUDecl OffsetToSType
offToStype) Int
blockId)
sampleBuffer :: Buffer os (Uniform b)
sampleBuffer = BufferName -> Int -> Int -> Buffer os (Uniform b)
forall os b.
BufferFormat b =>
BufferName -> Int -> Int -> Buffer os b
makeBuffer BufferName
forall a. HasCallStack => a
undefined Int
forall a. HasCallStack => a
undefined Int
uniAl :: Buffer os (Uniform b)
shaderGen :: (Int -> ExprM String) -> (UniformFormat b x, OffsetToSType)
shaderGen :: (Int -> ExprM String) -> (UniformFormat b x, OffsetToSType)
shaderGen = Reader (Int -> ExprM String) (UniformFormat b x, OffsetToSType)
-> (Int -> ExprM String) -> (UniformFormat b x, OffsetToSType)
forall r a. Reader r a -> r -> a
runReader (Reader (Int -> ExprM String) (UniformFormat b x, OffsetToSType)
-> (Int -> ExprM String) -> (UniformFormat b x, OffsetToSType))
-> Reader (Int -> ExprM String) (UniformFormat b x, OffsetToSType)
-> (Int -> ExprM String)
-> (UniformFormat b x, OffsetToSType)
forall a b. (a -> b) -> a -> b
$ WriterT
OffsetToSType (Reader (Int -> ExprM String)) (UniformFormat b x)
-> Reader (Int -> ExprM String) (UniformFormat b x, OffsetToSType)
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
runWriterT (WriterT
OffsetToSType (Reader (Int -> ExprM String)) (UniformFormat b x)
-> Reader (Int -> ExprM String) (UniformFormat b x, OffsetToSType))
-> WriterT
OffsetToSType (Reader (Int -> ExprM String)) (UniformFormat b x)
-> Reader (Int -> ExprM String) (UniformFormat b x, OffsetToSType)
forall a b. (a -> b) -> a -> b
$ b
-> WriterT
OffsetToSType (Reader (Int -> ExprM String)) (UniformFormat b x)
shaderGenF (b
-> WriterT
OffsetToSType (Reader (Int -> ExprM String)) (UniformFormat b x))
-> b
-> WriterT
OffsetToSType (Reader (Int -> ExprM String)) (UniformFormat b x)
forall a b. (a -> b) -> a -> b
$ Uniform b -> b
forall a. Uniform a -> a
fromBUnifom (Uniform b -> b) -> Uniform b -> b
forall a b. (a -> b) -> a -> b
$ Buffer os (Uniform b) -> BInput -> Uniform b
forall os b. Buffer os b -> BInput -> b
bufBElement Buffer os (Uniform b)
sampleBuffer (BInput -> Uniform b) -> BInput -> Uniform b
forall a b. (a -> b) -> a -> b
$ Int -> Int -> BInput
BInput Int
0 Int
0
Int -> (s -> Int -> IO ()) -> ShaderM s ()
doForUniform Int
blockId ((s -> Int -> IO ()) -> ShaderM s ())
-> (s -> Int -> IO ()) -> ShaderM s ()
forall a b. (a -> b) -> a -> b
$ \s
s Int
bind ->
let (Buffer os (Uniform b)
ub, Int
i) = s -> (Buffer os (Uniform b), Int)
sf s
s
in if Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 Bool -> Bool -> Bool
|| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Buffer os (Uniform b) -> Int
forall os b. Buffer os b -> Int
bufferLength Buffer os (Uniform b)
ub
then String -> IO ()
forall a. HasCallStack => String -> a
error String
"toUniformBlock, uniform buffer offset out of bounds"
else do
GLuint
bname <- BufferName -> IO GLuint
forall a. IORef a -> IO a
readIORef (BufferName -> IO GLuint) -> BufferName -> IO GLuint
forall a b. (a -> b) -> a -> b
$ Buffer os (Uniform b) -> BufferName
forall os b. Buffer os b -> BufferName
bufName Buffer os (Uniform b)
ub
GLuint -> GLuint -> GLuint -> GLintptr -> GLintptr -> IO ()
forall (m :: * -> *).
MonadIO m =>
GLuint -> GLuint -> GLuint -> GLintptr -> GLintptr -> m ()
glBindBufferRange GLuint
forall a. (Eq a, Num a) => a
GL_UNIFORM_BUFFER (Int -> GLuint
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
bind) GLuint
bname (Int -> GLintptr
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> GLintptr) -> Int -> GLintptr
forall a b. (a -> b) -> a -> b
$ Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
* Buffer os (Uniform b) -> Int
forall os b. Buffer os b -> Int
bufElementSize Buffer os (Uniform b)
ub) (Int -> GLintptr
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> GLintptr) -> Int -> GLintptr
forall a b. (a -> b) -> a -> b
$ Buffer os (Uniform b) -> Int
forall os b. Buffer os b -> Int
bufElementSize Buffer os (Uniform b)
ub)
UniformFormat b x -> ShaderM s (UniformFormat b x)
forall (m :: * -> *) a. Monad m => a -> m a
return UniformFormat b x
u
where
ToUniform (Kleisli b
-> WriterT
OffsetToSType (Reader (Int -> ExprM String)) (UniformFormat b x)
shaderGenF) = ToUniform x b (UniformFormat b x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform :: ToUniform x b (UniformFormat b x)
fromBUnifom :: Uniform a -> a
fromBUnifom (Uniform a
b) = a
b
doForUniform :: Int -> (s -> Binding -> IO()) -> ShaderM s ()
doForUniform :: Int -> (s -> Int -> IO ()) -> ShaderM s ()
doForUniform Int
n s -> Int -> IO ()
io = (RenderIOState s -> RenderIOState s) -> ShaderM s ()
forall s. (RenderIOState s -> RenderIOState s) -> ShaderM s ()
modifyRenderIO (\RenderIOState s
s -> RenderIOState s
s { uniformNameToRenderIO :: IntMap (s -> Int -> IO ())
uniformNameToRenderIO = Int
-> (s -> Int -> IO ())
-> IntMap (s -> Int -> IO ())
-> IntMap (s -> Int -> IO ())
forall a. Int -> a -> IntMap a -> IntMap a
insert Int
n s -> Int -> IO ()
io (RenderIOState s -> IntMap (s -> Int -> IO ())
forall s. RenderIOState s -> IntMap (s -> Int -> IO ())
uniformNameToRenderIO RenderIOState s
s) } )
buildUDecl :: OffsetToSType -> GlobDeclM ()
buildUDecl :: OffsetToSType -> GlobDeclM ()
buildUDecl = Int -> [(Int, SType)] -> GlobDeclM ()
buildUDecl' Int
0 ([(Int, SType)] -> GlobDeclM ())
-> (OffsetToSType -> [(Int, SType)])
-> OffsetToSType
-> GlobDeclM ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OffsetToSType -> [(Int, SType)]
forall a. IntMap a -> [(Int, a)]
Map.toAscList where
buildUDecl' :: Int -> [(Int, SType)] -> GlobDeclM ()
buildUDecl' Int
p xxs :: [(Int, SType)]
xxs@((Int
off, SType
stype):[(Int, SType)]
xs)
| Int
off Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
p = do
String -> GlobDeclM ()
tellGlobal (String -> GlobDeclM ()) -> String -> GlobDeclM ()
forall a b. (a -> b) -> a -> b
$ SType -> String
stypeName SType
stype
String -> GlobDeclM ()
tellGlobal String
" u"
String -> GlobDeclM ()
tellGlobalLn (String -> GlobDeclM ()) -> String -> GlobDeclM ()
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
off
Int -> [(Int, SType)] -> GlobDeclM ()
buildUDecl' (Int
p Int -> Int -> Int
forall a. Num a => a -> a -> a
+ SType -> Int
stypeSize SType
stype) [(Int, SType)]
xs
| Int
off Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
p = do
String -> GlobDeclM ()
tellGlobal String
"float pad"
String -> GlobDeclM ()
tellGlobalLn (String -> GlobDeclM ()) -> String -> GlobDeclM ()
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
p
Int -> [(Int, SType)] -> GlobDeclM ()
buildUDecl' (Int
p Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
4) [(Int, SType)]
xxs
| Bool
otherwise =
String -> GlobDeclM ()
forall a. HasCallStack => String -> a
error String
"buildUDecl: Expected all offsets to be multiple of 4"
buildUDecl' Int
_ [] = () -> GlobDeclM ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
type OffsetToSType = Map.IntMap SType
newtype ToUniform x a b = ToUniform (Kleisli (WriterT OffsetToSType (Reader (Int -> ExprM String))) a b) deriving (ToUniform x a a
ToUniform x b c -> ToUniform x a b -> ToUniform x a c
(forall a. ToUniform x a a)
-> (forall b c a.
ToUniform x b c -> ToUniform x a b -> ToUniform x a c)
-> Category (ToUniform x)
forall a. ToUniform x a a
forall x a. ToUniform x a a
forall b c a. ToUniform x b c -> ToUniform x a b -> ToUniform x a c
forall x b c a.
ToUniform x b c -> ToUniform x a b -> ToUniform x a c
forall k (cat :: k -> k -> *).
(forall (a :: k). cat a a)
-> (forall (b :: k) (c :: k) (a :: k).
cat b c -> cat a b -> cat a c)
-> Category cat
. :: ToUniform x b c -> ToUniform x a b -> ToUniform x a c
$c. :: forall x b c a.
ToUniform x b c -> ToUniform x a b -> ToUniform x a c
id :: ToUniform x a a
$cid :: forall x a. ToUniform x a a
Category, Category (ToUniform x)
Category (ToUniform x)
-> (forall b c. (b -> c) -> ToUniform x b c)
-> (forall b c d. ToUniform x b c -> ToUniform x (b, d) (c, d))
-> (forall b c d. ToUniform x b c -> ToUniform x (d, b) (d, c))
-> (forall b c b' c'.
ToUniform x b c
-> ToUniform x b' c' -> ToUniform x (b, b') (c, c'))
-> (forall b c c'.
ToUniform x b c -> ToUniform x b c' -> ToUniform x b (c, c'))
-> Arrow (ToUniform x)
ToUniform x b c -> ToUniform x (b, d) (c, d)
ToUniform x b c -> ToUniform x (d, b) (d, c)
ToUniform x b c -> ToUniform x b' c' -> ToUniform x (b, b') (c, c')
ToUniform x b c -> ToUniform x b c' -> ToUniform x b (c, c')
(b -> c) -> ToUniform x b c
forall x. Category (ToUniform x)
forall b c. (b -> c) -> ToUniform x b c
forall b c d. ToUniform x b c -> ToUniform x (b, d) (c, d)
forall b c d. ToUniform x b c -> ToUniform x (d, b) (d, c)
forall b c c'.
ToUniform x b c -> ToUniform x b c' -> ToUniform x b (c, c')
forall x b c. (b -> c) -> ToUniform x b c
forall x b c d. ToUniform x b c -> ToUniform x (b, d) (c, d)
forall x b c d. ToUniform x b c -> ToUniform x (d, b) (d, c)
forall x b c c'.
ToUniform x b c -> ToUniform x b c' -> ToUniform x b (c, c')
forall b c b' c'.
ToUniform x b c -> ToUniform x b' c' -> ToUniform x (b, b') (c, c')
forall x b c b' c'.
ToUniform x b c -> ToUniform x b' c' -> ToUniform x (b, b') (c, c')
forall (a :: * -> * -> *).
Category a
-> (forall b c. (b -> c) -> a b c)
-> (forall b c d. a b c -> a (b, d) (c, d))
-> (forall b c d. a b c -> a (d, b) (d, c))
-> (forall b c b' c'. a b c -> a b' c' -> a (b, b') (c, c'))
-> (forall b c c'. a b c -> a b c' -> a b (c, c'))
-> Arrow a
&&& :: ToUniform x b c -> ToUniform x b c' -> ToUniform x b (c, c')
$c&&& :: forall x b c c'.
ToUniform x b c -> ToUniform x b c' -> ToUniform x b (c, c')
*** :: ToUniform x b c -> ToUniform x b' c' -> ToUniform x (b, b') (c, c')
$c*** :: forall x b c b' c'.
ToUniform x b c -> ToUniform x b' c' -> ToUniform x (b, b') (c, c')
second :: ToUniform x b c -> ToUniform x (d, b) (d, c)
$csecond :: forall x b c d. ToUniform x b c -> ToUniform x (d, b) (d, c)
first :: ToUniform x b c -> ToUniform x (b, d) (c, d)
$cfirst :: forall x b c d. ToUniform x b c -> ToUniform x (b, d) (c, d)
arr :: (b -> c) -> ToUniform x b c
$carr :: forall x b c. (b -> c) -> ToUniform x b c
$cp1Arrow :: forall x. Category (ToUniform x)
Arrow)
makeUniform :: SType -> ToUniform x (B a) (S x b)
makeUniform :: SType -> ToUniform x (B a) (S x b)
makeUniform SType
styp = Kleisli
(WriterT OffsetToSType (Reader (Int -> ExprM String)))
(B a)
(S x b)
-> ToUniform x (B a) (S x b)
forall x a b.
Kleisli (WriterT OffsetToSType (Reader (Int -> ExprM String))) a b
-> ToUniform x a b
ToUniform (Kleisli
(WriterT OffsetToSType (Reader (Int -> ExprM String)))
(B a)
(S x b)
-> ToUniform x (B a) (S x b))
-> Kleisli
(WriterT OffsetToSType (Reader (Int -> ExprM String)))
(B a)
(S x b)
-> ToUniform x (B a) (S x b)
forall a b. (a -> b) -> a -> b
$ (B a
-> WriterT OffsetToSType (Reader (Int -> ExprM String)) (S x b))
-> Kleisli
(WriterT OffsetToSType (Reader (Int -> ExprM String)))
(B a)
(S x b)
forall (m :: * -> *) a b. (a -> m b) -> Kleisli m a b
Kleisli ((B a
-> WriterT OffsetToSType (Reader (Int -> ExprM String)) (S x b))
-> Kleisli
(WriterT OffsetToSType (Reader (Int -> ExprM String)))
(B a)
(S x b))
-> (B a
-> WriterT OffsetToSType (Reader (Int -> ExprM String)) (S x b))
-> Kleisli
(WriterT OffsetToSType (Reader (Int -> ExprM String)))
(B a)
(S x b)
forall a b. (a -> b) -> a -> b
$ \B a
bIn -> do
let offset :: Int
offset = B a -> Int
forall a. B a -> Int
bOffset B a
bIn
OffsetToSType
-> WriterT OffsetToSType (Reader (Int -> ExprM String)) ()
forall (m :: * -> *) w. Monad m => w -> WriterT w m ()
tell (OffsetToSType
-> WriterT OffsetToSType (Reader (Int -> ExprM String)) ())
-> OffsetToSType
-> WriterT OffsetToSType (Reader (Int -> ExprM String)) ()
forall a b. (a -> b) -> a -> b
$ Int -> SType -> OffsetToSType
forall a. Int -> a -> IntMap a
Map.singleton Int
offset SType
styp
Int -> ExprM String
useF <- ReaderT (Int -> ExprM String) Identity (Int -> ExprM String)
-> WriterT
OffsetToSType (Reader (Int -> ExprM String)) (Int -> ExprM String)
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift ReaderT (Int -> ExprM String) Identity (Int -> ExprM String)
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask
S x b
-> WriterT OffsetToSType (Reader (Int -> ExprM String)) (S x b)
forall (m :: * -> *) a. Monad m => a -> m a
return (S x b
-> WriterT OffsetToSType (Reader (Int -> ExprM String)) (S x b))
-> S x b
-> WriterT OffsetToSType (Reader (Int -> ExprM String)) (S x b)
forall a b. (a -> b) -> a -> b
$ ExprM String -> S x b
forall x a. ExprM String -> S x a
S (ExprM String -> S x b) -> ExprM String -> S x b
forall a b. (a -> b) -> a -> b
$ Int -> ExprM String
useF Int
offset
instance UniformInput (B Float) where
type UniformFormat (B Float) x = (S x Float)
toUniform :: ToUniform x (B Float) (UniformFormat (B Float) x)
toUniform = SType -> ToUniform x (B Float) (S x Float)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform SType
STypeFloat
instance UniformInput (B Int32) where
type UniformFormat (B Int32) x = (S x Int)
toUniform :: ToUniform x (B Int32) (UniformFormat (B Int32) x)
toUniform = SType -> ToUniform x (B Int32) (S x Int)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform SType
STypeInt
instance UniformInput (B Word32) where
type UniformFormat (B Word32) x = (S x Word)
toUniform :: ToUniform x (B GLuint) (UniformFormat (B GLuint) x)
toUniform = SType -> ToUniform x (B GLuint) (S x Word)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform SType
STypeUInt
instance UniformInput (B2 Float) where
type UniformFormat (B2 Float) x = V2 (S x Float)
toUniform :: ToUniform x (B2 Float) (UniformFormat (B2 Float) x)
toUniform = (B2 Float -> B Float) -> ToUniform x (B2 Float) (B Float)
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr B2 Float -> B Float
forall a. B2 a -> B a
unB2 ToUniform x (B2 Float) (B Float)
-> ToUniform x (B Float) (V2 (S x Float))
-> ToUniform x (B2 Float) (V2 (S x Float))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> SType -> ToUniform x (B Float) (S x Float)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform (Int -> SType
STypeVec Int
2) ToUniform x (B Float) (S x Float)
-> ToUniform x (S x Float) (V2 (S x Float))
-> ToUniform x (B Float) (V2 (S x Float))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (S x Float -> V2 (S x Float))
-> ToUniform x (S x Float) (V2 (S x Float))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr S x Float -> V2 (S x Float)
forall c a. S c a -> V2 (S c a)
vec2S''
instance UniformInput (B2 Int32) where
type UniformFormat (B2 Int32) x = V2 (S x Int)
toUniform :: ToUniform x (B2 Int32) (UniformFormat (B2 Int32) x)
toUniform = (B2 Int32 -> B Int32) -> ToUniform x (B2 Int32) (B Int32)
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr B2 Int32 -> B Int32
forall a. B2 a -> B a
unB2 ToUniform x (B2 Int32) (B Int32)
-> ToUniform x (B Int32) (V2 (S x Int))
-> ToUniform x (B2 Int32) (V2 (S x Int))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> SType -> ToUniform x (B Int32) (S x Int)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform (Int -> SType
STypeIVec Int
2) ToUniform x (B Int32) (S x Int)
-> ToUniform x (S x Int) (V2 (S x Int))
-> ToUniform x (B Int32) (V2 (S x Int))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (S x Int -> V2 (S x Int)) -> ToUniform x (S x Int) (V2 (S x Int))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr S x Int -> V2 (S x Int)
forall c a. S c a -> V2 (S c a)
vec2S''
instance UniformInput (B2 Word32) where
type UniformFormat (B2 Word32) x = V2 (S x Word)
toUniform :: ToUniform x (B2 GLuint) (UniformFormat (B2 GLuint) x)
toUniform = (B2 GLuint -> B GLuint) -> ToUniform x (B2 GLuint) (B GLuint)
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr B2 GLuint -> B GLuint
forall a. B2 a -> B a
unB2 ToUniform x (B2 GLuint) (B GLuint)
-> ToUniform x (B GLuint) (V2 (S x Word))
-> ToUniform x (B2 GLuint) (V2 (S x Word))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> SType -> ToUniform x (B GLuint) (S x Word)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform (Int -> SType
STypeVec Int
2) ToUniform x (B GLuint) (S x Word)
-> ToUniform x (S x Word) (V2 (S x Word))
-> ToUniform x (B GLuint) (V2 (S x Word))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (S x Word -> V2 (S x Word))
-> ToUniform x (S x Word) (V2 (S x Word))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr S x Word -> V2 (S x Word)
forall c a. S c a -> V2 (S c a)
vec2S''
instance UniformInput (B3 Float) where
type UniformFormat (B3 Float) x = V3 (S x Float)
toUniform :: ToUniform x (B3 Float) (UniformFormat (B3 Float) x)
toUniform = (B3 Float -> B Float) -> ToUniform x (B3 Float) (B Float)
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr B3 Float -> B Float
forall a. B3 a -> B a
unB3 ToUniform x (B3 Float) (B Float)
-> ToUniform x (B Float) (V3 (S x Float))
-> ToUniform x (B3 Float) (V3 (S x Float))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> SType -> ToUniform x (B Float) (S x Float)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform (Int -> SType
STypeVec Int
3) ToUniform x (B Float) (S x Float)
-> ToUniform x (S x Float) (V3 (S x Float))
-> ToUniform x (B Float) (V3 (S x Float))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (S x Float -> V3 (S x Float))
-> ToUniform x (S x Float) (V3 (S x Float))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr S x Float -> V3 (S x Float)
forall c a. S c a -> V3 (S c a)
vec3S''
instance UniformInput (B3 Int32) where
type UniformFormat (B3 Int32) x = V3 (S x Int)
toUniform :: ToUniform x (B3 Int32) (UniformFormat (B3 Int32) x)
toUniform = (B3 Int32 -> B Int32) -> ToUniform x (B3 Int32) (B Int32)
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr B3 Int32 -> B Int32
forall a. B3 a -> B a
unB3 ToUniform x (B3 Int32) (B Int32)
-> ToUniform x (B Int32) (V3 (S x Int))
-> ToUniform x (B3 Int32) (V3 (S x Int))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> SType -> ToUniform x (B Int32) (S x Int)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform (Int -> SType
STypeIVec Int
3) ToUniform x (B Int32) (S x Int)
-> ToUniform x (S x Int) (V3 (S x Int))
-> ToUniform x (B Int32) (V3 (S x Int))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (S x Int -> V3 (S x Int)) -> ToUniform x (S x Int) (V3 (S x Int))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr S x Int -> V3 (S x Int)
forall c a. S c a -> V3 (S c a)
vec3S''
instance UniformInput (B3 Word32) where
type UniformFormat (B3 Word32) x = V3 (S x Word)
toUniform :: ToUniform x (B3 GLuint) (UniformFormat (B3 GLuint) x)
toUniform = (B3 GLuint -> B GLuint) -> ToUniform x (B3 GLuint) (B GLuint)
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr B3 GLuint -> B GLuint
forall a. B3 a -> B a
unB3 ToUniform x (B3 GLuint) (B GLuint)
-> ToUniform x (B GLuint) (V3 (S x Word))
-> ToUniform x (B3 GLuint) (V3 (S x Word))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> SType -> ToUniform x (B GLuint) (S x Word)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform (Int -> SType
STypeVec Int
3) ToUniform x (B GLuint) (S x Word)
-> ToUniform x (S x Word) (V3 (S x Word))
-> ToUniform x (B GLuint) (V3 (S x Word))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (S x Word -> V3 (S x Word))
-> ToUniform x (S x Word) (V3 (S x Word))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr S x Word -> V3 (S x Word)
forall c a. S c a -> V3 (S c a)
vec3S''
instance UniformInput (B4 Float) where
type UniformFormat (B4 Float) x = V4 (S x Float)
toUniform :: ToUniform x (B4 Float) (UniformFormat (B4 Float) x)
toUniform = (B4 Float -> B Float) -> ToUniform x (B4 Float) (B Float)
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr B4 Float -> B Float
forall a. B4 a -> B a
unB4 ToUniform x (B4 Float) (B Float)
-> ToUniform x (B Float) (V4 (S x Float))
-> ToUniform x (B4 Float) (V4 (S x Float))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> SType -> ToUniform x (B Float) (S x Float)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform (Int -> SType
STypeVec Int
4) ToUniform x (B Float) (S x Float)
-> ToUniform x (S x Float) (V4 (S x Float))
-> ToUniform x (B Float) (V4 (S x Float))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (S x Float -> V4 (S x Float))
-> ToUniform x (S x Float) (V4 (S x Float))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr S x Float -> V4 (S x Float)
forall c a. S c a -> V4 (S c a)
vec4S''
instance UniformInput (B4 Int32) where
type UniformFormat (B4 Int32) x = V4 (S x Int)
toUniform :: ToUniform x (B4 Int32) (UniformFormat (B4 Int32) x)
toUniform = (B4 Int32 -> B Int32) -> ToUniform x (B4 Int32) (B Int32)
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr B4 Int32 -> B Int32
forall a. B4 a -> B a
unB4 ToUniform x (B4 Int32) (B Int32)
-> ToUniform x (B Int32) (V4 (S x Int))
-> ToUniform x (B4 Int32) (V4 (S x Int))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> SType -> ToUniform x (B Int32) (S x Int)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform (Int -> SType
STypeIVec Int
4) ToUniform x (B Int32) (S x Int)
-> ToUniform x (S x Int) (V4 (S x Int))
-> ToUniform x (B Int32) (V4 (S x Int))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (S x Int -> V4 (S x Int)) -> ToUniform x (S x Int) (V4 (S x Int))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr S x Int -> V4 (S x Int)
forall c a. S c a -> V4 (S c a)
vec4S''
instance UniformInput (B4 Word32) where
type UniformFormat (B4 Word32) x = V4 (S x Word)
toUniform :: ToUniform x (B4 GLuint) (UniformFormat (B4 GLuint) x)
toUniform = (B4 GLuint -> B GLuint) -> ToUniform x (B4 GLuint) (B GLuint)
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr B4 GLuint -> B GLuint
forall a. B4 a -> B a
unB4 ToUniform x (B4 GLuint) (B GLuint)
-> ToUniform x (B GLuint) (V4 (S x Word))
-> ToUniform x (B4 GLuint) (V4 (S x Word))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> SType -> ToUniform x (B GLuint) (S x Word)
forall x a b. SType -> ToUniform x (B a) (S x b)
makeUniform (Int -> SType
STypeVec Int
4) ToUniform x (B GLuint) (S x Word)
-> ToUniform x (S x Word) (V4 (S x Word))
-> ToUniform x (B GLuint) (V4 (S x Word))
forall k (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (S x Word -> V4 (S x Word))
-> ToUniform x (S x Word) (V4 (S x Word))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr S x Word -> V4 (S x Word)
forall c a. S c a -> V4 (S c a)
vec4S''
instance UniformInput a => UniformInput (V0 a) where
type UniformFormat (V0 a) x = V0 (UniformFormat a x)
toUniform :: ToUniform x (V0 a) (UniformFormat (V0 a) x)
toUniform = (V0 a -> V0 (UniformFormat a x))
-> ToUniform x (V0 a) (V0 (UniformFormat a x))
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (V0 (UniformFormat a x) -> V0 a -> V0 (UniformFormat a x)
forall a b. a -> b -> a
const V0 (UniformFormat a x)
forall a. V0 a
V0)
instance UniformInput a => UniformInput (V1 a) where
type UniformFormat (V1 a) x = V1 (UniformFormat a x)
toUniform :: ToUniform x (V1 a) (UniformFormat (V1 a) x)
toUniform = proc ~(V1 a
a) -> do
UniformFormat a x
a' <- ToUniform x a (UniformFormat a x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< a
a
ToUniform x (V1 (UniformFormat a x)) (UniformFormat (V1 a) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< UniformFormat a x -> V1 (UniformFormat a x)
forall a. a -> V1 a
V1 UniformFormat a x
a'
instance UniformInput a => UniformInput (V2 a) where
type UniformFormat (V2 a) x = V2 (UniformFormat a x)
toUniform :: ToUniform x (V2 a) (UniformFormat (V2 a) x)
toUniform = proc ~(V2 a
a a
b) -> do
UniformFormat a x
a' <- ToUniform x a (UniformFormat a x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< a
a
UniformFormat a x
b' <- ToUniform x a (UniformFormat a x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< a
b
ToUniform x (V2 (UniformFormat a x)) (UniformFormat (V2 a) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< UniformFormat a x -> UniformFormat a x -> V2 (UniformFormat a x)
forall a. a -> a -> V2 a
V2 UniformFormat a x
a' UniformFormat a x
b'
instance UniformInput a => UniformInput (V3 a) where
type UniformFormat (V3 a) x = V3 (UniformFormat a x)
toUniform :: ToUniform x (V3 a) (UniformFormat (V3 a) x)
toUniform = proc ~(V3 a
a a
b a
c) -> do
V2 UniformFormat a x
a' UniformFormat a x
b' <- ToUniform x (V2 a) (V2 (UniformFormat a x))
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< a -> a -> V2 a
forall a. a -> a -> V2 a
V2 a
a a
b
UniformFormat a x
c' <- ToUniform x a (UniformFormat a x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< a
c
ToUniform x (V3 (UniformFormat a x)) (UniformFormat (V3 a) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< UniformFormat a x
-> UniformFormat a x -> UniformFormat a x -> V3 (UniformFormat a x)
forall a. a -> a -> a -> V3 a
V3 UniformFormat a x
a' UniformFormat a x
b' UniformFormat a x
c'
instance UniformInput a => UniformInput (V4 a) where
type UniformFormat (V4 a) x = V4 (UniformFormat a x)
toUniform :: ToUniform x (V4 a) (UniformFormat (V4 a) x)
toUniform = proc ~(V4 a
a a
b a
c a
d) -> do
V3 UniformFormat a x
a' UniformFormat a x
b' UniformFormat a x
c' <- ToUniform x (V3 a) (V3 (UniformFormat a x))
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< a -> a -> a -> V3 a
forall a. a -> a -> a -> V3 a
V3 a
a a
b a
c
UniformFormat a x
d' <- ToUniform x a (UniformFormat a x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< a
d
ToUniform x (V4 (UniformFormat a x)) (UniformFormat (V4 a) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< UniformFormat a x
-> UniformFormat a x
-> UniformFormat a x
-> UniformFormat a x
-> V4 (UniformFormat a x)
forall a. a -> a -> a -> a -> V4 a
V4 UniformFormat a x
a' UniformFormat a x
b' UniformFormat a x
c' UniformFormat a x
d'
instance UniformInput () where
type UniformFormat () x = ()
toUniform :: ToUniform x () (UniformFormat () x)
toUniform = (() -> ()) -> ToUniform x () ()
forall (a :: * -> * -> *) b c. Arrow a => (b -> c) -> a b c
arr (() -> () -> ()
forall a b. a -> b -> a
const ())
instance (UniformInput a, UniformInput b) => UniformInput (a,b) where
type UniformFormat (a,b) x = (UniformFormat a x, UniformFormat b x)
toUniform :: ToUniform x (a, b) (UniformFormat (a, b) x)
toUniform = proc ~(a
a,b
b) -> do
UniformFormat a x
a' <- ToUniform x a (UniformFormat a x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< a
a
UniformFormat b x
b' <- ToUniform x b (UniformFormat b x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< b
b
ToUniform
x (UniformFormat a x, UniformFormat b x) (UniformFormat (a, b) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< (UniformFormat a x
a', UniformFormat b x
b')
instance (UniformInput a, UniformInput b, UniformInput c) => UniformInput (a,b,c) where
type UniformFormat (a,b,c) x = (UniformFormat a x, UniformFormat b x, UniformFormat c x)
toUniform :: ToUniform x (a, b, c) (UniformFormat (a, b, c) x)
toUniform = proc ~(a
a,b
b,c
c) -> do
(UniformFormat a x
a', UniformFormat b x
b') <- ToUniform x (a, b) (UniformFormat a x, UniformFormat b x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< (a
a, b
b)
UniformFormat c x
c' <- ToUniform x c (UniformFormat c x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< c
c
ToUniform
x
(UniformFormat a x, UniformFormat b x, UniformFormat c x)
(UniformFormat (a, b, c) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< (UniformFormat a x
a', UniformFormat b x
b', UniformFormat c x
c')
instance (UniformInput a, UniformInput b, UniformInput c, UniformInput d) => UniformInput (a,b,c,d) where
type UniformFormat (a,b,c,d) x = (UniformFormat a x, UniformFormat b x, UniformFormat c x, UniformFormat d x)
toUniform :: ToUniform x (a, b, c, d) (UniformFormat (a, b, c, d) x)
toUniform = proc ~(a
a,b
b,c
c,d
d) -> do
(UniformFormat a x
a', UniformFormat b x
b', UniformFormat c x
c') <- ToUniform
x
(a, b, c)
(UniformFormat a x, UniformFormat b x, UniformFormat c x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< (a
a, b
b, c
c)
UniformFormat d x
d' <- ToUniform x d (UniformFormat d x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< d
d
ToUniform
x
(UniformFormat a x, UniformFormat b x, UniformFormat c x,
UniformFormat d x)
(UniformFormat (a, b, c, d) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< (UniformFormat a x
a', UniformFormat b x
b', UniformFormat c x
c', UniformFormat d x
d')
instance (UniformInput a, UniformInput b, UniformInput c, UniformInput d, UniformInput e) => UniformInput (a,b,c,d,e) where
type UniformFormat (a,b,c,d,e) x = (UniformFormat a x, UniformFormat b x, UniformFormat c x, UniformFormat d x, UniformFormat e x)
toUniform :: ToUniform x (a, b, c, d, e) (UniformFormat (a, b, c, d, e) x)
toUniform = proc ~(a
a,b
b,c
c,d
d,e
e) -> do
(UniformFormat a x
a',UniformFormat b x
b',UniformFormat c x
c',UniformFormat d x
d') <- ToUniform
x
(a, b, c, d)
(UniformFormat a x, UniformFormat b x, UniformFormat c x,
UniformFormat d x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< (a
a,b
b,c
c,d
d)
UniformFormat e x
e' <- ToUniform x e (UniformFormat e x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< e
e
ToUniform
x
(UniformFormat a x, UniformFormat b x, UniformFormat c x,
UniformFormat d x, UniformFormat e x)
(UniformFormat (a, b, c, d, e) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< (UniformFormat a x
a', UniformFormat b x
b', UniformFormat c x
c', UniformFormat d x
d', UniformFormat e x
e')
instance (UniformInput a, UniformInput b, UniformInput c, UniformInput d, UniformInput e, UniformInput f) => UniformInput (a,b,c,d,e,f) where
type UniformFormat (a,b,c,d,e,f) x = (UniformFormat a x, UniformFormat b x, UniformFormat c x, UniformFormat d x, UniformFormat e x, UniformFormat f x)
toUniform :: ToUniform x (a, b, c, d, e, f) (UniformFormat (a, b, c, d, e, f) x)
toUniform = proc ~(a
a,b
b,c
c,d
d,e
e,f
f) -> do
(UniformFormat a x
a',UniformFormat b x
b',UniformFormat c x
c',UniformFormat d x
d',UniformFormat e x
e') <- ToUniform
x
(a, b, c, d, e)
(UniformFormat a x, UniformFormat b x, UniformFormat c x,
UniformFormat d x, UniformFormat e x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< (a
a,b
b,c
c,d
d,e
e)
UniformFormat f x
f' <- ToUniform x f (UniformFormat f x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< f
f
ToUniform
x
(UniformFormat a x, UniformFormat b x, UniformFormat c x,
UniformFormat d x, UniformFormat e x, UniformFormat f x)
(UniformFormat (a, b, c, d, e, f) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< (UniformFormat a x
a', UniformFormat b x
b', UniformFormat c x
c', UniformFormat d x
d', UniformFormat e x
e', UniformFormat f x
f')
instance (UniformInput a, UniformInput b, UniformInput c, UniformInput d, UniformInput e, UniformInput f, UniformInput g) => UniformInput (a,b,c,d,e,f,g) where
type UniformFormat (a,b,c,d,e,f,g) x = (UniformFormat a x, UniformFormat b x, UniformFormat c x, UniformFormat d x, UniformFormat e x, UniformFormat f x, UniformFormat g x)
toUniform :: ToUniform
x (a, b, c, d, e, f, g) (UniformFormat (a, b, c, d, e, f, g) x)
toUniform = proc ~(a
a,b
b,c
c,d
d,e
e,f
f,g
g) -> do
(UniformFormat a x
a',UniformFormat b x
b',UniformFormat c x
c',UniformFormat d x
d',UniformFormat e x
e',UniformFormat f x
f') <- ToUniform
x
(a, b, c, d, e, f)
(UniformFormat a x, UniformFormat b x, UniformFormat c x,
UniformFormat d x, UniformFormat e x, UniformFormat f x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< (a
a,b
b,c
c,d
d,e
e,f
f)
UniformFormat g x
g' <- ToUniform x g (UniformFormat g x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< g
g
ToUniform
x
(UniformFormat a x, UniformFormat b x, UniformFormat c x,
UniformFormat d x, UniformFormat e x, UniformFormat f x,
UniformFormat g x)
(UniformFormat (a, b, c, d, e, f, g) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< (UniformFormat a x
a', UniformFormat b x
b', UniformFormat c x
c', UniformFormat d x
d', UniformFormat e x
e', UniformFormat f x
f', UniformFormat g x
g')
instance UniformInput a => UniformInput (Quaternion a) where
type UniformFormat (Quaternion a) x = Quaternion (UniformFormat a x)
toUniform :: ToUniform x (Quaternion a) (UniformFormat (Quaternion a) x)
toUniform = proc ~(Quaternion a
a V3 a
v) -> do
(UniformFormat a x
a',V3 (UniformFormat a x)
v') <- ToUniform x (a, V3 a) (UniformFormat a x, V3 (UniformFormat a x))
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< (a
a,V3 a
v)
ToUniform
x (Quaternion (UniformFormat a x)) (UniformFormat (Quaternion a) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< UniformFormat a x
-> V3 (UniformFormat a x) -> Quaternion (UniformFormat a x)
forall a. a -> V3 a -> Quaternion a
Quaternion UniformFormat a x
a' V3 (UniformFormat a x)
v'
instance UniformInput a => UniformInput (Plucker a) where
type UniformFormat (Plucker a) x = Plucker (UniformFormat a x)
toUniform :: ToUniform x (Plucker a) (UniformFormat (Plucker a) x)
toUniform = proc ~(Plucker a
a a
b a
c a
d a
e a
f) -> do
(UniformFormat a x
a',UniformFormat a x
b',UniformFormat a x
c',UniformFormat a x
d',UniformFormat a x
e',UniformFormat a x
f') <- ToUniform
x
(a, a, a, a, a, a)
(UniformFormat a x, UniformFormat a x, UniformFormat a x,
UniformFormat a x, UniformFormat a x, UniformFormat a x)
forall a x. UniformInput a => ToUniform x a (UniformFormat a x)
toUniform -< (a
a,a
b,a
c,a
d,a
e,a
f)
ToUniform
x (Plucker (UniformFormat a x)) (UniformFormat (Plucker a) x)
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< UniformFormat a x
-> UniformFormat a x
-> UniformFormat a x
-> UniformFormat a x
-> UniformFormat a x
-> UniformFormat a x
-> Plucker (UniformFormat a x)
forall a. a -> a -> a -> a -> a -> a -> Plucker a
Plucker UniformFormat a x
a' UniformFormat a x
b' UniformFormat a x
c' UniformFormat a x
d' UniformFormat a x
e' UniformFormat a x
f'