crocks
Version:
A collection of well known Algebraic Datatypes for your utter enjoyment.
46 lines (34 loc) • 1.01 kB
JavaScript
/** @license ISC License (c) copyright 2019 original and current authors */
/** @author RichardForrester */
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 last(m) {
if (m && isFunction(m.last)) {
return m.last()
}
if (isArray(m) || isString(m)) {
return !m.length ? Nothing() : Just(m[m.length - 1])
}
if (isIterable(m)) {
var cloned = cloneIterable(m)
var iterator = cloned[Symbol.iterator]()
var curr = iterator.next()
if (curr.done) {
return Nothing()
}
var val
while (!curr.done) {
val = curr.value
curr = iterator.next()
}
return Just(val)
}
throw new TypeError('last: Argument must be a List, String, or Iterable')
}
module.exports = last