module ExamplePrograms.Simulation.Examples where

open import Data.List
open import Data.Product using (_×_; ∃-syntax; Σ-syntax) renaming (_,_ to ⟨_,_⟩)

open import Agda.Builtin.String
open import Common.Utils
open import Common.Types
open import Surface.SurfaceLang

Cfg = String ×
  ∃[ M ] ∃[ M′ ] ∃[ A ] ∃[ A′ ]
  ([] ; l low ⊢ᴳ M  A) × ([] ; l low ⊢ᴳ M′  A′)

open import ExamplePrograms.Simulation.Values         as Values
open import ExamplePrograms.Simulation.FunInjArg      as FunInjArg
open import ExamplePrograms.Simulation.AppFunProxy1   as AppFunProxy1
open import ExamplePrograms.Simulation.AppFunProxy2   as AppFunProxy2
open import ExamplePrograms.Simulation.FunCast1       as FunCast1
open import ExamplePrograms.Simulation.FunCast2       as FunCast2
open import ExamplePrograms.Simulation.FunCast3       as FunCast3
open import ExamplePrograms.Simulation.FunCast4       as FunCast4
open import ExamplePrograms.Simulation.DerefRefProxy  as DerefRefProxy
open import ExamplePrograms.Simulation.AssignRefProxy as AssignRefProxy
open import ExamplePrograms.Simulation.RefAndImplicitFlow as RefImpFlow
open import ExamplePrograms.Simulation.RefNSU1        as RefNSU1
open import ExamplePrograms.Simulation.RefNSU2        as RefNSU2
open import ExamplePrograms.Simulation.RefNSU3        as RefNSU3
open import ExamplePrograms.Simulation.AssignNSU1     as AssignNSU1
open import ExamplePrograms.Simulation.AssignNSU2     as AssignNSU2
open import ExamplePrograms.Simulation.AssignNSU3     as AssignNSU3
open import ExamplePrograms.Simulation.AssignNSU4     as AssignNSU4
open import ExamplePrograms.Simulation.RefCast1       as RefCast1
open import ExamplePrograms.Simulation.SubInj1        as SubInj1
open import ExamplePrograms.Simulation.SubInj2        as SubInj2
open import ExamplePrograms.Simulation.InjProj1       as InjProj1
open import ExamplePrograms.Simulation.InjProj2       as InjProj2
open import ExamplePrograms.Simulation.IfTrueAssign   as IfTrueAssign
open import ExamplePrograms.Simulation.IfFalseAssign  as IfFalseAssign
open import ExamplePrograms.Simulation.WrongAnn1      as WrongAnn1
open import ExamplePrograms.Simulation.WrongAnn2      as WrongAnn2

cfgs : List Cfg
cfgs =
   "Values"        , Values.M        , Values.M′        , _ , _ , Values.⊢M        , Values.⊢M′         
   "AppFunProxy1"  , AppFunProxy1.M  , AppFunProxy1.M′  , _ , _ , AppFunProxy1.⊢M  , AppFunProxy1.⊢M′   
   "AppFunProxy2"  , AppFunProxy2.M  , AppFunProxy2.M′  , _ , _ , AppFunProxy2.⊢M  , AppFunProxy2.⊢M′   
   "FunCast1"      , FunCast1.M      , FunCast1.M′      , _ , _ , FunCast1.⊢M      , FunCast1.⊢M′       
   "FunCast2"      , FunCast2.M      , FunCast2.M′      , _ , _ , FunCast2.⊢M      , FunCast2.⊢M′       
   "FunCast3"      , FunCast3.M      , FunCast3.M′      , _ , _ , FunCast3.⊢M      , FunCast3.⊢M′       
   "FunCast4"      , FunCast4.M      , FunCast4.M′      , _ , _ , FunCast4.⊢M      , FunCast4.⊢M′       
   "DerefRefProxy" , DerefRefProxy.M , DerefRefProxy.M′ , _ , _ , DerefRefProxy.⊢M , DerefRefProxy.⊢M′  
   "AssignRefProxy" , AssignRefProxy.M , AssignRefProxy.M′ , _ , _ , AssignRefProxy.⊢M , AssignRefProxy.⊢M′  
   "RefImpFlow"    , RefImpFlow.M    , RefImpFlow.M′    , _ , _ , RefImpFlow.⊢M    , RefImpFlow.⊢M′     
   "RefNSU1"       , RefNSU1.M       , RefNSU1.M′       , _ , _ , RefNSU1.⊢M       , RefNSU1.⊢M′        
   "RefNSU2"       , RefNSU2.M       , RefNSU2.M′       , _ , _ , RefNSU2.⊢M       , RefNSU2.⊢M′        
   "RefNSU3"       , RefNSU3.M       , RefNSU3.M′       , _ , _ , RefNSU3.⊢M       , RefNSU3.⊢M′        
   "AssignNSU1"    , AssignNSU1.M    , AssignNSU1.M′    , _ , _ , AssignNSU1.⊢M    , AssignNSU1.⊢M′     
   "AssignNSU2"    , AssignNSU2.M    , AssignNSU2.M′    , _ , _ , AssignNSU2.⊢M    , AssignNSU2.⊢M′     
   "AssignNSU3"    , AssignNSU3.M    , AssignNSU3.M′    , _ , _ , AssignNSU3.⊢M    , AssignNSU3.⊢M′     
   "AssignNSU4"    , AssignNSU4.M    , AssignNSU4.M′    , _ , _ , AssignNSU4.⊢M    , AssignNSU4.⊢M′     
   "RefCast1"      , RefCast1.M      , RefCast1.M′      , _ , _ , RefCast1.⊢M      , RefCast1.⊢M′       
   "FunInjArg"     , FunInjArg.M     , FunInjArg.M′     , _ , _ , FunInjArg.⊢M     , FunInjArg.⊢M′      
   "SubInj1"       , SubInj1.M       , SubInj1.M′       , _ , _ , SubInj1.⊢M       , SubInj1.⊢M′        
   "SubInj2"       , SubInj2.M       , SubInj2.M′       , _ , _ , SubInj2.⊢M       , SubInj2.⊢M′        
   "InjProj1"      , InjProj1.M      , InjProj1.M′      , _ , _ , InjProj1.⊢M      , InjProj1.⊢M′       
   "InjProj2"      , InjProj2.M      , InjProj2.M′      , _ , _ , InjProj2.⊢M      , InjProj2.⊢M′       
   "IfTrueAssign"  , IfTrueAssign.M  , IfTrueAssign.M′  , _ , _ , IfTrueAssign.⊢M  , IfTrueAssign.⊢M′   
   "IfFalseAssign" , IfFalseAssign.M , IfFalseAssign.M′ , _ , _ , IfFalseAssign.⊢M , IfFalseAssign.⊢M′  
   "WrongAnn1"     , WrongAnn1.M     , WrongAnn1.M′     , _ , _ , WrongAnn1.⊢M     , WrongAnn1.⊢M′      
   "WrongAnn2"     , WrongAnn2.M     , WrongAnn2.M′     , _ , _ , WrongAnn2.⊢M     , WrongAnn2.⊢M′      
  []