module Lang.CPS.StateSpace where

import FP
import MAAM
import Lang.CPS.Syntax
import Lang.Common

data Addr   (ψ :: *) = Addr
  { addrLocation :: SGName
  , addrLexicalTime ::  ψ
  , addrDynamicTime ::  ψ
  } deriving (Eq, Ord)

type Env   ψ = Map SGName (Addr   ψ)
type Store val   ψ = Map (Addr   ψ) (val   ψ)

data 𝒮 val   ψ = 𝒮
  { 𝓈lτ ::  ψ
  , 𝓈dτ ::  ψ
  , 𝓈ρ :: Env   ψ
  , 𝓈σ :: Store val   ψ
  } deriving (Eq, Ord)
makeLenses ''𝒮
instance (Initial ( ψ), Initial ( ψ)) => Initial (𝒮 val   ψ) where
  initial = 𝒮 initial initial initial initial

data Clo   ψ = Clo 
  { cloLoc :: LocNum
  , cloArgs :: [SGName]
  , cloCall :: SGCall
  , cloEnv :: Env   ψ
  , cloTime ::  ψ
  } deriving (Eq, Ord)

class Val   ψ val | val -> , val -> , val -> ψ where
  lit :: Lit -> val 
  clo :: Clo   ψ -> val 
  op :: Op -> val -> val
  elimBool :: val -> Set Bool
  elimClo :: val -> Set (Clo   ψ)