packages feed

fir-0.1.0.0: test/Tests/Optics/ASTProducts.hs

{-# LANGUAGE BlockArguments      #-}
{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE FlexibleInstances   #-}
{-# LANGUAGE GADTs               #-}
{-# LANGUAGE PatternSynonyms     #-}
{-# LANGUAGE PolyKinds           #-}
{-# LANGUAGE RebindableSyntax    #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}
{-# LANGUAGE TypeOperators       #-}

module Tests.Optics.ASTProducts where

-- fir
import FIR
import Math.Linear

------------------------------------------------
-- program

type Defs =
  '[ "ubo"  ':-> Uniform    '[Binding 0, DescriptorSet 0] ( Struct '[ "mvp" ':-> M 4 4 Float ] )
   , "out"  ':-> Output     '[Location 0] ( M 4 4 Float )
   , "main" ':-> EntryPoint '[] Vertex
   ]

program :: Module Defs
program = Module $ entryPoint @"main" @Vertex do

  row <- use @(Name "ubo" :.: Name "mvp" :.: Row 0)
  col <- use @(Name "ubo" :.: Name "mvp" :.: Col 2)
  dia <- use @(Name "ubo" :.: Name "mvp" :.: Diag)
  ( mid :: Code (M 2 2 Float) )
    <- use @(Name "ubo" :.: Name "mvp" :.: Prod (Entry 1 1 :*: Entry 1 2 :*: Entry 2 1 :*: Entry 2 2 :*: EndProd))
  ( flatMid :: Code (V 4 Float) )
    <- use @(Name "ubo" :.: Name "mvp" :.: Prod (Entry 1 1 :*: Entry 1 2 :*: Entry 2 1 :*: Entry 2 2 :*: EndProd))

  assign @(Name "out") identity
  assign @(Name "out" :.: Diag) dia
  assign @(Name "out" :.: Prod (Entry 1 1 :*: Entry 1 2 :*: Entry 2 1 :*: Entry 2 2 :*: EndProd)) mid
  assign @(Name "out" :.: Col 3) col
  assign @(Name "out" :.: Row 2) row
  assign @(Name "out" :.: Row 1) flatMid