Created
May 19, 2016 19:26
-
-
Save andybrackley/5b35cfd2dfd98a5dabe5858bb5dd0f97 to your computer and use it in GitHub Desktop.
Elm version of my F# race paces calculations
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
import Html exposing (text) | |
import Time exposing (Time) | |
type UnitType = Metric | Imperial | |
type Speed = Mph Float | Kph Float | |
type Pace = MinPerMile Float | MinPerKm Float | |
type Distance = Miles Float | Kms Float | |
speedConversionFactor = 0.621371192 | |
convertMphToKph : Float -> Float | |
convertMphToKph mph = | |
mph / speedConversionFactor | |
convertKphToMph : Float -> Float | |
convertKphToMph kph = | |
kph * speedConversionFactor | |
paceFromSpeed : UnitType -> Speed -> Pace | |
paceFromSpeed requiredType speed = | |
let | |
asPace spd = 60.0 / spd | |
in | |
case speed of | |
Mph mph -> | |
case requiredType of | |
Metric -> MinPerKm ( asPace mph |> convertMphToKph ) | |
Imperial -> MinPerMile ( asPace mph ) | |
Kph kmh -> | |
case requiredType of | |
Metric -> MinPerKm ( asPace kmh ) | |
Imperial -> MinPerMile ( asPace kmh |> convertKphToMph ) | |
convertSpeed : UnitType -> Speed -> Speed | |
convertSpeed requiredType speed = | |
case speed of | |
Mph mph -> | |
case requiredType of | |
Metric -> Kph (convertMphToKph mph) | |
Imperial -> speed | |
Kph kph -> | |
case requiredType of | |
Metric -> speed | |
Imperial -> Mph (convertKphToMph kph) | |
calcSpeedFromTimeAndDistance : Time -> Distance -> UnitType -> Speed | |
calcSpeedFromTimeAndDistance time distance requiredType = | |
let | |
speed dist = dist / (time |> Time.inHours) | |
in | |
case distance of | |
Miles miles -> Mph (speed miles) |> convertSpeed requiredType | |
Kms kms -> Kph (speed kms) |> convertSpeed requiredType | |
calcPaceFromTimeAndDistance : Time -> Distance -> UnitType -> Pace | |
calcPaceFromTimeAndDistance time distance requiredType = | |
calcSpeedFromTimeAndDistance time distance requiredType |> paceFromSpeed requiredType | |
main = | |
let | |
requiredTimeMins = 1 * Time.minute | |
distance = Kms 0.4 | |
speedCalc = calcPaceFromTimeAndDistance requiredTimeMins distance | |
test = Mph (12) |> convertSpeed Metric | |
in | |
text (toString (speedCalc Metric)) | |
-- text ( toString test ) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment