// Generated by LiveScript 1.6.0 (function(){ var ref$, any, all, isItNaN, types, defaultType, 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, options){ return all(function(it){ return checkMultiple(it, type.of, options); }, input); } function checkTuple(input, type, options){ 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, options)) { return false; } i++; } return input.length <= i; } function checkFields(input, type, options){ 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, options)) { return false; } if (inputKeys[key]) { numOfKeys++; } } return type.subset || numInputKeys === numOfKeys; } function checkStructure(input, type, options){ if (!(input instanceof Object)) { return false; } switch (type.structure) { case 'fields': return checkFields(input, type, options); case 'array': return checkArray(input, type, options); case 'tuple': return checkTuple(input, type, options); } } function check(input, typeObj, options){ var type, structure, setting, that; type = typeObj.type, structure = typeObj.structure; if (type) { if (type === '*') { return true; } setting = options.customTypes[type] || types[type]; if (setting) { return (setting.typeOf === void 8 || setting.typeOf === toString$.call(input).slice(8, -1)) && setting.validate(input); } else { return type === toString$.call(input).slice(8, -1) && (!structure || checkStructure(input, typeObj, options)); } } else if (structure) { if (that = defaultType[structure]) { if (that !== toString$.call(input).slice(8, -1)) { return false; } } return checkStructure(input, typeObj, options); } else { throw new Error("No type defined. Input: " + input + "."); } } function checkMultiple(input, types, options){ 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, options); }, types); } module.exports = function(parsedType, input, options){ options == null && (options = {}); if (options.customTypes == null) { options.customTypes = {}; } return checkMultiple(input, parsedType, options); }; }).call(this);