/// <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);
    }