def walk(fexp, tree)

      ftree = Ruote.compact_tree(@ps.current_tree(fexp))

      if ftree[0] != tree[0] || ftree[1] != tree[1]
        #
        # if there is anything different between the current tree and the
        # desired tree, let's force a re-apply

        register(MutationPoint.new(fexp.fei, tree, :re_apply))

      elsif ftree[2] == tree[2]
        #
        # else, if the tree children are the same, exit, there is nothing to do

        return

      else

        register(MutationPoint.new(fexp.fei, tree, :update))
          #
          # NOTE: maybe a switch for this mutation not to be added would
          #       be necessary...

        if fexp.is_concurrent?
          #
          # concurrent expressions follow a different heuristic

          walk_concurrence(fexp, ftree, tree)

        else
          #
          # all other expressions are considered sequence-like

          walk_sequence(fexp, ftree, tree)
        end
      end
    end
def walk(fexp, tree)

      ftree = Ruote.compact_tree(@ps.current_tree(fexp))

      if ftree[0] != tree[0] || ftree[1] != tree[1]
        #
        # if there is anything different between the current tree and the
        # desired tree, let's force a re-apply

        register(MutationPoint.new(fexp.fei, tree, :re_apply))

      elsif ftree[2] == tree[2]
        #
        # else, if the tree children are the same, exit, there is nothing to do

        return

      else

        register(MutationPoint.new(fexp.fei, tree, :update))
          #
          # NOTE: maybe a switch for this mutation not to be added would
          #       be necessary...

        if fexp.is_concurrent?
          #
          # concurrent expressions follow a different heuristic

          walk_concurrence(fexp, ftree, tree)

        else
          #
          # all other expressions are considered sequence-like

          walk_sequence(fexp, ftree, tree)
        end
      end
    end
Look for mutation points in an expression and its children.