adt-simple
Version:
Algebraic data types for JavaScript using Sweet.js macros
8 lines • 4.2 kB
JavaScript
/*!
* adt-simple
* ----------
* author: Nathan Faubion <nathan@n-son.com>
* version: 0.1.3
* license: MIT
*/
!function(a,b){"function"==typeof define&&define.amd?define("adt-simple",b):"object"==typeof exports?module.exports=b():a.adt=exports}(this,function(){function a(a,b){for(var c=0,d=a.length;d>c;c++)b(a[c],c,a)}function b(a,b){for(var c=[],d=0,e=a.length;e>d;d++)c[c.length]=b(a[d],d,a);return c}function c(b){return function(c){return a(c.variants,function(a){b(a,c)}),c}}function d(){var a=arguments;return{derive:function(b){for(var c=b,d=0,e=a.length;e>d;d++)c=a[d].derive(c);return c}}}function e(a,b){switch(b.length){case 0:return a();case 1:return a(b[0]);case 2:return a(b[0],b[1]);case 3:return a(b[0],b[1],b[2]);case 4:return a(b[0],b[1],b[2],b[3]);default:return a.apply(null,b)}}function f(a,b){var c,d,e=[];for(c=0,d=a.length;d>c;c++)e[e.length]=a[c];for(c=0,d=b.length;d>c;c++)e[e.length]=b[c];return e}var g={nativeEquals:function(a,b){return a===b},derive:c(function(a){a.prototype.equals=a.fields?function(b){if(this===b)return!0;if(!(b instanceof a.constructor))return!1;for(var c=0,d=a.fields.length;d>c;c++){var e=a.fields[c],f=this[e],h=b[e];if(f&&f.equals){if(!f.equals(h))return!1}else if(!g.nativeEquals(f,h))return!1}return!0}:function(a){return this===a}})},h={nativeClone:function(a){return a},derive:c(function(a){a.prototype.clone=a.fields?function(){var c=this,d=b(a.fields,function(a){var b=c[a];return b&&b.clone?b.clone():h.nativeClone(b)});return e(a.constructor,d)}:function(){return this}})},i={derive:c(function(a,c){a.fields&&(a.constructor.create=function(d){var f=b(a.fields,function(b){if(!d.hasOwnProperty(b))throw new TypeError("Missing field: "+[c.name,a.name,b].join("."));return d[b]});return e(a.constructor,f)},a.prototype.set=function(c){var d=this,f=b(a.fields,function(a){return c.hasOwnProperty(a)?c[a]:d[a]});return e(a.constructor,f)})})},j={toString:function(a){return null===a?"null":void 0===a?"undefined":"[object Array]"===Object.prototype.toString.call(a)?"["+b(a,function(a){return j.toString(a)}).join(", ")+"]":a.toString()},derive:c(function(a){a.prototype.toString=a.fields?function(){var c=this;return a.name+"("+b(a.fields,function(a){return j.toString(c[a])}).join(", ")+")"}:function(){return a.name}})},k={toJSONValue:function(a){return a&&"object"==typeof a&&a.toJSON?a.toJSON():a},derive:c(function(b){b.prototype.toJSON=b.fields?function(){var c={},d=this;return a(b.fields,function(a){c[a]=k.toJSONValue(d[a])}),c}:function(){return this.hasOwnProperty("value")?this.value:b.name}})},l={derive:c(function(a,b){function c(){var b=arguments;if(b.length<a.fields.length)return function(){return e(c,f(b,arguments))};var g=e(d,b);return g}if(a.fields&&a.fields.length){var d=a.constructor;if(a.constructor=c,a.constructor.prototype=d.prototype,a.prototype.constructor=c,b.constructor===d){b.constructor=a.constructor;for(var g in d)d.hasOwnProperty(g)&&(b.constructor[g]=d[g])}}})},m={derive:c(function(c){c.fields?(c.constructor.hasInstance=function(a){return a&&a.constructor===c.constructor},c.constructor.unapply=function(a){return c.constructor.hasInstance(a)?b(c.fields,function(b){return a[b]}):void 0},c.constructor.unapplyObject=function(b){if(c.constructor.hasInstance(b)){var d={};return a(c.fields,function(a){d[a]=b[a]}),d}}):c.prototype.hasInstance=function(a){return a===this}})},n={derive:function(a){return a.constructor.__names__=b(a.variants,function(a){return a.prototype["is"+a.name]=!0,a.constructor.__fields__=a.fields?a.fields.slice():null,a.name}),a}},o={derive:c(function(a,c){a.prototype.cata=function(d){if(!d.hasOwnProperty(a.name))throw new TypeError("No branch for: "+[c.name,a.name].join("."));var e=this,f=a.fields?b(a.fields,function(a){return e[a]}):[];return d[a.name].apply(this,f)}})},p={derive:function(a){var b=a.variants&&a.variants[0]&&a.variants[0].constructor===a.constructor&&!a.variants[0].fields?a.prototype:a.constructor;return b.deriving=function(){for(var b,c=a,d=0;b=arguments[d];d++)c=b.derive(c)},a}},q=d(g,h,i,j,n,m);return{eachVariant:c,composeDeriving:d,Eq:g,Clone:h,Setter:i,ToString:j,ToJSON:k,Curry:l,Extractor:m,Reflect:n,Cata:o,LateDeriving:p,Base:q}});