module Roda::RodaPlugins::ReeRoutes::ClassMethods

def build_traverse_tree_proc(tree, context)

def build_traverse_tree_proc(tree, context)
  has_arbitrary_param = tree.values[0].start_with?(":")
  route_parts = has_arbitrary_param ? tree.values.map { _1.gsub(":", "") } : tree.values
  procs = []
  child_procs = tree.children.map do |child|
    build_traverse_tree_proc(child, context)
  end
  route_procs = tree.routes.map do |route|
    route_proc(route, context)
  end
  procs << if tree.children.length > 0
    if has_arbitrary_param
      Proc.new do |r|
        r.on String do |param_val|
          route_parts.each do |route_part|
            r.params[route_part] = param_val
          end
          child_procs.each do |child_proc|
            r.instance_exec(r, &child_proc)
          end
          r.is do
            route_procs.each do |route_proc|
              r.instance_exec(r, &route_proc)
            end
          end
          nil
        end
      end
    else
      Proc.new do |r|
        r.on route_parts[0] do
          child_procs.each do |child_proc|
            r.instance_exec(r, &child_proc)
          end
          r.is do
            route_procs.each do |route_proc|
              r.instance_exec(r, &route_proc)
            end
          end
          nil
        end
      end
    end
  else
    Proc.new do |r|
      if has_arbitrary_param
        r.is String do |param_val|
          route_parts.each do |route_part|
            r.params[route_part] = param_val
          end
          r.is do
            route_procs.each do |route_proc|
              r.instance_exec(r, &route_proc)
            end
          end
          nil
        end
      else
        r.is route_parts[0] do
          r.is do
            route_procs.each do |route_proc|
              r.instance_exec(r, &route_proc)
            end
          end
          nil
        end
      end
    end
  end
  Proc.new do |r|
    procs.each do |proc|
      r.instance_exec(r, &proc)
    end
  end
end