--- /dev/null
+'use strict'
+
+module.exports = convert
+
+function convert(test) {
+ if (typeof test === 'string') {
+ return typeFactory(test)
+ }
+
+ if (test === null || test === undefined) {
+ return ok
+ }
+
+ if (typeof test === 'object') {
+ return ('length' in test ? anyFactory : matchesFactory)(test)
+ }
+
+ if (typeof test === 'function') {
+ return test
+ }
+
+ throw new Error('Expected function, string, or object as test')
+}
+
+function convertAll(tests) {
+ var results = []
+ var length = tests.length
+ var index = -1
+
+ while (++index < length) {
+ results[index] = convert(tests[index])
+ }
+
+ return results
+}
+
+// Utility assert each property in `test` is represented in `node`, and each
+// values are strictly equal.
+function matchesFactory(test) {
+ return matches
+
+ function matches(node) {
+ var key
+
+ for (key in test) {
+ if (node[key] !== test[key]) {
+ return false
+ }
+ }
+
+ return true
+ }
+}
+
+function anyFactory(tests) {
+ var checks = convertAll(tests)
+ var length = checks.length
+
+ return matches
+
+ function matches() {
+ var index = -1
+
+ while (++index < length) {
+ if (checks[index].apply(this, arguments)) {
+ return true
+ }
+ }
+
+ return false
+ }
+}
+
+// Utility to convert a string into a function which checks a given node’s type
+// for said string.
+function typeFactory(test) {
+ return type
+
+ function type(node) {
+ return Boolean(node && node.type === test)
+ }
+}
+
+// Utility to return true.
+function ok() {
+ return true
+}