/// <summary>
        /// Computes the filter that includes only leaf filters that satisfy the given predicate.
        /// The result is guaranteed to be less than or equal in restrictiveness to the original.
        /// This means that it will never filter out results that the original filter would not have
        /// filtered.
        /// </summary>
        /// <param name="node"></param>
        /// <param name="predicate"></param>
        /// <returns></returns>
        public static IFilterNode <TFilter> GetPartial <TFilter>(this IFilterNode <TFilter> node, Func <TFilter, bool> predicate)
            where TFilter : IFilter
        => node.Relax(
            filter =>
        {
            if (predicate(filter))
            {
                return(filter.ToLeafFilterNode());
            }

            return(FilterNode <TFilter> .True);
        },
            filter =>
        {
            if (predicate(filter))
            {
                return(filter.ToLeafFilterNode());
            }

            return(FilterNode <TFilter> .False);
        });