class JMESPath::Nodes::Subexpression

def flatten

def flatten
  nodes = [@left, @right]
  until nodes.none? { |node| node.is_a?(Subexpression) }
    nodes = nodes.flat_map do |node|
      if node.is_a?(Subexpression)
        [node.left, node.right]
      else
        [node]
      end
    end
  end
  nodes.map(&:optimize)
end

def initialize(left, right)

def initialize(left, right)
  @left = left
  @right = right
end

def optimize

def optimize
  Chain.new(flatten).optimize
end

def visit(value)

def visit(value)
  @right.visit(@left.visit(value))
end