Created
August 4, 2019 16:12
-
-
Save jaloplo/28a954ef407cc8303a980e00b7eab561 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const CELSIUS_SCALE = 'Celsius'; | |
const FAHRENHEIT_SCALE = 'Fahrenheit'; | |
const KELVIN_SCALE = 'Kelvin'; | |
const TransformationMethodsHandler = function() { | |
let collection = {}; | |
return { | |
// Returns the transformation method by getting the source and target types | |
get: function(source, target) { | |
if(!collection[source] || !collection[source][target]) { | |
return null; | |
} | |
return collection[source][target]; | |
}, | |
// Registers a new tranformation method using source and target as keys | |
register: function(source, target, formula) { | |
if(!collection[source]) { | |
collection[source] = {}; | |
} | |
if(!collection[source][target]) { | |
collection[source][target] = {}; | |
} | |
// Added transform property to make it more usable and readable from code | |
collection[source][target].transform = formula; | |
// Makes easier to keep on registering new methods | |
return this; | |
} | |
}; | |
} | |
let transformationHandler = new TransformationMethodsHandler() | |
.register(CELSIUS_SCALE, KELVIN_SCALE, (degree) => degree + 273.15) | |
.register(KELVIN_SCALE, CELSIUS_SCALE, (degree) => degree - 273.15) | |
.register(CELSIUS_SCALE, FAHRENHEIT_SCALE, (degree) => (9*degree/5) + 32) | |
.register(FAHRENHEIT_SCALE, CELSIUS_SCALE, (degree) => (5*(degree-32)) / 9) | |
.register(FAHRENHEIT_SCALE, KELVIN_SCALE, (degree) => (5*(degree-32)) / 9 + parseFloat(273.15)) | |
.register(KELVIN_SCALE, FAHRENHEIT_SCALE, (degree) => (9*(degree - 273.15)/5) + 32); | |
let celsius = 24; | |
let fahrenheit = transformationHandler.get(CELSIUS_SCALE, FAHRENHEIT_SCALE).transform(celsius); | |
let kelvin = transformationHandler.get(FAHRENHEIT_SCALE, KELVIN_SCALE).transform(fahrenheit); | |
console.log(celsius, fahrenheit, kelvin); // 24, 75,.2, 297.15 | |
// Singleton object to be used always in the same way | |
// Higher order functions to create the Parser object | |
// Currying technique to make code more readable | |
const Transformer = (function(engine) { | |
return function(value) { | |
return { | |
from: function(source) { | |
return { | |
to: function(target) { | |
return engine.get(source, target).transform(value); | |
} | |
}; | |
} | |
}; | |
}; | |
})(transformationHandler); | |
celsius = 24; | |
fahrenheit = Transformer(celsius).from(CELSIUS_SCALE).to(FAHRENHEIT_SCALE); | |
kelvin = Transformer(fahrenheit).from(FAHRENHEIT_SCALE).to(KELVIN_SCALE); | |
console.log(celsius, fahrenheit, kelvin); // 24, 75,.2, 297.15 | |
let parserFromCelsius = Transformer(celsius).from(CELSIUS_SCALE); | |
fahrenheit = parserFromCelsius.to(FAHRENHEIT_SCALE); | |
kelvin = parserFromCelsius.to(KELVIN_SCALE); | |
console.log(celsius, fahrenheit, kelvin); // 24, 75,.2, 297.15 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment