crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
79 lines (57 loc) • 1.9 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 _equals = require('../core/equals')
var type = require('../core/types').type('First')
var _type = require('../core/types').typeFn(type(), VERSION)
var fl = require('../core/flNames')
var isSameType = require('../core/isSameType')
var Maybe = require('../core/Maybe')
var _empty =
function () { return First(Maybe.Nothing()); }
function First(x) {
var obj;
if(!arguments.length) {
throw new TypeError('First: Requires one argument')
}
var maybe =
!isSameType(Maybe, x) ? Maybe.of(x) : x.map(function (x) { return x; })
var empty =
_empty
var inspect =
function () { return ("First(" + (_inspect(maybe)) + " )"); }
var equals =
function (m) { return isSameType(First, m)
&& _equals(maybe, m.valueOf()); }
var valueOf =
function () { return maybe; }
var option =
maybe.option
function concat(method) {
return function(m) {
if(!isSameType(First, m)) {
throw new TypeError(("First." + method + ": First required"))
}
var n =
m.valueOf().map(function (x) { return x; })
return First(
maybe.either(function () { return n; }, Maybe.Just)
)
}
}
return ( obj = {
inspect: inspect, toString: inspect,
equals: equals, empty: empty, option: option, type: type, valueOf: valueOf,
concat: concat('concat')
}, obj[fl.equals] = equals, obj[fl.empty] = _empty, obj[fl.concat] = concat(fl.concat), obj['@@type'] = _type, obj.constructor = First, obj )
}
First['@@implements'] = _implements(
[ 'equals', 'concat', 'empty' ]
)
First.empty = _empty
First.type = type
First[fl.empty] = _empty
First['@@type'] = _type
module.exports = First