crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
70 lines (51 loc) • 1.7 kB
JavaScript
/** @license ISC License (c) copyright 2016 original and current authors */
/** @author Ian Hofmann-Hicks (evil) */
var VERSION = 2
var _implements = require('../core/implements')
var _inspect = require('../core/inspect')
var _equals = require('../core/equals')
var type = require('../core/types').type('Prod')
var _type = require('../core/types').typeFn(type(), VERSION)
var fl = require('../core/flNames')
var isNil = require('../core/isNil')
var isNumber = require('../core/isNumber')
var isSameType = require('../core/isSameType')
var _empty =
function () { return Prod(1); }
function Prod(n) {
var obj;
var x = isNil(n) ? _empty().valueOf() : n
if(!arguments.length || !isNumber(x)) {
throw new TypeError('Prod: Numeric value required')
}
var valueOf =
function () { return x; }
var empty =
_empty
var inspect =
function () { return ("Prod" + (_inspect(valueOf()))); }
var equals =
function (m) { return isSameType(Prod, m)
&& _equals(x, m.valueOf()); }
function concat(method) {
return function(m) {
if(!isSameType(Prod, m)) {
throw new TypeError(("Prod." + method + ": Prod required"))
}
return Prod(x * m.valueOf())
}
}
return ( obj = {
inspect: inspect, toString: inspect,
equals: equals, valueOf: valueOf, type: type, empty: empty,
concat: concat('concat')
}, obj[fl.equals] = equals, obj[fl.empty] = empty, obj[fl.concat] = concat(fl.concat), obj['@@type'] = _type, obj.constructor = Prod, obj )
}
Prod['@@implements'] = _implements(
[ 'equals', 'concat', 'empty' ]
)
Prod.empty = _empty
Prod.type = type
Prod[fl.empty] = _empty
Prod['@@type'] = _type
module.exports = Prod