pub trait Expandablewhere
Self: Sized,{
type FrameToken: MappableFrame;
// Required method
fn from_frame(val: <Self::FrameToken as MappableFrame>::Frame<Self>) -> Self;
}Expand description
The ability to recursively expand a seed to construct a value of this type, frame by frame.
§Example: A tree of integers
Here’s an example showing how to use Expandable to expand a binary tree of integers,
where nodes hold two subnodes and no data and leaves hold a single usize value
#[derive(Debug, PartialEq, Eq)]
enum IntTree {
Leaf { value: usize },
Node { left: Box<Self>, right: Box<Self> },
}
§Defining a frame type
For working with values of type IntTree, we’ll define an IntTreeFrame<A> frame type
that represents a single layer of the IntTree structure, with A subbed in for Box<Self>
enum IntTreeFrame<A> {
Leaf { value: usize },
Node { left: A, right: A },
}
impl MappableFrame for IntTreeFrame<PartiallyApplied> { /*...*/
}§Implementing Expandable
Then we can define an Expandable instance for IntTree
impl Expandable for IntTree {
type FrameToken = IntTreeFrame<PartiallyApplied>;
fn from_frame(val: <Self::FrameToken as MappableFrame>::Frame<Self>) -> Self {
match val {
IntTreeFrame::Leaf { value } => IntTree::Leaf { value },
IntTreeFrame::Node { left, right } => IntTree::Node {
left: Box::new(left),
right: Box::new(right),
},
}
}
}§Expanding a value into a tree
Finally, we can use our Expandable instance to generate a tree
let depth = 2;
let expanded_tree = IntTree::expand_frames(depth, |n| {
if n <= 0 {
IntTreeFrame::Leaf { value: n }
} else {
IntTreeFrame::Node {
left: n - 1,
right: n - 1,
}
}
});
let expected = IntTree::node(
IntTree::node(IntTree::leaf(0), IntTree::leaf(0)),
IntTree::node(IntTree::leaf(0), IntTree::leaf(0)),
);
assert_eq!(expected, expanded_tree)Required Associated Types§
Required Methods§
Sourcefn from_frame(val: <Self::FrameToken as MappableFrame>::Frame<Self>) -> Self
fn from_frame(val: <Self::FrameToken as MappableFrame>::Frame<Self>) -> Self
Given a frame holding instances of Self, generate an instance of Self
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.