/// <summary> /// Update the immediate children of the value by applying a transformation function to each one. /// </summary> /// <typeparam name="T">The rewritable tree type</typeparam> /// <param name="rewriter">The rewriter</param> /// <param name="transformer">A transformation function to apply to each of <paramref name="value"/>'s immediate children.</param> /// <param name="value">The old value, whose immediate children should be transformed by <paramref name="transformer"/>.</param> /// <returns>A copy of <paramref name="value"/> with updated children.</returns> public static T RewriteChildren <T>(this IRewriter <T> rewriter, Func <T, T> transformer, T value) { if (rewriter == null) { throw new ArgumentNullException(nameof(rewriter)); } if (transformer == null) { throw new ArgumentNullException(nameof(transformer)); } var chunks = new ChunkStack <T>(); var result = rewriter.RewriteChildrenInternal(transformer, value, ref chunks); chunks.Dispose(); return(result); }
/// <summary> /// Update the immediate children of the value by applying an asynchronous transformation function to each one. /// </summary> /// <typeparam name="T">The rewritable tree type</typeparam> /// <param name="rewriter">The rewriter</param> /// <param name="transformer">An asynchronous transformation function to apply to each of <paramref name="value"/>'s immediate children.</param> /// <param name="value">The old value, whose immediate children should be transformed by <paramref name="transformer"/>.</param> /// <returns>A copy of <paramref name="value"/> with updated children.</returns> /// <remarks>This method is not available on platforms which do not support <see cref="ValueTask"/>.</remarks> public static async ValueTask <T> RewriteChildren <T>( this IRewriter <T> rewriter, Func <T, ValueTask <T> > transformer, T value ) { if (rewriter == null) { throw new ArgumentNullException(nameof(rewriter)); } if (transformer == null) { throw new ArgumentNullException(nameof(transformer)); } var chunks = new Box <ChunkStack <T> >(new ChunkStack <T>()); var result = await rewriter.RewriteChildrenInternal(transformer, value, chunks).ConfigureAwait(false); chunks.Value.Dispose(); return(result); }