use crate::environment::lexical_environment::{Environment, EnvironmentType};
use crate::js::value::Value;
use gc::{Finalize, Trace};
pub trait EnvironmentRecordTrait: Trace + Finalize {
fn has_binding(&self, name: &String) -> bool;
fn create_mutable_binding(&mut self, name: String, deletion: bool);
fn create_immutable_binding(&mut self, name: String, strict: bool);
fn initialize_binding(&mut self, name: String, value: Value);
fn set_mutable_binding(&mut self, name: String, value: Value, strict: bool);
fn get_binding_value(&self, name: String, strict: bool) -> Value;
fn delete_binding(&mut self, name: String) -> bool;
fn has_this_binding(&self) -> bool;
fn has_super_binding(&self) -> bool;
fn with_base_object(&self) -> Value;
fn get_outer_environment(&self) -> Option<Environment>;
fn set_outer_environment(&mut self, env: Environment);
fn get_environment_type(&self) -> EnvironmentType;
fn get_global_object(&self) -> Option<Value>;
}