// Generated by LiveScript 1.4.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);
|