47 lines
904 B
JavaScript
47 lines
904 B
JavaScript
(() => {
|
|
'use strict';
|
|
|
|
// unfoldr :: (b -> Maybe (a, b)) -> b -> [a]
|
|
function unfoldr(mf, v) {
|
|
for (var lst = [], a = v, m;
|
|
(m = mf(a)) && m.valid;) {
|
|
lst.push(m.value), a = m.new;
|
|
}
|
|
return lst;
|
|
}
|
|
|
|
// until :: (a -> Bool) -> (a -> a) -> a -> a
|
|
function until(p, f, x) {
|
|
let v = x;
|
|
while(!p(v)) v = f(v);
|
|
return v;
|
|
}
|
|
|
|
let result1 = unfoldr(
|
|
x => {
|
|
return {
|
|
value: x,
|
|
valid: (x % 6) !== 0,
|
|
new: x + 1
|
|
}
|
|
},
|
|
1
|
|
);
|
|
|
|
let result2 = until(
|
|
m => (m.n % 6) === 0,
|
|
m => {
|
|
return {
|
|
n : m.n + 1,
|
|
xs : m.xs.concat(m.n)
|
|
};
|
|
},
|
|
{
|
|
n: 1,
|
|
xs: []
|
|
}
|
|
).xs;
|
|
|
|
return [result1, result2];
|
|
})();
|