[Javascript Crocks] Recover from a Nothing with the `coalesce` M

墙里墙外 2018-05-14

Thealtmethod allows us to recover from a nothing with a default Maybe, but sometimes our recovery efforts might need to enlist some logic to recover properly. In this lesson, we’ll see how we can use thecoalescemethod on the Maybe to recover from a Nothing by calling a function.

When one would like tooptionaMaybebut would like to remain within aMaybetype,coalescecan be used.coalesceexpects (2) functions for it's inputs.

The first function is used when invoked on aNothingand will return aJustinstance wrapping the result of the function. The second function is used whencoalesceis invoked on aJustand is used to map the original value, returning a newJustinstance wrapping the result of the second function.

The use case of 'coalesce' is similar to 'alt', but instead wrting two function as 'alt' does:

const getArticleName = obj => prop('name', obj)
    .chain(safe(isNonEmptyString)) // If return Nothing then use alt value
    .alt(Maybe.of('page not found'));

const getArticleUrl = obj => getArticleName(obj)
    .map(createUrlFromName)
    .option('default');

const url = getArticleUrl(article);

In 'coalesce', we just combine in one single function:

const getArticleUrl = obj => prop('name', obj)
    .chain(safe(isNonEmptyString)) // If return Nothing then use first function of coalesce
    .coalesce(() => 'page not found', createUrlFromName)
    .option('default');

const url = getArticleUrl(article);
const crocks = require('crocks')
const { identity ,and, compose, isEmpty, isString, Maybe, not, prop, safe } = crocks
const { join, split, toLower } = require('ramda')


const article = {
    id: ,
    _name: 'Learning crocksjs functional programming library'
};

const createUrlSlug = compose(join('-'), split(' '), toLower);
const createUrl = slug => `https://egghead.io/articles/${slug}`;
const createUrlFromName = compose(createUrl, createUrlSlug);
const isNonEmptyString = and(not(isEmpty), isString);


const getArticleUrl = obj => prop('name', obj)
    .chain(safe(isNonEmptyString)) // If return Nothing then use first function of coalesce
    .coalesce(() => 'page not found', createUrlFromName)
    .option('default');

const url = getArticleUrl(article);

console.log(url)

相关推荐