crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
35 lines (25 loc) • 918 B
JavaScript
/** @license ISC License (c) copyright 2017 original and current authors */
/** @author Ian Hofmann-Hicks (evil) */
var First = require('../core/types').proxy('First')
var curry = require('../core/curry')
var isFunction = require('../core/isFunction')
var isSameType = require('../core/isSameType')
var applyTransform = function (first) { return first.valueOf(); }
// firstToMaybe : First a -> Maybe a
// firstToMaybe : (a -> First b) -> a -> Maybe b
function firstToMaybe(first) {
if(isFunction(first)) {
return function(x) {
var m = first(x)
if(!isSameType(First, m)) {
throw new TypeError('firstToMaybe: First returning function required')
}
return applyTransform(m)
}
}
if(isSameType(First, first)) {
return applyTransform(first)
}
throw new TypeError('firstToMaybe: First or First returning function required')
}
module.exports = curry(firstToMaybe)