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:TreeNodeRecursionspecifying 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:TreeNodeRecursionspecifying how the recursion ended.
See also
Transformed::update_datato modify the node without changing thetransformedflagTransformed::map_datafor fallable operation that return the same typeTransformed::transform_datato chain fallable transformationsTransformedResultfor 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: TreeNodeRecursionImplementations§
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 complete(data: T) -> Self
pub fn complete(data: T) -> Self
Wrapper for transformed data with TreeNodeRecursion::Stop 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.
Trait Implementations§
Source§impl<T: Debug> Debug for Transformed<T>
impl<T: Debug> Debug for Transformed<T>
Source§impl<T: PartialEq> PartialEq for Transformed<T>
impl<T: PartialEq> PartialEq for Transformed<T>
impl<T> StructuralPartialEq for Transformed<T>
Auto Trait Implementations§
impl<T> Freeze for Transformed<T>where
T: Freeze,
impl<T> RefUnwindSafe for Transformed<T>where
T: RefUnwindSafe,
impl<T> Send for Transformed<T>where
T: Send,
impl<T> Sync for Transformed<T>where
T: Sync,
impl<T> Unpin for Transformed<T>where
T: Unpin,
impl<T> UnwindSafe for Transformed<T>where
T: UnwindSafe,
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
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more