Skip to main content

Environment

Struct Environment 

Source
pub struct Environment<K: Hash + Eq, V: PartialEq> { /* private fields */ }
Expand description

An environment as a linked-list of hashmaps.

Each node of the linked-list corresponds to what is called “a layer”, where only the current layer can be modified, the previous ones are only accessible for lookup.

For the generic parameters, K is the type for the environment keys, and V are their value.

The linked list is composed of the current layer and the previous layers. The current layer is stored as an Rc<Hashmap>.

Insertions are made by “split-on-write”: if the current layer has no other references, it is mutated. If it has other references, the current layer is pushed down as the new “previous” layer, and a new layer is started.

Implementations§

Source§

impl<K: Hash + Eq, V: PartialEq> Environment<K, V>

Source

pub fn new() -> Self

Creates a new empty Environment.

Source

pub fn insert(&mut self, key: K, value: V)

Inserts a key-value pair into the Environment.

Source

pub fn get(&self, key: &K) -> Option<&V>

Tries to find the value of a key in the Environment.

Source

pub fn iter_layers(&self) -> EnvLayerIter<'_, K, V>

Creates an iterator that visits all layers from the most recent one to the oldest. The element iterator type is Rc<HashMap<K, V>>.

Source

pub fn iter_elems(&self) -> impl Iterator<Item = (&K, &V)>

Creates an iterator that visits all elements from the Environment, from the oldest layer to the most recent one. It uses this order, so calling collect on this iterator to create a hashmap would have the same values as the Environment. The element iterator type is (&'env K, &'env V), with 'env being the lifetime of the Environment.

Source

pub fn ptr_eq(this: &Self, that: &Self) -> bool

Checks quickly if two environments are obviously equal (when their components are physically equal as pointers or obviously equal such as being both empty).

Source

pub fn is_empty(&self) -> bool

Returns true if this environment is empty, that is if the current layer is empty and there’s no previous layer.

Trait Implementations§

Source§

impl<K: Hash + Eq, V: PartialEq> Clone for Environment<K, V>

Source§

fn clone(&self) -> Self

Clone has to create a new environment, while ensuring that previous defined layers are accessible but not modifiable anymore.

1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<K: Debug + Hash + Eq, V: Debug + PartialEq> Debug for Environment<K, V>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<K: Hash + Eq, V: PartialEq> Default for Environment<K, V>

Source§

fn default() -> Self

Returns the “default value” for a type. Read more
Source§

impl<K: Hash + Eq, V: PartialEq> Extend<(K, V)> for Environment<K, V>

Source§

fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T)

Extends a collection with the contents of an iterator. Read more
Source§

fn extend_one(&mut self, item: A)

🔬This is a nightly-only experimental API. (extend_one)
Extends a collection with exactly one element.
Source§

fn extend_reserve(&mut self, additional: usize)

🔬This is a nightly-only experimental API. (extend_one)
Reserves capacity in a collection for the given number of additional elements. Read more
Source§

impl<K: Hash + Eq, V: PartialEq> FromIterator<(K, V)> for Environment<K, V>

Source§

fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self

Creates a value from an iterator. Read more
Source§

impl<K: PartialEq + Hash + Eq, V: PartialEq + PartialEq> PartialEq for Environment<K, V>

Source§

fn eq(&self, other: &Environment<K, V>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<K: Hash + Eq, V: PartialEq> StructuralPartialEq for Environment<K, V>

Auto Trait Implementations§

§

impl<K, V> Freeze for Environment<K, V>

§

impl<K, V> RefUnwindSafe for Environment<K, V>

§

impl<K, V> !Send for Environment<K, V>

§

impl<K, V> !Sync for Environment<K, V>

§

impl<K, V> Unpin for Environment<K, V>

§

impl<K, V> UnsafeUnpin for Environment<K, V>

§

impl<K, V> UnwindSafe for Environment<K, V>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T, U> ExactFrom<T> for U
where U: TryFrom<T>,

Source§

fn exact_from(value: T) -> U

Source§

impl<T, U> ExactInto<U> for T
where U: ExactFrom<T>,

Source§

fn exact_into(self) -> U

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T, U> OverflowingInto<U> for T
where U: OverflowingFrom<T>,

Source§

impl<T, U> RoundingInto<U> for T
where U: RoundingFrom<T>,

Source§

impl<T, U> SaturatingInto<U> for T
where U: SaturatingFrom<T>,

Source§

impl<T> ToDebugString for T
where T: Debug,

Source§

fn to_debug_string(&self) -> String

Returns the String produced by Ts Debug implementation.

§Examples
use malachite_base::strings::ToDebugString;

assert_eq!([1, 2, 3].to_debug_string(), "[1, 2, 3]");
assert_eq!(
    [vec![2, 3], vec![], vec![4]].to_debug_string(),
    "[[2, 3], [], [4]]"
);
assert_eq!(Some(5).to_debug_string(), "Some(5)");
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryConvert<'_, T> for U
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

Source§

fn try_convert( _: &AstAlloc, from: T, ) -> Result<U, <U as TryConvert<'_, T>>::Error>

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T, U> WrappingInto<U> for T
where U: WrappingFrom<T>,

Source§

fn wrapping_into(self) -> U