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§
Trait Implementations§
Source§impl Citizen for ConsList
impl Citizen for ConsList
Source§fn citizen_symbol() -> Symbol
fn citizen_symbol() -> Symbol
The citizen’s
namespace/name class symbol.Source§fn citizen_version() -> u32
fn citizen_version() -> u32
The citizen’s encoding version.
Source§fn citizen_arity() -> usize
fn citizen_arity() -> usize
Number of constructor fields (excluding the version argument).
Source§fn citizen_fields() -> &'static [&'static str]
fn citizen_fields() -> &'static [&'static str]
The citizen’s field names, in constructor order.
Source§impl ListValue for ConsList
impl ListValue for ConsList
Source§fn car(&self, _cx: &mut Cx) -> Result<Option<Value>>
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>>
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>
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>
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>>
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<()>
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>
fn to_vec(&self, cx: &mut Cx, limit: Option<usize>) -> Result<Vec<Value>, Error>
Collects up to
limit elements into a vector.Source§impl Object for ConsList
impl Object for ConsList
Source§fn display(&self, _cx: &mut Cx) -> Result<String>
fn display(&self, _cx: &mut Cx) -> Result<String>
Render the object as a human-readable display string.
Source§fn header(&self) -> &ObjectHeader
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>
fn op(&self, _key: &OpKey) -> Option<&dyn Op>
Resolve the operation registered under
key, if any.Source§impl ObjectCompat for ConsList
impl ObjectCompat for ConsList
Source§fn class(&self, cx: &mut Cx) -> Result<ClassRef>
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>
fn as_expr(&self, cx: &mut Cx) -> Result<Expr>
Expression form of the object; defaults to an opaque extension node.
Source§fn as_object_encoder(&self) -> Option<&dyn ObjectEncode>
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>
fn as_callable(&self) -> Option<&dyn Callable>
Callable view, if the object can be invoked.
Source§fn as_read_constructor(&self) -> Option<&dyn ReadConstructor>
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)>
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>
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>
fn as_eval_fabric(&self) -> Option<&dyn EvalFabric>
Eval-fabric view, if the object is a distributed eval surface.
Source§fn as_sequence(&self) -> Option<&dyn Sequence>
fn as_sequence(&self) -> Option<&dyn Sequence>
Sequence view, if the object is a sequence.
Source§fn as_table_impl(&self) -> Option<&(dyn Table + 'static)>
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)>
fn as_dir(&self) -> Option<&(dyn Dir + 'static)>
Directory view, if the object is a directory.
Source§impl ObjectEncode for ConsList
impl ObjectEncode for ConsList
Source§fn object_encoding(&self, cx: &mut Cx) -> Result<ObjectEncoding>
fn object_encoding(&self, cx: &mut Cx) -> Result<ObjectEncoding>
Returns the
ObjectEncoding this object should be rendered as.Auto Trait Implementations§
impl !RefUnwindSafe for ConsList
impl !UnwindSafe for ConsList
impl Freeze for ConsList
impl Send for ConsList
impl Sync for ConsList
impl Unpin for ConsList
impl UnsafeUnpin for ConsList
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more