У меня есть объект правил css, который может иметь любое или ни одно из следующих свойств:
{ 'font-style': '…',
'font-variant': '…',
'font-weight': '…',
'text-decoration': '…',
'vertical-align': '…' }
Следующим шагом является создание строки css, которая применяется к входу, например:
style({'text-decoration': 'underline'}, 'foo');
//=> '<span style="text-decoration:underline">foo</span>'
Однако, если объект rules
не содержит ни одного из вышеуказанных пяти правил css, входные данные возвращаются как:
style({}, 'foo'); //=> 'foo'
Как вы можете видеть, это не ракетанаука, но нужно быть осторожным, чтобы не применять пустую строку CSS или включать дополнительные вещи, которые нам не нужны.
Я нашел решение, используя ramda.js , которыйЯ был вполне доволен, пока не решил углубиться в монады.
Я был впечатлен количеством кода, который мне удалось удалить, используя несколько монадических принципов.
const {curry} = require('ramda');
const {Maybe} = require('monet');
const css = (attrs, key) =>
attrs[key] ?
Maybe.of(`${key}:${attrs[key]};`) :
Maybe.of('');
const style = curry((va, td, fw, fv, fs, input) =>
va || td || fw || fv || fs ?
`<span style="${va}${td}${fw}${fv}${fs}">${input}</span>` : input);
module.exports = curry((attrs, input) =>
Maybe.of(input)
.ap(css('font-style', attrs)
.ap(css('font-variant', attrs)
.ap(css('font-weight', attrs)
.ap(css('text-decoration', attrs)
.ap(css('vertical-align', attrs)
.map(style))))))
.some());
Я доволен этим, но я не могу не думать, что все эти вложенные ap
являются неким замаскированным обратным вызовом.Возможно, есть лучший способ, о котором я не знаю?
Вопрос: Есть ли лучший способ объединить несколько Maybe
монад?