| var noop = function() {}; | 
|   | 
| function ensureFunction(value) { | 
|     return typeof value === 'function' ? value : noop; | 
| } | 
|   | 
| module.exports = function(node, options, context) { | 
|     function walk(node) { | 
|         enter.call(context, node); | 
|   | 
|         switch (node.type) { | 
|             case 'Group': | 
|                 node.terms.forEach(walk); | 
|                 break; | 
|   | 
|             case 'Multiplier': | 
|                 walk(node.term); | 
|                 break; | 
|   | 
|             case 'Type': | 
|             case 'Property': | 
|             case 'Keyword': | 
|             case 'AtKeyword': | 
|             case 'Function': | 
|             case 'String': | 
|             case 'Token': | 
|             case 'Comma': | 
|                 break; | 
|   | 
|             default: | 
|                 throw new Error('Unknown type: ' + node.type); | 
|         } | 
|   | 
|         leave.call(context, node); | 
|     } | 
|   | 
|     var enter = noop; | 
|     var leave = noop; | 
|   | 
|     if (typeof options === 'function') { | 
|         enter = options; | 
|     } else if (options) { | 
|         enter = ensureFunction(options.enter); | 
|         leave = ensureFunction(options.leave); | 
|     } | 
|   | 
|     if (enter === noop && leave === noop) { | 
|         throw new Error('Neither `enter` nor `leave` walker handler is set or both aren\'t a function'); | 
|     } | 
|   | 
|     walk(node, context); | 
| }; |