Skip to content

Instantly share code, notes, and snippets.

@cameronbourke
Created October 28, 2015 08:18
Show Gist options
  • Save cameronbourke/fac65db2605524af17ac to your computer and use it in GitHub Desktop.
Save cameronbourke/fac65db2605524af17ac to your computer and use it in GitHub Desktop.
Took the ES5 output of the tuts+ course on functional programming, http://code.tutsplus.com/courses/functional-programming-in-javascript, and slapped some ES6 in there instead.
!function(_) {
'use strict';
let beerData = JSON.parse(document.getElementById("beerData").textContent),
allBeers = beerData.beers,
beerTemplate = document.getElementById("tmpl-beer-groups").textContent,
beerList = document.getElementById("beerList"),
averageAbv = document.getElementById("averageAbv"),
filters = document.getElementById("filters"),
filterLinks = filters.querySelectorAll("a");
let fp = {
mean(collection, property) {
if(property) {
collection = _.pluck(collection, property);
}
return _.reduce(collection, fp.add, 0) / collection.length;
},
roundDecimal(number, places) {
let factor = Math.pow(10, places);
return Math.round(number * factor) / factor;
},
add(a, b) {
return a + b;
}
};
function loadBeers(beers) {
let beerGroups = _.groupBy(beers, (beer) => beer.locale);
beerList.innerHTML = _.template(beerTemplate)({ beers: beerGroups });
averageAbv.innerHTML = `Average ABV: ${getAverageAbv(beers)}%`;
}
function setActiveFilter(active) {
_.forEach(filterLinks, (link) => {
link.classList.remove('btn-active');
});
active.classList.add('btn-active');
}
function makeFilter(collection, property) {
return (value) => _.filter(collection, (item) => item[property] === value);
}
function getAverageAbv(beers) {
let mean = fp.mean(beers, 'abv');
return fp.roundDecimal(mean, 1);
}
let filterByLocale = makeFilter(allBeers, 'locale');
let filterByType = makeFilter(allBeers, 'type');
loadBeers(allBeers);
filters.addEventListener('click', (e) => {
e.preventDefault();
let clicked = e.target,
filterName = clicked.dataset.filter,
filteredBeers = [];
setActiveFilter(clicked);
switch (filterName) {
case 'all':
filteredBeers = allBeers;
break;
case 'domestic':
filteredBeers = filterByLocale('domestic');
break;
case 'imports':
filteredBeers = filterByLocale('import');
break;
case 'ale':
filteredBeers = _.filter(allBeers, (beer) => beer.type === 'ale' || beer.type === 'ipa');
break;
case 'lager':
filteredBeers = filterByType('lager');
break;
case 'stout':
filteredBeers = filterByType('stout');
break;
case 'surprise':
filteredBeers = [_.sample(allBeers)];
break;
}
loadBeers(filteredBeers);
});
}(_);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment