// Node vs browser behavior var types = {}; if (typeof module === 'undefined') { var exports = types; } // General functions function _obj_type(obj) { if (_symbol_Q(obj)) { return 'symbol'; } else if (_list_Q(obj)) { return 'list'; } else if (_vector_Q(obj)) { return 'vector'; } else if (_hash_map_Q(obj)) { return 'hash-map'; } else if (_nil_Q(obj)) { return 'nil'; } else if (_true_Q(obj)) { return 'true'; } else if (_false_Q(obj)) { return 'false'; } else if (_atom_Q(obj)) { return 'atom'; } else { switch (typeof(obj)) { case 'number': return 'number'; case 'function': return 'function'; case 'string': return obj[0] == '\u029e' ? 'keyword' : 'string'; default: throw new Error("Unknown type '" + typeof(obj) + "'"); } } } function _sequential_Q(lst) { return _list_Q(lst) || _vector_Q(lst); } function _equal_Q (a, b) { var ota = _obj_type(a), otb = _obj_type(b); if (!(ota === otb || (_sequential_Q(a) && _sequential_Q(b)))) { return false; } switch (ota) { case 'symbol': return a.value === b.value; case 'list': case 'vector': if (a.length !== b.length) { return false; } for (var i=0; i