Skip to content

Instantly share code, notes, and snippets.

@jwosty
Created July 9, 2015 01:36
Show Gist options
  • Save jwosty/223a9c28bc7d723643e7 to your computer and use it in GitHub Desktop.
Save jwosty/223a9c28bc7d723643e7 to your computer and use it in GitHub Desktop.
Adds units of measure to common trigonometric functions (so you can't, for example, accidentally pass degrees into `cos` which takes radians)
/// Radians
[<Measure>] type r
let inline unitlessSin value : ^T = sin value
let inline unitlessAsin value : ^T = asin value
let inline unitlessCos value : ^T = cos value
let inline unitlessAcos value : ^T = acos value
let inline unitlessTan value : ^T = tan value
let inline unitlessAtan value : ^T = atan value
let inline unitlessAtan2 (x: ^T1) (y: ^T1) : ^T2 = atan2 x y
type Overloads() =
static member _Sin (_, value) = unitlessSin (value * 1.</r>)
static member _Sin (_, value) = unitlessSin (value * 1.f</r>)
static member _Asin (_, value) = unitlessAsin value * 1.<r>
static member _Asin (_, value) = unitlessAsin value * 1.f<r>
static member _Cos (_, value) = unitlessCos (value * 1.</r>)
static member _Cos (_, value) = unitlessCos (value * 1.f</r>)
static member _Acos (_, value) = unitlessAcos value * 1.<r>
static member _Acos (_, value) = unitlessAcos value * 1.f<r>
static member _Tan (_, value) = unitlessTan (value * 1.</r>)
static member _Tan (_, value) = unitlessTan (value * 1.f</r>)
static member _Atan (_, value) = unitlessAtan value * 1.<r>
static member _Atan (_, value) = unitlessAtan value * 1.f<r>
static member _Atan2 (_, x: float, y) = unitlessAtan2 x y * 1.<r>
static member _Atan2 (_, x: float32, y) = unitlessAtan2 x y * 1.f<r>
let instance = new Overloads ()
let inline sin (value: ^T) = ((^O or ^T) : (static member _Sin : ^O * ^T -> _) (instance, value))
let inline asin (value: ^T) = ((^O or ^T) : (static member _Asin : ^O * ^T -> _) (instance, value))
let inline cos (value: ^T) = ((^O or ^T) : (static member _Cos : ^O * ^T -> _) (instance, value))
let inline acos (value: ^T) = ((^O or ^T) : (static member _Acos : ^O * ^T -> _) (instance, value))
let inline tan (value: ^T) = ((^O or ^T) : (static member _Tan : ^O * ^T -> _) (instance, value))
let inline atan (value: ^T) = ((^O or ^T) : (static member _Atan : ^O * ^T -> _) (instance, value))
let inline atan2 (x: ^T, y: ^T) = ((^O or ^T) : (static member _Atan2 : ^O * ^T * ^T -> _) (instance, x, y))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment