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
impl ConsList
Sourcepub fn cell(car: Value, cdr: Arc<ConsList>) -> Self
pub fn cell(car: Value, cdr: Arc<ConsList>) -> Self
Builds a non-empty cell prepending car onto the shared tail cdr.
Sourcepub fn cell_foreign(car: Value, tail: Value) -> Self
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.
Trait Implementations§
Source§impl Citizen for ConsList
impl Citizen for ConsList
Source§fn citizen_symbol() -> Symbol
fn citizen_symbol() -> Symbol
namespace/name class symbol.Source§fn citizen_version() -> u32
fn citizen_version() -> u32
Source§fn citizen_arity() -> usize
fn citizen_arity() -> usize
Source§fn citizen_fields() -> &'static [&'static str]
fn citizen_fields() -> &'static [&'static str]
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>>
Ok(None) when empty.Source§fn cdr(&self, cx: &mut Cx) -> Result<Option<Value>>
fn cdr(&self, cx: &mut Cx) -> Result<Option<Value>>
Ok(None) when empty.Source§fn len(&self, cx: &mut Cx) -> Result<LengthResult>
fn len(&self, cx: &mut Cx) -> Result<LengthResult>
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>
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>>
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<()>
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>
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>
Source§fn header(&self) -> &ObjectHeader
fn header(&self) -> &ObjectHeader
Source§fn op(&self, _key: &OpKey) -> Option<&dyn Op>
fn op(&self, _key: &OpKey) -> Option<&dyn Op>
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>
Source§fn as_expr(&self, cx: &mut Cx) -> Result<Expr>
fn as_expr(&self, cx: &mut Cx) -> Result<Expr>
Source§fn as_object_encoder(&self) -> Option<&dyn ObjectEncode>
fn as_object_encoder(&self) -> Option<&dyn ObjectEncode>
Source§fn as_callable(&self) -> Option<&dyn Callable>
fn as_callable(&self) -> Option<&dyn Callable>
Source§fn as_read_constructor(&self) -> Option<&dyn ReadConstructor>
fn as_read_constructor(&self) -> Option<&dyn ReadConstructor>
Source§fn as_number_domain(&self) -> Option<&(dyn NumberDomain + 'static)>
fn as_number_domain(&self) -> Option<&(dyn NumberDomain + 'static)>
Source§fn as_number_value(&self) -> Option<&dyn NumberValue>
fn as_number_value(&self) -> Option<&dyn NumberValue>
Source§fn as_eval_fabric(&self) -> Option<&dyn EvalFabric>
fn as_eval_fabric(&self) -> Option<&dyn EvalFabric>
Source§fn as_sequence(&self) -> Option<&dyn Sequence>
fn as_sequence(&self) -> Option<&dyn Sequence>
Source§fn as_table_impl(&self) -> Option<&(dyn Table + 'static)>
fn as_table_impl(&self) -> Option<&(dyn Table + 'static)>
Source§fn as_dir(&self) -> Option<&(dyn Dir + 'static)>
fn as_dir(&self) -> Option<&(dyn Dir + 'static)>
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>
ObjectEncoding this object should be rendered as.