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