CM
let left = (value) => ({
swap: () => right(value),
flatMap: () => left(value),
getOrElse: (defaultValue) => defaultValue
});
let right = (value) => ({
swap: () => left(value),
flatMap: (fn) => fn(value),
getOrElse: () => value
});
let select = (rate) => {
let either = right(rate);
let context = {
option: (value, predicate) => {
either = (
either
.flatMap((rate) => (
predicate(rate, value) ? left(value) : right(rate)
))
);
return context;
},
default: (value) => (
either
.swap()
.getOrElse(value)
)
};
return context;
};
let moreThan = (a) => (b) => b >= a;
let gradeCalculator = (grade) => (
select(grade)
.option('A', moreThan(90))
.option('B', moreThan(80))
.option('C', moreThan(70))
.option('D', moreThan(60))
.default('F')
);