// Generated by LiveScript 1.2.0 (function(){ var ref$, any, all, isItNaN, types, defaultType, customTypes, toString$ = {}.toString; ref$ = require('prelude-ls'), any = ref$.any, all = ref$.all, isItNaN = ref$.isItNaN; types = { Number: { typeOf: 'Number', validate: function(it){ return !isItNaN(it); } }, NaN: { typeOf: 'Number', validate: isItNaN }, Int: { typeOf: 'Number', validate: function(it){ return !isItNaN(it) && it % 1 === 0; } }, Float: { typeOf: 'Number', validate: function(it){ return !isItNaN(it); } }, Date: { typeOf: 'Date', validate: function(it){ return !isItNaN(it.getTime()); } } }; defaultType = { array: 'Array', tuple: 'Array' }; function checkArray(input, type){ return all(function(it){ return checkMultiple(it, type.of); }, input); } function checkTuple(input, type){ var i, i$, ref$, len$, types; i = 0; for (i$ = 0, len$ = (ref$ = type.of).length; i$ < len$; ++i$) { types = ref$[i$]; if (!checkMultiple(input[i], types)) { return false; } i++; } return input.length <= i; } function checkFields(input, type){ var inputKeys, numInputKeys, k, numOfKeys, key, ref$, types; inputKeys = {}; numInputKeys = 0; for (k in input) { inputKeys[k] = true; numInputKeys++; } numOfKeys = 0; for (key in ref$ = type.of) { types = ref$[key]; if (!checkMultiple(input[key], types)) { return false; } if (inputKeys[key]) { numOfKeys++; } } return type.subset || numInputKeys === numOfKeys; } function checkStructure(input, type){ if (!(input instanceof Object)) { return false; } switch (type.structure) { case 'fields': return checkFields(input, type); case 'array': return checkArray(input, type); case 'tuple': return checkTuple(input, type); } } function check(input, typeObj){ var type, structure, setting, that; type = typeObj.type, structure = typeObj.structure; if (type) { if (type === '*') { return true; } setting = customTypes[type] || types[type]; if (setting) { return setting.typeOf === toString$.call(input).slice(8, -1) && setting.validate(input); } else { return type === toString$.call(input).slice(8, -1) && (!structure || checkStructure(input, typeObj)); } } else if (structure) { if (that = defaultType[structure]) { if (that !== toString$.call(input).slice(8, -1)) { return false; } } return checkStructure(input, typeObj); } else { throw new Error("No type defined. Input: " + input + "."); } } function checkMultiple(input, types){ if (toString$.call(types).slice(8, -1) !== 'Array') { throw new Error("Types must be in an array. Input: " + input + "."); } return any(function(it){ return check(input, it); }, types); } module.exports = function(parsedType, input, options){ options == null && (options = {}); customTypes = options.customTypes || {}; return checkMultiple(input, parsedType); }; }).call(this);