Skip to main content

ConsList

Struct ConsList 

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

A singly linked, shared cons-cell list.

Each node holds an optional car (the head value) and an optional cdr (a shared reference to the next node). The unique empty list is the node with both fields None; a non-empty list is a chain of ConsList::cell nodes terminated by an empty node. Nodes are shared through Arc, so a cdr is a cheap pointer clone and tails can be shared across many lists.

ConsList is the concrete object behind the cons ListBackend (crate::ConsBackend); it implements the kernel list and object-encoding contracts so the runtime treats it as a first-class list value.

§Examples

use std::sync::Arc;
use sim_kernel::{Cx, DefaultFactory, EagerPolicy, Factory, ListValue, LengthResult};
use sim_list_cell::ConsList;

let mut cx = Cx::new(Arc::new(EagerPolicy), Arc::new(DefaultFactory));

// The empty list.
let empty = ConsList::from_vec(vec![]);
assert!(empty.is_empty(&mut cx).unwrap());
assert_eq!(empty.len(&mut cx).unwrap(), LengthResult::Known(0));

// A two-element list, read by head and tail.
let a = cx.factory().bool(true).unwrap();
let b = cx.factory().bool(false).unwrap();
let xs = ConsList::from_vec(vec![a, b]);
assert_eq!(xs.len(&mut cx).unwrap(), LengthResult::Known(2));
assert!(xs.car(&mut cx).unwrap().is_some());
let tail = xs.cdr(&mut cx).unwrap().unwrap();
let tail = tail.object().as_list().unwrap();
assert_eq!(tail.len(&mut cx).unwrap(), LengthResult::Known(1));

Implementations§

Source§

impl ConsList

Source

pub fn empty() -> Self

Returns the empty list (a node with no head and no tail).

Source

pub fn cell(car: Value, cdr: Arc<ConsList>) -> Self

Builds a non-empty cell prepending car onto the shared tail cdr.

Source

pub fn cell_foreign(car: Value, tail: Value) -> Self

Builds a non-empty cell prepending car onto a foreign list tail.

The tail is kept as an opaque list value rather than materialized, so consing onto a lazy or unbounded list stays lazy.

Source

pub fn from_vec(items: Vec<Value>) -> Arc<Self>

Builds a shared list from items in order, the first item at the head.

Trait Implementations§

Source§

impl Citizen for ConsList

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 ConsList

Source§

fn clone(&self) -> ConsList

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 ListValue for ConsList

Source§

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

Whether the list has no elements.
Source§

fn car(&self, _cx: &mut Cx) -> Result<Option<Value>>

The first element, or Ok(None) when empty.
Source§

fn cdr(&self, cx: &mut Cx) -> Result<Option<Value>>

The tail list after the first element, or Ok(None) when empty.
Source§

fn len(&self, cx: &mut Cx) -> Result<LengthResult>

The length, finite or LengthResult::Unknown for endless lists.
Source§

fn len_cmp(&self, cx: &mut Cx, n: usize) -> Result<Ordering>

Compares the spine length against n without fully forcing the list.
Source§

fn get(&self, cx: &mut Cx, index: usize) -> Result<Option<Value>>

The element at index, or Ok(None) when out of range.
Source§

fn for_each( &self, cx: &mut Cx, limit: Option<usize>, visit: &mut dyn FnMut(&Value), ) -> Result<()>

Visits up to limit elements in order, walking the list spine.
Source§

fn to_vec(&self, cx: &mut Cx, limit: Option<usize>) -> Result<Vec<Value>, Error>

Collects up to limit elements into a vector.
Source§

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

The value to start spine walks from; the receiver itself by default.
Source§

fn as_self_value(&self) -> Option<Value>

The receiver re-wrapped as a Value, when it can produce one.
Source§

impl Object for ConsList

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 ConsList

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_list(&self) -> Option<&dyn ListValue>

List view, if the object is a list value.
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_table_impl(&self) -> Option<&(dyn Table + 'static)>

Table-implementation view, if the object is a table.
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 ConsList

Source§

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

Returns the ObjectEncoding this object should be rendered as.

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.