/**
* @author: K. Lae Kettavong
* @date: 2/11/2019
* @description: Using IIFE to encapsulate class for displaying my favorite tools for the given year(s)
*/
class Validator {
static enforceNumber(num){
if(!num || typeof(num) !== 'number') this.throwTypeError('number')
}
static enforceString(str){
if(!str || typeof(str) !== 'string') this.throwTypeError('string')
}
static enforceArray(array){
if(!array || !Array.isArray(array)) this.throwTypeError('array')
}
static throwTypeError(type){
throw new TypeError(`Invalid input, must be a ${type}.`)
}
}
const Tools = (() => {
//private members
let _privateYears;
let _privateTools;
return class {
constructor(tools, years) {
Validator.enforceArray(tools)
Validator.enforceArray(years)
_privateTools = tools
_privateYears = years
}
addYear(year) {
Validator.enforceNumber(year)
_privateYears.push(year)
}
removeYear(year) {
Validator.enforceNumber(year)
_privateYears = _privateYears.filter(yr => yr !== year )
}
addTool(tool) {
Validator.enforceString(tool)
_privateTools.push(tool)
}
removeTool(tool) {
Validator.enforceString(tool)
_privateTools = _privateTools.filter(tl => tl !== tool)
}
echo(){
console.log(`My favorite tools in ${_privateYears.join(', ')}`)
_privateTools.forEach((tool, indx) => {
console.log(` ${indx+1}. ${tool}`)
})
}
}
})()
const yearsArr = [2018, 2019]
const toolsArr = ['ES6+', 'Node.js', 'TypeScript', 'React', 'Redux', 'MongoDB', 'GraphQL', 'HTML5', 'CSS3', 'SASS', 'Webpack', 'Babel', 'glot.io', 'repl.it']
const favoriteTools = new Tools(toolsArr, yearsArr)
favoriteTools.addYear(2020)
favoriteTools.addTool('Yarn')
favoriteTools.removeTool('MongoDB')
favoriteTools.removeYear(2020)
favoriteTools.echo()