1 // Generated by LiveScript 1.2.0
3 var ref$, id, reject, parsedTypeCheck, types, tokenRegex, toString$ = {}.toString;
4 ref$ = require('prelude-ls'), id = ref$.id, reject = ref$.reject;
5 parsedTypeCheck = require('type-check').parsedTypeCheck;
8 switch (toString$.call(it).slice(8, -1)) {
10 return coerceType(it, {
14 return coerceType(it, {
20 value: coerceTypes(it, [
46 Undefined: function(it){
47 if (it === 'undefined') {
70 Boolean: function(it){
76 } else if (it === 'false') {
102 value: parseFloat(it)
105 Date: function(value, options){
107 if (that = /^\#(.*)\#$/.exec(value)) {
110 value: new Date(+that[1] || that[1])
112 } else if (options.explicit) {
119 value: new Date(+value || value)
123 RegExp: function(value, options){
125 if (that = /^\/(.*)\/([gimy]*)$/.exec(value)) {
128 value: new RegExp(that[1], that[2])
130 } else if (options.explicit) {
137 value: new RegExp(value)
142 return coerceArray(it, {
148 Object: function(it){
149 return coerceFields(it, {
153 String: function(it){
155 if (that = it.match(/^'(.*)'$/)) {
160 } else if (that = it.match(/^"(.*)"$/)) {
173 function coerceArray(node, type){
175 if (toString$.call(node).slice(8, -1) !== 'Array') {
184 var i$, ref$, len$, results$ = [];
185 for (i$ = 0, len$ = (ref$ = node).length; i$ < len$; ++i$) {
187 results$.push(coerceTypes(element, typeOf));
193 function coerceTuple(node, type){
195 if (toString$.call(node).slice(8, -1) !== 'Array') {
203 var i$, ref$, len$, results$ = [];
204 for (i$ = 0, len$ = (ref$ = type.of).length; i$ < len$; ++i$) {
207 results$.push(coerceTypes(node[i], types));
213 function coerceFields(node, type){
214 var typeOf, key, value;
215 if (toString$.call(node).slice(8, -1) !== 'Object') {
224 var ref$, results$ = {};
225 for (key in ref$ = node) {
227 results$[key] = coerceTypes(value, typeOf[key] || [{
235 function coerceType(node, typeObj, options){
236 var type, structure, coerceFunc;
237 type = typeObj.type, structure = typeObj.structure;
239 coerceFunc = types[type];
240 return coerceFunc(node, options);
244 return coerceArray(node, typeObj);
246 return coerceTuple(node, typeObj);
248 return coerceFields(node, typeObj);
252 function coerceTypes(node, types, options){
253 var i$, len$, type, ref$, valueType, value;
254 options == null && (options = {});
255 for (i$ = 0, len$ = types.length; i$ < len$; ++i$) {
257 ref$ = coerceType(node, type, options), valueType = ref$.type, value = ref$.value;
258 if (valueType === 'Nothing') {
261 if (parsedTypeCheck([type], value)) {
265 throw new Error("Value '" + node + "' does not type check against " + JSON.stringify(types) + ".");
267 function consumeOp(tokens, op){
268 if (tokens[0] === op) {
269 return tokens.shift();
271 throw new Error("Expected '" + op + "', but got " + tokens[0] + " instead.");
274 function maybeConsumeOp(tokens, op){
275 if (tokens[0] === op) {
276 return tokens.shift();
279 function consumeList(tokens, delimiters, hasDelimiters){
282 consumeOp(tokens, delimiters[0]);
285 while (tokens.length && tokens[0] !== delimiters[1]) {
286 result.push(consumeElement(tokens));
287 maybeConsumeOp(tokens, ',');
290 consumeOp(tokens, delimiters[1]);
294 function consumeArray(tokens, hasDelimiters){
295 return consumeList(tokens, ['[', ']'], hasDelimiters);
297 function consumeTuple(tokens, hasDelimiters){
298 return consumeList(tokens, ['(', ')'], hasDelimiters);
300 function consumeFields(tokens, hasDelimiters){
303 consumeOp(tokens, '{');
306 while (tokens.length && (!hasDelimiters || tokens[0] !== '}')) {
307 key = tokens.shift();
308 consumeOp(tokens, ':');
309 result[key] = consumeElement(tokens);
310 maybeConsumeOp(tokens, ',');
313 consumeOp(tokens, '}');
317 function consumeElement(tokens){
320 return consumeArray(tokens, true);
322 return consumeTuple(tokens, true);
324 return consumeFields(tokens, true);
326 return tokens.shift();
329 function consumeTopLevel(tokens, types){
330 var structure, origTokens, result;
331 structure = types[0].structure;
332 if (types.length === 1 && structure) {
333 origTokens = tokens.slice();
334 result = structure === 'array'
335 ? consumeArray(tokens, tokens[0] === '[')
336 : structure === 'tuple'
337 ? consumeTuple(tokens, tokens[0] === '(')
338 : consumeFields(tokens, tokens[0] === '{');
340 return consumeElement(structure === 'array'
341 ? ['['].concat(origTokens, [']'])
342 : ['('].concat(origTokens, [')']));
347 return consumeElement(tokens);
350 tokenRegex = /("(?:[^"]|\\")*")|('(?:[^']|\\')*')|(#.*#)|(\/(?:\\\/|[^\/])*\/[gimy]*)|([\[\]\(\)}{:,])|([-\.\$\w]+)|\s*/;
351 function coerce(types, string){
353 tokens = reject(function(it){
354 return !it || /^\s+$/.test(it);
355 }, string.split(tokenRegex));
356 node = consumeTopLevel(tokens, types);
358 throw new Error("Error parsing " + string);
360 return coerceTypes(node, types);
362 module.exports = coerce;