/*
 * jFun - JavaScript Pattern Matching v0.12
 *
 * Licensed under the new BSD License.
 * Copyright 2008, Bram Stein
 * All rights reserved.
 */
var fun=function(){function E(F){var G=typeof F,H=F;return function(I,J){return(typeof I===G&&I===H)||(typeof H==="number"&&isNaN(I)&&isNaN(H))}}function B(F){return function(G,H){return G.constructor===F&&H.push(G)>0}}function D(F){var H=F.length,G=F.map(function(I){return A(I)});return function(I,J){return H===I.length&&I.every(function(L,K){return(K in G)&&G[K](I[K],J)})}}function C(H){var G=H.constructor,I=0,F=Object.map(H,function(K,J){I+=1;return A(K)});return function(J,L){var K=0;return J.constructor===G&&Object.every(J,function(N,M){K+=1;return(M in F)&&F[M](J[M],L)})&&K===I}}function A(F){if(F&&F.constructor===fun.parameter.constructor){return function(G,H){return H.push(G)>0}}else{if(F&&F.constructor===fun.wildcard.constructor){return function(){return true}}else{if(Object.isAtom(F)){return E(F)}else{if(Object.isObject(F)){return C(F)}else{if(Object.isArray(F)){return D(F)}else{if(Object.isFunction(F)){return B(F)}}}}}}}return function(){var G=this,F=Array.slice(arguments).map(function(J,I){var H=J.length;return{m:A(J.slice(0,H-1)),c:J[H-1]}});return function(){var K=Array.slice(arguments),I=[],J=0,H=F.length;for(;J<H;J+=1){if(F[J].m(K,I)){return F[J].c.apply(G,I)}I=[]}throw"No match for: "+K}}}();fun.parameter=function(){function A(){}return new A()}();fun.wildcard=function(){function A(){}return new A()}();