UNPKG

crocks

Version:

A collection of well known Algebraic Datatypes for your utter enjoyment.

82 lines (61 loc) 2.06 kB
/** @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