crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
82 lines (61 loc) • 2.06 kB
JavaScript
/** @license ISC License (c) copyright 2017 original and current authors */
/** @author Ian Hofmann-Hicks (evil) */
var VERSION = 2
var _implements = require('../core/implements')
var _inspect = require('../core/inspect')
var curry = require('../core/curry')
var isFunction = require('../core/isFunction')
var isSameType = require('../core/isSameType')
var type = require('../core/types').type('Equiv')
var _type = require('../core/types').typeFn(type(), VERSION)
var fl = require('../core/flNames')
var _empty =
function () { return Equiv(function () { return true; }); }
function Equiv(compare) {
var obj;
if(!isFunction(compare)) {
throw new TypeError('Equiv: Comparison function required')
}
var compareWith = curry(
function (x, y) { return !!compare(x, y); }
)
var inspect =
function () { return ("Equiv" + (_inspect(compare))); }
var empty =
_empty
var valueOf =
function () { return compareWith; }
function contramap(method) {
return function(fn) {
if(!isFunction(fn)) {
throw new TypeError(("Equiv." + method + ": Function required"))
}
return Equiv(
function (x, y) { return compareWith(fn(x), fn(y)); }
)
}
}
function concat(method) {
return function(m) {
if(!isSameType(Equiv, m)) {
throw new TypeError(("Equiv." + method + ": Equiv required"))
}
return Equiv(function (x, y) { return compareWith(x, y) && m.compareWith(x, y); }
)
}
}
return ( obj = {
inspect: inspect, toString: inspect, type: type,
compareWith: compareWith, valueOf: valueOf, empty: empty,
concat: concat('concat'),
contramap: contramap('contramap')
}, obj[fl.empty] = empty, obj[fl.concat] = concat(fl.concat), obj[fl.contramap] = contramap(fl.contramap), obj['@@type'] = _type, obj.constructor = Equiv, obj )
}
Equiv.empty = _empty
Equiv.type = type
Equiv[fl.empty] = _empty
Equiv['@@type'] = _type
Equiv['@@implements'] = _implements(
[ 'concat', 'contramap', 'empty' ]
)
module.exports = Equiv