|
{-# LANGUAGE ViewPatterns #-}
|
|
{-# LANGUAGE DeriveDataTypeable #-}
|
|
{-# LANGUAGE StrictData, PatternSynonyms #-}
|
|
module Value where
|
|
|
|
import Data.Sequence (Seq)
|
|
import Data.Text (Text)
|
|
|
|
import Syntax
|
|
import Data.Data
|
|
import qualified Data.Sequence as Seq
|
|
|
|
newtype Env =
|
|
Env { locals :: Seq Value }
|
|
deriving (Eq, Show, Ord, Data, Typeable)
|
|
|
|
emptyEnv :: Env
|
|
emptyEnv = Env mempty
|
|
|
|
type VTy = Value
|
|
|
|
data Closure
|
|
= Closure !Env !Term
|
|
| ClMeta MetaFun
|
|
deriving (Eq, Ord, Data, Typeable)
|
|
|
|
instance Show Closure where
|
|
showsPrec x (Closure _ t) = showsPrec x t
|
|
showsPrec x (ClMeta f) = showsPrec x f
|
|
|
|
newtype MetaFun = MetaFun { runMC :: Value -> Value }
|
|
|
|
instance Eq MetaFun where
|
|
_ == _ = False
|
|
|
|
instance Ord MetaFun where
|
|
_ <= _ = True
|
|
|
|
instance Show MetaFun where
|
|
show _ = "«meta»"
|
|
|
|
instance Data MetaFun where
|
|
gunfold _ _ _ = error "gunfold MetaFun"
|
|
toConstr _ = error "gunfold MetaFun"
|
|
dataTypeOf _ = mkNoRepType "MetaFun"
|
|
|
|
data Value
|
|
-- Universes
|
|
= VType
|
|
|
|
-- Canonical Π-types and λ values
|
|
| VPi Plicity Text ~Value {-# UNPACK #-} Closure
|
|
| VLam Plicity Text {-# UNPACK #-} Closure
|
|
-- Variable applied to some values, with a
|
|
-- suspended evaluated result that might
|
|
-- be forced later
|
|
| VGlued Head (Seq SpineThing) ~(Maybe Value)
|
|
|
|
-- Canonical Σ-types and pair values
|
|
| VSigma Text ~Value {-# UNPACK #-} Closure
|
|
| VPair Value Value
|
|
|
|
-- Id A a b
|
|
| VEq Value Value Value
|
|
-- Id A a b ≡ t
|
|
| VEqG Value Value Value Value
|
|
|
|
| VTop | VUnit
|
|
deriving (Eq, Show, Ord, Data, Typeable)
|
|
|
|
data SpineThing
|
|
= AppEx Value
|
|
| AppIm Value
|
|
| SProj1
|
|
| SProj2
|
|
deriving (Eq, Show, Ord, Data, Typeable)
|
|
|
|
flexible :: Value -> Bool
|
|
flexible VGlued{} = True
|
|
flexible VEqG{} = True
|
|
flexible _ = False
|
|
|
|
pattern VNe :: Head -> Seq SpineThing -> Value
|
|
pattern VNe x y = VGlued x y Nothing
|
|
|
|
pattern VProj1 :: Value -> Value
|
|
pattern VProj1 t <- (matchP1 -> Just t) where
|
|
VProj1 t =
|
|
case t of
|
|
VGlued h s n -> VGlued h (s Seq.:|> SProj1) n
|
|
|
|
matchP1 :: Value -> Maybe Value
|
|
matchP1 (VPair x _) = Just x
|
|
matchP1 (VGlued h (s Seq.:|> SProj1) n) = Just (VGlued h s n)
|
|
matchP1 _ = Nothing
|
|
|
|
pattern VProj2 :: Value -> Value
|
|
pattern VProj2 t <- (matchP2 -> Just t) where
|
|
VProj2 t =
|
|
case t of
|
|
VGlued h s n -> VGlued h (s Seq.:|> SProj2) n
|
|
|
|
matchP2 :: Value -> Maybe Value
|
|
matchP2 (VPair _ x) = Just x
|
|
matchP2 (VGlued h (s Seq.:|> SProj2) n) = Just (VGlued h s n)
|
|
matchP2 _ = Nothing
|
|
|
|
data Meta
|
|
= Unsolved [Text] Value
|
|
| Solved Value
|
|
deriving (Eq, Show)
|
|
|
|
vVar :: Var -> Value
|
|
vVar x = VGlued (HVar x) mempty Nothing
|
|
|
|
data Head
|
|
= HVar Var
|
|
| HCon Text
|
|
| HMeta MetaVar
|
|
| HRefl
|
|
| HCoe
|
|
| HCong
|
|
| HSym
|
|
deriving (Eq, Show, Ord, Data, Typeable)
|