UNPKG

crocks

Version:

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

82 lines (60 loc) 1.99 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 _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