Skip to main content

LazyTable

Struct LazyTable 

Source
pub struct LazyTable { /* private fields */ }
Expand description

Table whose entry values are produced on demand by ValueLoader closures and memoized after their first force.

Each entry’s loader runs at most once; the first result (value or error) is cached and returned for every later access. Metadata operations (has/keys/len) do not force loaders, while get/del/entries and encoding do. Implements the kernel Table contract and the object-encoding contracts, round-tripping through its LazyTableDescriptor citizen form. The entry map is guarded by an RwLock, so a LazyTable is shareable and mutable through a shared reference.

Implementations§

Source§

impl LazyTable

Source

pub fn new() -> Self

Construct an empty lazy table.

Source

pub fn with_loaders(pairs: Vec<(Symbol, ValueLoader)>) -> Self

Construct a lazy table whose entries are produced on demand by the given loaders.

Each loader runs at most once, on first access of its key, and its result is memoized.

§Examples
use std::sync::Arc;
use sim_kernel::{Cx, DefaultFactory, NoopEvalPolicy, Result, Symbol, Table, Value};
use sim_table_lazy::{LazyTable, ValueLoader};

let mut cx = Cx::new(Arc::new(NoopEvalPolicy), Arc::new(DefaultFactory));
let loader: ValueLoader = Arc::new(|cx: &mut Cx| cx.factory().bool(true));
let table = LazyTable::with_loaders(vec![(Symbol::new("x"), loader)]);

// Metadata does not force the loader.
assert!(table.has(&mut cx, Symbol::new("x")).unwrap());
// get forces it (once) and memoizes the result.
let forced = table.get(&mut cx, Symbol::new("x")).unwrap();
assert_eq!(forced, table.get(&mut cx, Symbol::new("x")).unwrap());
Source

pub fn with_entries(entries: Vec<(Symbol, Value)>) -> Self

Construct a lazy table pre-populated with already-computed values.

Each entry is stored as an eager (pre-cached) loader, so accessing it performs no further computation. Later entries with the same key overwrite earlier ones.

Source

pub fn put_lazy(&self, key: Symbol, loader: ValueLoader)

Insert (or replace) a lazily computed entry under key.

The loader runs at most once, on first access of key, and its result is memoized.

Trait Implementations§

Source§

impl Citizen for LazyTable

Source§

fn citizen_symbol() -> Symbol

The citizen’s namespace/name class symbol.
Source§

fn citizen_version() -> u32

The citizen’s encoding version.
Source§

fn citizen_arity() -> usize

Number of constructor fields (excluding the version argument).
Source§

fn citizen_fields() -> &'static [&'static str]

The citizen’s field names, in constructor order.
Source§

impl Clone for LazyTable

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Default for LazyTable

Source§

fn default() -> Self

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

impl Object for LazyTable

Source§

fn display(&self, _cx: &mut Cx) -> Result<String>

Render the object as a human-readable display string.
Source§

fn as_any(&self) -> &dyn Any

Expose the object for Rust downcasting.
Source§

fn header(&self) -> &ObjectHeader

Identity and trust header for the object; defaults to the shared anonymous header.
Source§

fn op(&self, _key: &OpKey) -> Option<&dyn Op>

Resolve the operation registered under key, if any.
Source§

fn claims( &self, _cx: &mut Cx, _pattern: &ClaimPattern, _sink: &mut dyn ClaimSink, ) -> Result<(), Error>

Emit the object’s claims matching pattern into sink.
Source§

fn snapshot(&self, _cx: &mut Cx) -> Result<Option<Datum>, Error>

Optional content-addressable snapshot of the object’s state.
Source§

impl ObjectCompat for LazyTable

Source§

fn class(&self, cx: &mut Cx) -> Result<ClassRef>

Class object this value belongs to; defaults to nil.
Source§

fn as_expr(&self, cx: &mut Cx) -> Result<Expr>

Expression form of the object; defaults to an opaque extension node.
Source§

fn truth(&self, _cx: &mut Cx) -> Result<bool>

