packages feed

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

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

module Tests.Optics.Overlapping where

-- fir
import FIR
import FIR.Syntax.Labels
import Math.Linear

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

type MyStruct = Struct '[ "field_0" ':-> Float, "field_1" ':-> Bool ]
type OtherStruct = Struct '[ "x" ':-> Float, "y" ':-> Float ]

program :: Module '[ "main" ':-> EntryPoint '[] Vertex ]
program = Module do

  entryPoint @"main" @Vertex do

    def @"struct" @RW @MyStruct
      ( Lit ( 3 :& True :& End ) )

    assign
      @(    Name "struct"
        :.: ( Prod (Name "field_0" :*: Index 0 :*: EndProd)
               :: Optic '[]
                    MyStruct
                    OtherStruct
            )
       )
      ( Lit ( 4 :& 5 :& End ) )