pub struct Cactus<T> { /* private fields */ }
Expand description
An immutable cactus stack node. May be empty or contain a value; may have a pointer to a parent or not.
Implementations§
source§impl<T> Cactus<T>
impl<T> Cactus<T>
sourcepub fn is_empty(&self) -> bool
pub fn is_empty(&self) -> bool
Is this cactus stack node empty?
Examples
use cactus::Cactus;
let c = Cactus::new();
assert!(c.is_empty());
let c2 = c.child(1);
assert!(!c2.is_empty());
sourcepub fn child(&self, val: T) -> Cactus<T>
pub fn child(&self, val: T) -> Cactus<T>
Create a new cactus stack node containing value val
and pointing to parent self
.
Examples
use cactus::Cactus;
let c = Cactus::new();
let c2 = c.child(1);
let c3 = c2.child(2);
assert_eq!(c3.vals().cloned().collect::<Vec<_>>(), [2, 1]);
sourcepub fn parent(&self) -> Option<Cactus<T>>
pub fn parent(&self) -> Option<Cactus<T>>
Return this cactus stack node’s parent node or None
if this cactus stack is empty.
Examples
use cactus::Cactus;
let c = Cactus::new();
let c2 = c.child(1);
assert_eq!(c.parent(), None);
assert_eq!(c2.val(), Some(&1));
assert_eq!(c2.parent().unwrap(), Cactus::new());
sourcepub fn val(&self) -> Option<&T>
pub fn val(&self) -> Option<&T>
Return a reference to this cactus stack node’s value or None
if this cactus stack is
empty.
Examples
use cactus::Cactus;
let c = Cactus::new().child(1);
assert_eq!(c.val(), Some(&1));
assert_eq!(c.parent().unwrap().val(), None);
sourcepub fn nodes(&self) -> CactusNodesIter<'_, T> ⓘ
pub fn nodes(&self) -> CactusNodesIter<'_, T> ⓘ
Return an iterator over this cactus stack’s nodes. Note that the iterator produces nodes starting from this node and then walking up towards the root.
Examples
use cactus::Cactus;
let c = Cactus::new().child(1).child(2).child(3);
assert_eq!(c.nodes().skip(1).next(), Some(Cactus::new().child(1).child(2)));
sourcepub fn vals(&self) -> CactusValsIter<'_, T> ⓘ
pub fn vals(&self) -> CactusValsIter<'_, T> ⓘ
Return an iterator over this cactus stack’s values. Note that the iterator produces values starting from this node and then walking up towards the root.
Examples
use cactus::Cactus;
let c = Cactus::new().child(1).child(2).child(3);
assert_eq!(c.vals().cloned().collect::<Vec<_>>(), [3, 2, 1]);
sourcepub fn try_unwrap(self) -> Result<T, Cactus<T>>
pub fn try_unwrap(self) -> Result<T, Cactus<T>>
Try to consume this Cactus node and return its data. If the cactus node has no children, this succeeds; if the cactus node has children, it fails, and returns the original cactus node.
Examples
use cactus::Cactus;
let c = Cactus::new().child(1).child(2);
let p = c.parent().unwrap();
assert_eq!(c.try_unwrap().unwrap(), 2);
// At this point the c variable can no longer be referenced (its value has moved).
assert_eq!(p.val(), Some(&1));
let d = Cactus::new().child(1);
let d1 = d.child(2);
let d2 = d.child(3);
// At this point d.try_unwrap().unwrap() would return an Err, as d has two children that
// prevent the underlying Cactus from being consumed. We then need to manually clone the
// value if we want to access it uniformly.
assert_eq!(d.try_unwrap().unwrap_or_else(|c| c.val().unwrap().clone()), 1);
// At this point the d variable can no loner be referenced (its value has moved),
// but we can still access the contents it once pointed to:
assert_eq!(*d1.parent().unwrap().val().unwrap(), 1);