Truthiness of the object; defaults to true.
Source§

fn as_table_impl(&self) -> Option<&dyn Table>

Table-implementation view, if the object is a table.
Source§

fn as_object_encoder(&self) -> Option<&dyn ObjectEncode>

Object-encoder view, if the object encodes other objects.
Source§

fn as_callable(&self) -> Option<&dyn Callable>

Callable view, if the object can be invoked.
Source§

fn as_class(&self) -> Option<&dyn Class>

Class view, if the object is a class.
Source§

fn as_shape(&self) -> Option<&dyn Shape>

Shape view, if the object is a shape.
Source§

fn as_read_constructor(&self) -> Option<&dyn ReadConstructor>

Read-constructor view, if the object decodes data forms.
Source§

fn as_number_domain(&self) -> Option<&(dyn NumberDomain + 'static)>

Number-domain view, if the object is a number domain.
Source§

fn as_number_value(&self) -> Option<&dyn NumberValue>

Number-value view, if the object is a domain number.
Source§

fn as_eval_fabric(&self) -> Option<&dyn EvalFabric>

Eval-fabric view, if the object is a distributed eval surface.
Source§

fn as_stream(&self) -> Option<&dyn Stream>

Stream view, if the object is a stream.
Source§

fn as_sequence(&self) -> Option<&dyn Sequence>

Sequence view, if the object is a sequence.
Source§

fn as_thunk(&self) -> Option<&dyn Thunk>

Thunk view, if the object is a deferred computation.
Source§

fn as_list(&self) -> Option<&(dyn ListValue + 'static)>

List view, if the object is a list value.
Source§

fn as_dir(&self) -> Option<&(dyn Dir + 'static)>

Directory view, if the object is a directory.
Source§

fn publish_shape_satisfaction_claims( &self, _cx: &mut Cx, _shape: &Ref, ) -> Result<bool, Error>

Publish claims asserting that the object satisfies shape; returns whether any were published.
Source§

fn as_table(&self, cx: &mut Cx) -> Result<Value, Error>

Project the object into a table value; the default exposes its display.
Source§

impl ObjectEncode for LazyTable

Source§

fn object_encoding(&self, cx: &mut Cx) -> Result<ObjectEncoding>

Returns the ObjectEncoding this object should be rendered as.
Source§

impl Table for LazyTable

Source§

fn backend_symbol(&self) -> Symbol

Symbol identifying the backend representation.
Source§

fn get(&self, cx: &mut Cx, key: Symbol) -> Result<Value>

Looks up key, returning nil when absent.
Source§

fn set(&self, _cx: &mut Cx, key: Symbol, value: Value) -> Result<()>

Inserts or replaces the value for key.
Source§

fn has(&self, _cx: &mut Cx, key: Symbol) -> Result<bool>

Whether key is present.
Source§

fn del(&self, cx: &mut Cx, key: Symbol) -> Result<Value>

Removes key, returning its prior value or nil.
Source§

fn keys(&self, _cx: &mut Cx) -> Result<Vec<Symbol>>

All keys, in backend order.
Source§

fn entries(&self, cx: &mut Cx) -> Result<Vec<(Symbol, Value)>>

All key/value pairs, in backend order.
Source§

fn len(&self, _cx: &mut Cx) -> Result<usize>

Number of entries.
Source§

fn clear(&self, _cx: &mut Cx) -> Result<()>

Removes all entries.
Source§

fn is_empty(&self, cx: &mut Cx) -> Result<bool, Error>

Whether the table has no entries.
Source§

fn as_table_expr(&self, cx: &mut Cx) -> Result<Expr, Error>

Projects the table to an Expr::Map.
Source§

fn table_eq( &self, cx: &mut Cx, other: &(dyn Table + 'static), ) -> Result<bool, Error>

Order-insensitive equality against another table’s entries.

Auto Trait Implementations§

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> 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> RuntimeObject for T
where T: Object + ObjectCompat + Any + Send + Sync,

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> 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.