Created
July 9, 2015 01:36
-
-
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)
This file contains hidden or 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
/// 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