pub struct Transformed<T> {
pub data: T,
pub transformed: bool,
pub tnr: TreeNodeRecursion,
}
Expand description
Result of tree walk / transformation APIs
Transformed
is a wrapper around the tree node data (e.g. Expr
or
LogicalPlan
). It is used to indicate whether the node was transformed
and how the recursion should proceed.
TreeNode
API users control the transformation by returning:
- The resulting (possibly transformed) node,
transformed
: flag indicating whether any change was made to the nodetnr
:TreeNodeRecursion
specifying how to proceed with the recursion.
At the end of the transformation, the return value will contain:
- The final (possibly transformed) tree,
transformed
: flag indicating whether any change was made to the nodetnr
:TreeNodeRecursion
specifying how the recursion ended.
See also
Transformed::update_data
to modify the node without changing thetransformed
flagTransformed::map_data
for fallable operation that return the same typeTransformed::transform_data
to chain fallable transformationsTransformedResult
for working withResult<Transformed<U>>
§Examples
Use Transformed::yes
and Transformed::no
to signal that a node was
rewritten and the recursion should continue:
let expr = orig_expr();
// Create a new `Transformed` object signaling the node was not rewritten
let ret = Transformed::no(expr.clone());
assert!(!ret.transformed);
// Create a new `Transformed` object signaling the node was rewritten
let ret = Transformed::yes(expr);
assert!(ret.transformed)
Access the node within the Transformed
object:
let expr = orig_expr();
// `Transformed` object signaling the node was not rewritten
let ret = Transformed::no(expr.clone());
// Access the inner object using .data
assert_eq!(expr, ret.data);
Transform the node within the Transformed
object.
let expr = orig_expr();
let ret = Transformed::no(expr.clone())
.transform_data(|expr| {
// closure returns a result and potentially transforms the node
// in this example, it does transform the node
let new_expr = make_new_expr(expr);
Ok(Transformed::yes(new_expr))
}).unwrap();
// transformed flag is the union of the original ans closure's transformed flag
assert!(ret.transformed);
§Example APIs that use TreeNode
Fields§
§data: T
§transformed: bool
§tnr: TreeNodeRecursion
Implementations§
Source§impl<T> Transformed<T>
impl<T> Transformed<T>
Sourcepub fn new(data: T, transformed: bool, tnr: TreeNodeRecursion) -> Self
pub fn new(data: T, transformed: bool, tnr: TreeNodeRecursion) -> Self
Create a new Transformed
object with the given information.
Sourcepub fn new_transformed(data: T, transformed: bool) -> Self
pub fn new_transformed(data: T, transformed: bool) -> Self
Create a Transformed
with transformed
and TreeNodeRecursion::Continue
.
Sourcepub fn yes(data: T) -> Self
pub fn yes(data: T) -> Self
Wrapper for transformed data with TreeNodeRecursion::Continue
statement.
Sourcepub fn no(data: T) -> Self
pub fn no(data: T) -> Self
Wrapper for unchanged data with TreeNodeRecursion::Continue
statement.
Sourcepub fn update_data<U, F: FnOnce(T) -> U>(self, f: F) -> Transformed<U>
pub fn update_data<U, F: FnOnce(T) -> U>(self, f: F) -> Transformed<U>
Applies an infallible f
to the data of this Transformed
object,
without modifying the transformed
flag.
Sourcepub fn map_data<U, F: FnOnce(T) -> Result<U>>(
self,
f: F,
) -> Result<Transformed<U>>
pub fn map_data<U, F: FnOnce(T) -> Result<U>>( self, f: F, ) -> Result<Transformed<U>>
Applies a fallible f
(returns Result
) to the data of this
Transformed
object, without modifying the transformed
flag.
Sourcepub fn transform_data<U, F: FnOnce(T) -> Result<Transformed<U>>>(
self,
f: F,
) -> Result<Transformed<U>>
pub fn transform_data<U, F: FnOnce(T) -> Result<Transformed<U>>>( self, f: F, ) -> Result<Transformed<U>>
Applies a fallible transforming f
to the data of this Transformed
object.
The returned Transformed
object has the transformed
flag set if either
self
or the return value of f
have the transformed
flag set.
Sourcepub fn transform_children<F: FnOnce(T) -> Result<Transformed<T>>>(
self,
f: F,
) -> Result<Transformed<T>>
pub fn transform_children<F: FnOnce(T) -> Result<Transformed<T>>>( self, f: F, ) -> Result<Transformed<T>>
Maps the Transformed
object to the result of the given f
depending on the
current TreeNodeRecursion
value and the fact that f
is changing the current
node’s children.
Sourcepub fn transform_sibling<F: FnOnce(T) -> Result<Transformed<T>>>(
self,
f: F,
) -> Result<Transformed<T>>
pub fn transform_sibling<F: FnOnce(T) -> Result<Transformed<T>>>( self, f: F, ) -> Result<Transformed<T>>
Maps the Transformed
object to the result of the given f
depending on the
current TreeNodeRecursion
value and the fact that f
is changing the current
node’s sibling.
Sourcepub fn transform_parent<F: FnOnce(T) -> Result<Transformed<T>>>(
self,
f: F,
) -> Result<Transformed<T>>
pub fn transform_parent<F: FnOnce(T) -> Result<Transformed<T>>>( self, f: F, ) -> Result<Transformed<T>>
Maps the Transformed
object to the result of the given f
depending on the
current TreeNodeRecursion
value and the fact that f
is changing the current
node’s parent.