crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
35 lines (26 loc) • 867 B
JavaScript
/** @license ISC License (c) copyright 2016 original and current authors */
/** @author Ian Hofmann-Hicks (evil) */
var cloneIterable = require('../core/cloneIterable')
var isArray = require('../core/isArray')
var isFunction = require('../core/isFunction')
var isIterable = require('../core/isIterable')
var isString = require('../core/isString')
var ref = require('../core/Maybe');
var Nothing = ref.Nothing;
var Just = ref.Just;
function head(m) {
if(m && isFunction(m.head)) {
return m.head()
}
if(isArray(m) || isString(m)) {
return !m.length ? Nothing() : Just(m[0])
}
if(isIterable(m)) {
var cloned = cloneIterable(m)
var iterator = cloned[Symbol.iterator]()
var head = iterator.next()
return head.done ? Nothing() : Just(head.value)
}
throw new TypeError('head: List or iterable required')
}
module.exports = head