Skip to content

Instantly share code, notes, and snippets.

@TGOlson
Last active August 29, 2015 14:14
Show Gist options
  • Select an option

  • Save TGOlson/d288b964934a253aa5ac to your computer and use it in GitHub Desktop.

Select an option

Save TGOlson/d288b964934a253aa5ac to your computer and use it in GitHub Desktop.
Functional FizzBuzz Kata
/*
* General Functional Helpers
*/
function compose(a, b) {
return function() {
a(b.apply(null, arguments));
};
}
function is(v1, v2) {
return (v1 === v2);
}
function and(v1, v2) {
return (v1 && v2);
}
function times(n, callback) {
var i;
for(i = 1; i <= n; i++) {
callback(i);
}
return i;
}
var returnValIf = and;
/*
* Logical Helpers
*/
function isFactorOf(v) {
return function(n) {
return is((n % v), 0);
};
}
var isFactorOf3 = isFactorOf(3);
var isFactorOf5 = isFactorOf(5);
function isFactorOf3And5(n) {
return and(isFactorOf3(n), isFactorOf5(n));
}
/*
* FizzBuzz Logic
*/
function fizzBuzz(n) {
return times(n, logNumToFizzBuzz);
}
var logNumToFizzBuzz = compose(console.log.bind(console), numToFizzBuzz);
function numToFizzBuzz(n) {
return returnValIf(isFactorOf3And5(n), 'FizzBuzz') ||
returnValIf(isFactorOf3(n), 'Fizz') ||
returnValIf(isFactorOf5(n), 'Buzz') ||
n;
}
fizzBuzz(15);
// => 1
// 2
// Fizz
// 4
// Buzz
// Fizz
// 7
// 8
// Fizz
// Buzz
// 11
// Fizz
// 13
// 14
// FizzBuzz
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment