{- |
Module      : Language.Egison.VarEntry
Licence     : MIT

This module defines the VarEntry data structure used by both
evaluation environment (Data.hs) and type inference environment (Type/Env.hs).
-}

module Language.Egison.VarEntry
  ( VarEntry(..)
  ) where

import           Language.Egison.IExpr      (Var(..), Index(..))

-- | Variable entry in the environment
-- Contains indices and value for a single variable binding
-- Parametrized to support both ObjectRef (for evaluation) and TypeScheme (for type inference)
data VarEntry a = VarEntry 
  { forall a. VarEntry a -> [Index (Maybe Var)]
veIndices :: [Index (Maybe Var)]
  , forall a. VarEntry a -> a
veValue :: a
  }
  deriving (VarEntry a -> VarEntry a -> Bool
(VarEntry a -> VarEntry a -> Bool)
-> (VarEntry a -> VarEntry a -> Bool) -> Eq (VarEntry a)
forall a. Eq a => VarEntry a -> VarEntry a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => VarEntry a -> VarEntry a -> Bool
== :: VarEntry a -> VarEntry a -> Bool
$c/= :: forall a. Eq a => VarEntry a -> VarEntry a -> Bool
/= :: VarEntry a -> VarEntry a -> Bool
Eq, Int -> VarEntry a -> ShowS
[VarEntry a] -> ShowS
VarEntry a -> String
(Int -> VarEntry a -> ShowS)
-> (VarEntry a -> String)
-> ([VarEntry a] -> ShowS)
-> Show (VarEntry a)
forall a. Show a => Int -> VarEntry a -> ShowS
forall a. Show a => [VarEntry a] -> ShowS
forall a. Show a => VarEntry a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> VarEntry a -> ShowS
showsPrec :: Int -> VarEntry a -> ShowS
$cshow :: forall a. Show a => VarEntry a -> String
show :: VarEntry a -> String
$cshowList :: forall a. Show a => [VarEntry a] -> ShowS
showList :: [VarEntry a] -> ShowS
Show)