summaryrefslogtreecommitdiff
path: root/conversion_utils.py
diff options
context:
space:
mode:
authorScott Gasch <[email protected]>2021-03-24 18:08:54 -0700
committerScott Gasch <[email protected]>2021-03-24 18:08:54 -0700
commit497fb9e21f45ec08e1486abaee6dfa7b20b8a691 (patch)
tree47aa97a0fca36c4e7025cee5ad4e9ec6db49b881 /conversion_utils.py
Initial revision
Diffstat (limited to 'conversion_utils.py')
-rw-r--r--conversion_utils.py74
1 files changed, 74 insertions, 0 deletions
diff --git a/conversion_utils.py b/conversion_utils.py
new file mode 100644
index 0000000..bab27e1
--- /dev/null
+++ b/conversion_utils.py
@@ -0,0 +1,74 @@
+#!/usr/bin/env python3
+
+from numbers import Number
+from typing import Callable
+
+
+class Converter(object):
+ def __init__(self,
+ name: str,
+ category: str,
+ to_canonical: Callable,
+ from_canonical: Callable,
+ unit: str) -> None:
+ self.name = name
+ self.category = category
+ self.to_canonical = to_canonical
+ self.from_canonical = from_canonical
+ self.unit = unit
+
+ def to_canonical(self, n: Number) -> Number:
+ return self.to_canonical(n)
+
+ def from_canonical(self, n: Number) -> Number:
+ return self.from_canonical(n)
+
+ def unit_suffix(self) -> str:
+ return self.unit
+
+
+conversion_catalog = {
+ "Fahrenheit": Converter("Fahrenheit",
+ "temperature",
+ lambda f: (f - 32.0) * 0.55555555,
+ lambda c: c * 1.8 + 32.0,
+ "°F"),
+ "Celsius": Converter("Celsius",
+ "temperature",
+ lambda c: c,
+ lambda c: c,
+ "°C"),
+ "Kelvin": Converter("Kelvin",
+ "temperature",
+ lambda k: k - 273.15,
+ lambda c: c + 273.15,
+ "°K"),
+}
+
+
+def convert(magnitude: Number,
+ from_thing: str,
+ to_thing: str) -> Number:
+ src = conversion_catalog.get(from_thing, None)
+ dst = conversion_catalog.get(to_thing, None)
+ if src is None or dst is None:
+ raise ValueError("No known conversion")
+ return _convert(magnitude, src, dst)
+
+
+def _convert(magnitude: Number,
+ from_unit: Converter,
+ to_unit: Converter) -> Number:
+ canonical = from_unit.to_canonical(magnitude)
+ converted = to_unit.from_canonical(canonical)
+ return converted
+
+
+def f_to_c(temp_f: float) -> float:
+ """Fahrenheit to Celsius."""
+ return convert(temp_f, "Fahrenheit", "Celsius")
+
+
+def c_to_f(temp_c: float) -> float:
+ """Celsius to Fahrenheit."""
+ return convert(temp_c, "Celsius", "Fahrenheit")