text: var falafel = require('../');
  var vm = require('vm');
  
  var termExps = [
      'Identifier',
      'CallExpression',
      'BinaryExpression',
      'UpdateExpression',
      'UnaryExpression'
  ].reduce(function (acc, key) {
      acc[key] = true;
      return acc
  }, {});
  
  function terminated(node) {
      for (var p = node; p.parent; p = p.parent) {
          if (termExps[p.type]) return true;
      }
      return false;
  }
  
  var src = '{"a":[2,~9,prompt(":d")],"b":4,"c":prompt("beep"),"d":6}';
  
  var offsets = [];
  var output = falafel('(' + src + ')', function (node) {
      var isLeaf = node.parent
          && !terminated(node.parent) && terminated(node)
      ;
  
      if (isLeaf) {
          var s = node.source();
          var prompted = false;
          var res = vm.runInNewContext('(' + s + ')', {
              prompt: function (x) {
                  setTimeout(function () {
                      node.update(x.toUpperCase());
                  }, Math.random() * 50);
                  prompted = true;
              }
          });
          if (!prompted) {
              var s_ = JSON.stringify(res);
              node.update(s_);
          }
      }
  });
  
  setTimeout(function () {
      console.log(src);
      console.log('---');
      console.log(output);
  }, 200);
  