Skip to content

Instantly share code, notes, and snippets.

@tsal
Last active October 29, 2019 16:34
Show Gist options
  • Select an option

  • Save tsal/0061e26e7478b5d336a6b8b45eefb3f2 to your computer and use it in GitHub Desktop.

Select an option

Save tsal/0061e26e7478b5d336a6b8b45eefb3f2 to your computer and use it in GitHub Desktop.

Revisions

  1. tsal revised this gist Oct 29, 2019. 1 changed file with 4 additions and 6 deletions.
    10 changes: 4 additions & 6 deletions temperature.go
    Original file line number Diff line number Diff line change
    @@ -16,20 +16,18 @@ const (
    rankineInverted float64 = 5/9
    )

    func rankineUp(in float64) float64 { return in * rankine }
    func rankineDown(in float64) float64 { return in * rankineInverted }
    func kelvinToFahrenheit(in float64) float64 { return rankineUp(in) - 459.67}
    func celsiusToFahrenheit(in float64) float64 { return rankineUp(in) + 32 }
    func rankineUp(in float64) float64 { return in * rankine }
    func rankineDown(in float64) float64 { return in * rankineInverted }

    var funcMap = map[temperatureUnit]map[temperatureUnit]conversionFunc{
    Kelvin: {
    Celsius: func(in float64) float64 { return in - 273.15 },
    Fahrenheit: kelvinToFahrenheit,
    Fahrenheit: func(in float64) float64 { return rankineUp(in) - 459.67 },
    Rankine: rankineUp,
    },
    Celsius: {
    Kelvin: func(in float64) float64 { return in + 273.15},
    Fahrenheit: celsiusToFahrenheit,
    Fahrenheit: func(in float64) float64 { return rankineUp(in) + 32 },
    Rankine: func(in float64) float64 { return rankineUp(in + 273.15) },
    },
    Fahrenheit: {
  2. tsal created this gist Oct 29, 2019.
    11 changes: 11 additions & 0 deletions main.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    package main

    import (
    "example/pkg/temperature"
    "fmt"
    )

    func main() {
    t := convert.New(0, convert.Celsius)
    fmt.Println(t.F())
    }
    72 changes: 72 additions & 0 deletions temperature.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,72 @@
    package temperature

    type temperatureUnit int

    const (
    Kelvin temperatureUnit = iota
    Celsius
    Fahrenheit
    Rankine
    )

    type conversionFunc func(float64) float64

    const (
    rankine float64 = 9/5
    rankineInverted float64 = 5/9
    )

    func rankineUp(in float64) float64 { return in * rankine }
    func rankineDown(in float64) float64 { return in * rankineInverted }
    func kelvinToFahrenheit(in float64) float64 { return rankineUp(in) - 459.67}
    func celsiusToFahrenheit(in float64) float64 { return rankineUp(in) + 32 }

    var funcMap = map[temperatureUnit]map[temperatureUnit]conversionFunc{
    Kelvin: {
    Celsius: func(in float64) float64 { return in - 273.15 },
    Fahrenheit: kelvinToFahrenheit,
    Rankine: rankineUp,
    },
    Celsius: {
    Kelvin: func(in float64) float64 { return in + 273.15},
    Fahrenheit: celsiusToFahrenheit,
    Rankine: func(in float64) float64 { return rankineUp(in + 273.15) },
    },
    Fahrenheit: {
    Kelvin: func(in float64) float64 { return rankineDown(in + 459.67) },
    Celsius: func(in float64) float64 { return rankineDown(in - 32)},
    Rankine: func(in float64) float64 { return in + 459.67 },
    },
    Rankine: {
    Kelvin: rankineDown,
    Celsius: func(in float64) float64 { return rankineDown(in - 491.67) },
    Fahrenheit: func(in float64) float64 { return in - 459.67 },
    },
    }

    type ConvertibleTemperature struct {
    Value float64
    Unit temperatureUnit
    }

    func New(value float64, unit temperatureUnit) *ConvertibleTemperature {
    return &ConvertibleTemperature{
    Value: value,
    Unit: unit,
    }
    }

    func (T ConvertibleTemperature) Convert(to temperatureUnit) float64 {
    return funcMap[T.Unit][to](T.Value)
    }

    func fromTo(from, to temperatureUnit, t ConvertibleTemperature) float64 {
    if from == to { return t.Value } else {
    return t.Convert(to)
    }
    }

    func (T ConvertibleTemperature) C() float64 { return fromTo(T.Unit, Celsius, T) }
    func (T ConvertibleTemperature) F() float64 { return fromTo(T.Unit, Fahrenheit, T) }
    func (T ConvertibleTemperature) K() float64 { return fromTo(T.Unit, Kelvin, T) }
    func (T ConvertibleTemperature) R() float64 { return fromTo(T.Unit, Rankine, T) }