From 445e22b9a0b7da055487e86d910874f424dd4ccf Mon Sep 17 00:00:00 2001 From: Rob Lenders Date: Sat, 10 Aug 2024 17:50:37 -0500 Subject: [PATCH 1/8] Add new Units type to ease UoM conversions --- src/FSharp.Core/FSharp.Core.fsproj | 3 + src/FSharp.Core/Units.fs | 216 +++++++++++++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 src/FSharp.Core/Units.fs diff --git a/src/FSharp.Core/FSharp.Core.fsproj b/src/FSharp.Core/FSharp.Core.fsproj index b0abd5048bd..bf4896f4441 100644 --- a/src/FSharp.Core/FSharp.Core.fsproj +++ b/src/FSharp.Core/FSharp.Core.fsproj @@ -276,6 +276,9 @@ Queries/Query.fs + + Units/Units.fs + Units/SI.fs diff --git a/src/FSharp.Core/Units.fs b/src/FSharp.Core/Units.fs new file mode 100644 index 00000000000..a29ec467099 --- /dev/null +++ b/src/FSharp.Core/Units.fs @@ -0,0 +1,216 @@ +namespace Microsoft.FSharp.Core + +open Microsoft.FSharp.Collections +[] +module private UnitsHelpers = + let inline retype (x: 'T) : 'U = (# "" x: 'U #) + +type Units = + static member inline Add<[]'Measure>(input: byte):byte<'Measure> = retype input + static member inline Add<[]'Measure>(input: float):float<'Measure> = retype input + static member inline Add<[]'Measure>(input: int16):int16<'Measure> = retype input + static member inline Add<[]'Measure>(input: int):int<'Measure> = retype input + static member inline Add<[]'Measure>(input: int64):int64<'Measure> = retype input + static member inline Add<[]'Measure>(input: sbyte):sbyte<'Measure> = retype input + static member inline Add<[]'Measure>(input: nativeint):nativeint<'Measure> = retype input + static member inline Add<[]'Measure>(input: uint16):uint16<'Measure> = retype input + static member inline Add<[]'Measure>(input: uint):uint<'Measure> = retype input + static member inline Add<[]'Measure>(input: uint64):uint64<'Measure> = retype input + static member inline Add<[]'Measure>(input: decimal):decimal<'Measure> = retype input + static member inline Add<[]'Measure>(input: float32):float32<'Measure> = retype input + static member inline Add<[]'Measure>(input: unativeint):unativeint<'Measure> = retype input + + static member inline Remove<[]'Measure>(input: byte<'Measure>):byte = retype input + static member inline Remove<[]'Measure>(input: float<'Measure>):float = retype input + static member inline Remove<[]'Measure>(input: int16<'Measure>):int16 = retype input + static member inline Remove<[]'Measure>(input: int<'Measure>):int = retype input + static member inline Remove<[]'Measure>(input: int64<'Measure>):int64 = retype input + static member inline Remove<[]'Measure>(input: sbyte<'Measure>):sbyte = retype input + static member inline Remove<[]'Measure>(input: nativeint<'Measure>):nativeint = retype input + static member inline Remove<[]'Measure>(input: uint16<'Measure>):uint16 = retype input + static member inline Remove<[]'Measure>(input: uint<'Measure>):uint = retype input + static member inline Remove<[]'Measure>(input: uint64<'Measure>):uint64 = retype input + static member inline Remove<[]'Measure>(input: decimal<'Measure>):decimal = retype input + static member inline Remove<[]'Measure>(input: float32<'Measure>):float32 = retype input + static member inline Remove<[]'Measure>(input: unativeint<'Measure>):unativeint = retype input + + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: byte<'MeasureIn>):byte<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: float<'MeasureIn>):float<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: int16<'MeasureIn>):int16<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: int<'MeasureIn>):int<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: int64<'MeasureIn>):int64<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: sbyte<'MeasureIn>):sbyte<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: nativeint<'MeasureIn>):nativeint<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: uint16<'MeasureIn>):uint16<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: uint<'MeasureIn>):uint<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: uint64<'MeasureIn>):uint64<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: decimal<'MeasureIn>):decimal<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: float32<'MeasureIn>):float32<'MeasureOut> = retype input + static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: unativeint<'MeasureIn>):unativeint<'MeasureOut> = retype input + + static member inline AddArray<[]'Measure>(input: byte[]):byte<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: float[]):float<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: int16[]):int16<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: int[]):int<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: int64[]):int64<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: sbyte[]):sbyte<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: nativeint[]):nativeint<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: uint16[]):uint16<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: uint[]):uint<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: uint64[]):uint64<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: decimal[]):decimal<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: float32[]):float32<'Measure>[] = retype input + static member inline AddArray<[]'Measure>(input: unativeint[]):unativeint<'Measure>[] = retype input + + static member inline RemoveArray<[]'Measure>(input: byte<'Measure>[]):byte[] = retype input + static member inline RemoveArray<[]'Measure>(input: float<'Measure>[]):float[] = retype input + static member inline RemoveArray<[]'Measure>(input: int16<'Measure>[]):int16[] = retype input + static member inline RemoveArray<[]'Measure>(input: int<'Measure>[]):int[] = retype input + static member inline RemoveArray<[]'Measure>(input: int64<'Measure>[]):int64[] = retype input + static member inline RemoveArray<[]'Measure>(input: sbyte<'Measure>[]):sbyte[] = retype input + static member inline RemoveArray<[]'Measure>(input: nativeint<'Measure>[]):nativeint[] = retype input + static member inline RemoveArray<[]'Measure>(input: uint16<'Measure>[]):uint16[] = retype input + static member inline RemoveArray<[]'Measure>(input: uint<'Measure>[]):uint[] = retype input + static member inline RemoveArray<[]'Measure>(input: uint64<'Measure>[]):uint64[] = retype input + static member inline RemoveArray<[]'Measure>(input: decimal<'Measure>[]):decimal[] = retype input + static member inline RemoveArray<[]'Measure>(input: float32<'Measure>[]):float32[] = retype input + static member inline RemoveArray<[]'Measure>(input: unativeint<'Measure>[]):unativeint[] = retype input + + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: byte<'MeasureIn>[]):byte<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: float<'MeasureIn>[]):float<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: int16<'MeasureIn>[]):int16<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: int<'MeasureIn>[]):int<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: int64<'MeasureIn>[]):int64<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: sbyte<'MeasureIn>[]):sbyte<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: uint16<'MeasureIn>[]):uint16<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: uint<'MeasureIn>[]):uint<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: uint64<'MeasureIn>[]):uint64<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: decimal<'MeasureIn>[]):decimal<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: float32<'MeasureIn>[]):float32<'MeasureOut>[] = retype input + static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: unativeint<'MeasureIn>[]):unativeint<'MeasureOut>[] = retype input + + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input + + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input + + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input + + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + static member inline AddList<[]'Measure>(input: list):list> = retype input + + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + static member inline RemoveList<[]'Measure>(input: list>):list = retype input + + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input + + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input + + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input + + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input From 2540932c3d06ed464298201ca3a3b6f3f4ca500e Mon Sep 17 00:00:00 2001 From: Rob Lenders Date: Sat, 10 Aug 2024 18:04:08 -0500 Subject: [PATCH 2/8] Add to release notes --- docs/release-notes/.FSharp.Core/9.0.100.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/release-notes/.FSharp.Core/9.0.100.md b/docs/release-notes/.FSharp.Core/9.0.100.md index 503a6c17d85..36315a30bb0 100644 --- a/docs/release-notes/.FSharp.Core/9.0.100.md +++ b/docs/release-notes/.FSharp.Core/9.0.100.md @@ -5,6 +5,7 @@ * Enable C# collection expression support for F# lists & sets. ([Language suggestion #1355](https://github.com/fsharp/fslang-suggestions/issues/1355), [RFC FS-1145 (PR#776)](https://github.com/fsharp/fslang-design/pull/776), [PR #17359](https://github.com/dotnet/fsharp/pull/17359)) * Add module functions for converting between `'T option` and `'T voption`. ([PR #17436](https://github.com/dotnet/fsharp/pull/17436)) +* Add `Units` static type which aids in the addition, removal, and conversion of units of measure for primitive types and common collections of primitive types. ([Language Suggestion #892](https://github.com/fsharp/fslang-suggestions/issues/892)) ([PR #17581](https://github.com/dotnet/fsharp/pull/17518)) ### Changed * Change compiler default setting realsig+ when building assemblies ([Issue #17384](https://github.com/dotnet/fsharp/issues/17384), [PR #17378](https://github.com/dotnet/fsharp/pull/17385)) From 7c380fcadcbe0c9853209ef5398b033567082fe0 Mon Sep 17 00:00:00 2001 From: Rob Lenders Date: Sat, 10 Aug 2024 18:36:58 -0500 Subject: [PATCH 3/8] Update release notes --- docs/release-notes/.FSharp.Core/9.0.100.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/.FSharp.Core/9.0.100.md b/docs/release-notes/.FSharp.Core/9.0.100.md index 36315a30bb0..0d0e82c932d 100644 --- a/docs/release-notes/.FSharp.Core/9.0.100.md +++ b/docs/release-notes/.FSharp.Core/9.0.100.md @@ -5,7 +5,7 @@ * Enable C# collection expression support for F# lists & sets. ([Language suggestion #1355](https://github.com/fsharp/fslang-suggestions/issues/1355), [RFC FS-1145 (PR#776)](https://github.com/fsharp/fslang-design/pull/776), [PR #17359](https://github.com/dotnet/fsharp/pull/17359)) * Add module functions for converting between `'T option` and `'T voption`. ([PR #17436](https://github.com/dotnet/fsharp/pull/17436)) -* Add `Units` static type which aids in the addition, removal, and conversion of units of measure for primitive types and common collections of primitive types. ([Language Suggestion #892](https://github.com/fsharp/fslang-suggestions/issues/892)) ([PR #17581](https://github.com/dotnet/fsharp/pull/17518)) +* Add `Units` static type which aids in the addition, removal, and conversion of units of measure for primitive types and common collections of primitive types. ([Language Suggestion #892](https://github.com/fsharp/fslang-suggestions/issues/892)) ([RFC FS-1148 #784](https://github.com/fsharp/fslang-design/pull/784)) ([PR #17581](https://github.com/dotnet/fsharp/pull/17518)) ### Changed * Change compiler default setting realsig+ when building assemblies ([Issue #17384](https://github.com/dotnet/fsharp/issues/17384), [PR #17378](https://github.com/dotnet/fsharp/pull/17385)) From f256cac3653ccee9aa745514380f2c9ad4d56292 Mon Sep 17 00:00:00 2001 From: Rob Lenders Date: Sat, 10 Aug 2024 18:43:24 -0500 Subject: [PATCH 4/8] Apply code formatting --- src/FSharp.Core/Units.fs | 965 ++++++++++++++++++++++++++++++--------- 1 file changed, 756 insertions(+), 209 deletions(-) diff --git a/src/FSharp.Core/Units.fs b/src/FSharp.Core/Units.fs index a29ec467099..1b826493466 100644 --- a/src/FSharp.Core/Units.fs +++ b/src/FSharp.Core/Units.fs @@ -1,216 +1,763 @@ namespace Microsoft.FSharp.Core open Microsoft.FSharp.Collections + [] module private UnitsHelpers = - let inline retype (x: 'T) : 'U = (# "" x: 'U #) + let inline retype (x: 'T) : 'U = + (# "" x: 'U #) type Units = - static member inline Add<[]'Measure>(input: byte):byte<'Measure> = retype input - static member inline Add<[]'Measure>(input: float):float<'Measure> = retype input - static member inline Add<[]'Measure>(input: int16):int16<'Measure> = retype input - static member inline Add<[]'Measure>(input: int):int<'Measure> = retype input - static member inline Add<[]'Measure>(input: int64):int64<'Measure> = retype input - static member inline Add<[]'Measure>(input: sbyte):sbyte<'Measure> = retype input - static member inline Add<[]'Measure>(input: nativeint):nativeint<'Measure> = retype input - static member inline Add<[]'Measure>(input: uint16):uint16<'Measure> = retype input - static member inline Add<[]'Measure>(input: uint):uint<'Measure> = retype input - static member inline Add<[]'Measure>(input: uint64):uint64<'Measure> = retype input - static member inline Add<[]'Measure>(input: decimal):decimal<'Measure> = retype input - static member inline Add<[]'Measure>(input: float32):float32<'Measure> = retype input - static member inline Add<[]'Measure>(input: unativeint):unativeint<'Measure> = retype input - - static member inline Remove<[]'Measure>(input: byte<'Measure>):byte = retype input - static member inline Remove<[]'Measure>(input: float<'Measure>):float = retype input - static member inline Remove<[]'Measure>(input: int16<'Measure>):int16 = retype input - static member inline Remove<[]'Measure>(input: int<'Measure>):int = retype input - static member inline Remove<[]'Measure>(input: int64<'Measure>):int64 = retype input - static member inline Remove<[]'Measure>(input: sbyte<'Measure>):sbyte = retype input - static member inline Remove<[]'Measure>(input: nativeint<'Measure>):nativeint = retype input - static member inline Remove<[]'Measure>(input: uint16<'Measure>):uint16 = retype input - static member inline Remove<[]'Measure>(input: uint<'Measure>):uint = retype input - static member inline Remove<[]'Measure>(input: uint64<'Measure>):uint64 = retype input - static member inline Remove<[]'Measure>(input: decimal<'Measure>):decimal = retype input - static member inline Remove<[]'Measure>(input: float32<'Measure>):float32 = retype input - static member inline Remove<[]'Measure>(input: unativeint<'Measure>):unativeint = retype input - - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: byte<'MeasureIn>):byte<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: float<'MeasureIn>):float<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: int16<'MeasureIn>):int16<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: int<'MeasureIn>):int<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: int64<'MeasureIn>):int64<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: sbyte<'MeasureIn>):sbyte<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: nativeint<'MeasureIn>):nativeint<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: uint16<'MeasureIn>):uint16<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: uint<'MeasureIn>):uint<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: uint64<'MeasureIn>):uint64<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: decimal<'MeasureIn>):decimal<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: float32<'MeasureIn>):float32<'MeasureOut> = retype input - static member inline Cast<[]'MeasureIn, []'MeasureOut>(input: unativeint<'MeasureIn>):unativeint<'MeasureOut> = retype input - - static member inline AddArray<[]'Measure>(input: byte[]):byte<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: float[]):float<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: int16[]):int16<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: int[]):int<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: int64[]):int64<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: sbyte[]):sbyte<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: nativeint[]):nativeint<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: uint16[]):uint16<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: uint[]):uint<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: uint64[]):uint64<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: decimal[]):decimal<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: float32[]):float32<'Measure>[] = retype input - static member inline AddArray<[]'Measure>(input: unativeint[]):unativeint<'Measure>[] = retype input - - static member inline RemoveArray<[]'Measure>(input: byte<'Measure>[]):byte[] = retype input - static member inline RemoveArray<[]'Measure>(input: float<'Measure>[]):float[] = retype input - static member inline RemoveArray<[]'Measure>(input: int16<'Measure>[]):int16[] = retype input - static member inline RemoveArray<[]'Measure>(input: int<'Measure>[]):int[] = retype input - static member inline RemoveArray<[]'Measure>(input: int64<'Measure>[]):int64[] = retype input - static member inline RemoveArray<[]'Measure>(input: sbyte<'Measure>[]):sbyte[] = retype input - static member inline RemoveArray<[]'Measure>(input: nativeint<'Measure>[]):nativeint[] = retype input - static member inline RemoveArray<[]'Measure>(input: uint16<'Measure>[]):uint16[] = retype input - static member inline RemoveArray<[]'Measure>(input: uint<'Measure>[]):uint[] = retype input - static member inline RemoveArray<[]'Measure>(input: uint64<'Measure>[]):uint64[] = retype input - static member inline RemoveArray<[]'Measure>(input: decimal<'Measure>[]):decimal[] = retype input - static member inline RemoveArray<[]'Measure>(input: float32<'Measure>[]):float32[] = retype input - static member inline RemoveArray<[]'Measure>(input: unativeint<'Measure>[]):unativeint[] = retype input - - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: byte<'MeasureIn>[]):byte<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: float<'MeasureIn>[]):float<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: int16<'MeasureIn>[]):int16<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: int<'MeasureIn>[]):int<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: int64<'MeasureIn>[]):int64<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: sbyte<'MeasureIn>[]):sbyte<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: uint16<'MeasureIn>[]):uint16<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: uint<'MeasureIn>[]):uint<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: uint64<'MeasureIn>[]):uint64<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: decimal<'MeasureIn>[]):decimal<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: float32<'MeasureIn>[]):float32<'MeasureOut>[] = retype input - static member inline CastArray<[]'MeasureIn, []'MeasureOut>(input: unativeint<'MeasureIn>[]):unativeint<'MeasureOut>[] = retype input - - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - static member inline AddResizeArray<[]'Measure>(input: ResizeArray):ResizeArray> = retype input - - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - static member inline RemoveResizeArray<[]'Measure>(input: ResizeArray>):ResizeArray = retype input - - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - static member inline CastResizeArray<[]'MeasureIn, []'MeasureOut>(input: ResizeArray>):ResizeArray> = retype input - - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - static member inline AddList<[]'Measure>(input: list):list> = retype input - - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - static member inline RemoveList<[]'Measure>(input: list>):list = retype input - - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - static member inline CastList<[]'MeasureIn, []'MeasureOut>(input: list>):list> = retype input - - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - static member inline AddSeq<[]'Measure>(input: seq):seq> = retype input - - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - static member inline RemoveSeq<[]'Measure>(input: seq>):seq = retype input - - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input - static member inline CastSeq<[]'MeasureIn, []'MeasureOut>(input: seq>):seq> = retype input + static member inline Add<[] 'Measure>(input: byte) : byte<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: float) : float<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: int16) : int16<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: int) : int<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: int64) : int64<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: sbyte) : sbyte<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: nativeint) : nativeint<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: uint16) : uint16<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: uint) : uint<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: uint64) : uint64<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: decimal) : decimal<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: float32) : float32<'Measure> = + retype input + + static member inline Add<[] 'Measure>(input: unativeint) : unativeint<'Measure> = + retype input + + static member inline Remove<[] 'Measure>(input: byte<'Measure>) : byte = + retype input + + static member inline Remove<[] 'Measure>(input: float<'Measure>) : float = + retype input + + static member inline Remove<[] 'Measure>(input: int16<'Measure>) : int16 = + retype input + + static member inline Remove<[] 'Measure>(input: int<'Measure>) : int = + retype input + + static member inline Remove<[] 'Measure>(input: int64<'Measure>) : int64 = + retype input + + static member inline Remove<[] 'Measure>(input: sbyte<'Measure>) : sbyte = + retype input + + static member inline Remove<[] 'Measure>(input: nativeint<'Measure>) : nativeint = + retype input + + static member inline Remove<[] 'Measure>(input: uint16<'Measure>) : uint16 = + retype input + + static member inline Remove<[] 'Measure>(input: uint<'Measure>) : uint = + retype input + + static member inline Remove<[] 'Measure>(input: uint64<'Measure>) : uint64 = + retype input + + static member inline Remove<[] 'Measure>(input: decimal<'Measure>) : decimal = + retype input + + static member inline Remove<[] 'Measure>(input: float32<'Measure>) : float32 = + retype input + + static member inline Remove<[] 'Measure>(input: unativeint<'Measure>) : unativeint = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: byte<'MeasureIn>) + : byte<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: float<'MeasureIn>) + : float<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: int16<'MeasureIn>) + : int16<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: int<'MeasureIn>) + : int<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: int64<'MeasureIn>) + : int64<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: sbyte<'MeasureIn>) + : sbyte<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: nativeint<'MeasureIn>) + : nativeint<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: uint16<'MeasureIn>) + : uint16<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: uint<'MeasureIn>) + : uint<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: uint64<'MeasureIn>) + : uint64<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: decimal<'MeasureIn>) + : decimal<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: float32<'MeasureIn>) + : float32<'MeasureOut> = + retype input + + static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> + (input: unativeint<'MeasureIn>) + : unativeint<'MeasureOut> = + retype input + + static member inline AddArray<[] 'Measure>(input: byte[]) : byte<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: float[]) : float<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: int16[]) : int16<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: int[]) : int<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: int64[]) : int64<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: sbyte[]) : sbyte<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: nativeint[]) : nativeint<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: uint16[]) : uint16<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: uint[]) : uint<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: uint64[]) : uint64<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: decimal[]) : decimal<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: float32[]) : float32<'Measure>[] = + retype input + + static member inline AddArray<[] 'Measure>(input: unativeint[]) : unativeint<'Measure>[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: byte<'Measure>[]) : byte[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: float<'Measure>[]) : float[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: int16<'Measure>[]) : int16[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: int<'Measure>[]) : int[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: int64<'Measure>[]) : int64[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: sbyte<'Measure>[]) : sbyte[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: nativeint<'Measure>[]) : nativeint[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: uint16<'Measure>[]) : uint16[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: uint<'Measure>[]) : uint[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: uint64<'Measure>[]) : uint64[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: decimal<'Measure>[]) : decimal[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: float32<'Measure>[]) : float32[] = + retype input + + static member inline RemoveArray<[] 'Measure>(input: unativeint<'Measure>[]) : unativeint[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: byte<'MeasureIn>[]) + : byte<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: float<'MeasureIn>[]) + : float<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: int16<'MeasureIn>[]) + : int16<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: int<'MeasureIn>[]) + : int<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: int64<'MeasureIn>[]) + : int64<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: sbyte<'MeasureIn>[]) + : sbyte<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: uint16<'MeasureIn>[]) + : uint16<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: uint<'MeasureIn>[]) + : uint<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: uint64<'MeasureIn>[]) + : uint64<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: decimal<'MeasureIn>[]) + : decimal<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: float32<'MeasureIn>[]) + : float32<'MeasureOut>[] = + retype input + + static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> + (input: unativeint<'MeasureIn>[]) + : unativeint<'MeasureOut>[] = + retype input + + static member inline AddResizeArray<[] 'Measure>(input: ResizeArray) : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure>(input: ResizeArray) : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure>(input: ResizeArray) : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline AddResizeArray<[] 'Measure> + (input: ResizeArray) + : ResizeArray> = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure>(input: ResizeArray>) : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline RemoveResizeArray<[] 'Measure> + (input: ResizeArray>) + : ResizeArray = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> + (input: ResizeArray>) + : ResizeArray> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline AddList<[] 'Measure>(input: list) : list> = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline RemoveList<[] 'Measure>(input: list>) : list = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> + (input: list>) + : list> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline AddSeq<[] 'Measure>(input: seq) : seq> = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input + + static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> + (input: seq>) + : seq> = + retype input From b930e42aa1cd2db244a7011d2ba6b489117dc93f Mon Sep 17 00:00:00 2001 From: Rob Lenders Date: Mon, 17 Feb 2025 16:54:47 -0600 Subject: [PATCH 5/8] Use alternate Measure impl --- src/FSharp.Core/Units.fs | 814 +++------------------------------------ 1 file changed, 53 insertions(+), 761 deletions(-) diff --git a/src/FSharp.Core/Units.fs b/src/FSharp.Core/Units.fs index 1b826493466..1c674cd2614 100644 --- a/src/FSharp.Core/Units.fs +++ b/src/FSharp.Core/Units.fs @@ -1,763 +1,55 @@ namespace Microsoft.FSharp.Core -open Microsoft.FSharp.Collections - -[] -module private UnitsHelpers = - let inline retype (x: 'T) : 'U = - (# "" x: 'U #) - -type Units = - static member inline Add<[] 'Measure>(input: byte) : byte<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: float) : float<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: int16) : int16<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: int) : int<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: int64) : int64<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: sbyte) : sbyte<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: nativeint) : nativeint<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: uint16) : uint16<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: uint) : uint<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: uint64) : uint64<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: decimal) : decimal<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: float32) : float32<'Measure> = - retype input - - static member inline Add<[] 'Measure>(input: unativeint) : unativeint<'Measure> = - retype input - - static member inline Remove<[] 'Measure>(input: byte<'Measure>) : byte = - retype input - - static member inline Remove<[] 'Measure>(input: float<'Measure>) : float = - retype input - - static member inline Remove<[] 'Measure>(input: int16<'Measure>) : int16 = - retype input - - static member inline Remove<[] 'Measure>(input: int<'Measure>) : int = - retype input - - static member inline Remove<[] 'Measure>(input: int64<'Measure>) : int64 = - retype input - - static member inline Remove<[] 'Measure>(input: sbyte<'Measure>) : sbyte = - retype input - - static member inline Remove<[] 'Measure>(input: nativeint<'Measure>) : nativeint = - retype input - - static member inline Remove<[] 'Measure>(input: uint16<'Measure>) : uint16 = - retype input - - static member inline Remove<[] 'Measure>(input: uint<'Measure>) : uint = - retype input - - static member inline Remove<[] 'Measure>(input: uint64<'Measure>) : uint64 = - retype input - - static member inline Remove<[] 'Measure>(input: decimal<'Measure>) : decimal = - retype input - - static member inline Remove<[] 'Measure>(input: float32<'Measure>) : float32 = - retype input - - static member inline Remove<[] 'Measure>(input: unativeint<'Measure>) : unativeint = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: byte<'MeasureIn>) - : byte<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: float<'MeasureIn>) - : float<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: int16<'MeasureIn>) - : int16<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: int<'MeasureIn>) - : int<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: int64<'MeasureIn>) - : int64<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: sbyte<'MeasureIn>) - : sbyte<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: nativeint<'MeasureIn>) - : nativeint<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: uint16<'MeasureIn>) - : uint16<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: uint<'MeasureIn>) - : uint<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: uint64<'MeasureIn>) - : uint64<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: decimal<'MeasureIn>) - : decimal<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: float32<'MeasureIn>) - : float32<'MeasureOut> = - retype input - - static member inline Cast<[] 'MeasureIn, [] 'MeasureOut> - (input: unativeint<'MeasureIn>) - : unativeint<'MeasureOut> = - retype input - - static member inline AddArray<[] 'Measure>(input: byte[]) : byte<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: float[]) : float<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: int16[]) : int16<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: int[]) : int<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: int64[]) : int64<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: sbyte[]) : sbyte<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: nativeint[]) : nativeint<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: uint16[]) : uint16<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: uint[]) : uint<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: uint64[]) : uint64<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: decimal[]) : decimal<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: float32[]) : float32<'Measure>[] = - retype input - - static member inline AddArray<[] 'Measure>(input: unativeint[]) : unativeint<'Measure>[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: byte<'Measure>[]) : byte[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: float<'Measure>[]) : float[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: int16<'Measure>[]) : int16[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: int<'Measure>[]) : int[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: int64<'Measure>[]) : int64[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: sbyte<'Measure>[]) : sbyte[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: nativeint<'Measure>[]) : nativeint[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: uint16<'Measure>[]) : uint16[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: uint<'Measure>[]) : uint[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: uint64<'Measure>[]) : uint64[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: decimal<'Measure>[]) : decimal[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: float32<'Measure>[]) : float32[] = - retype input - - static member inline RemoveArray<[] 'Measure>(input: unativeint<'Measure>[]) : unativeint[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: byte<'MeasureIn>[]) - : byte<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: float<'MeasureIn>[]) - : float<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: int16<'MeasureIn>[]) - : int16<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: int<'MeasureIn>[]) - : int<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: int64<'MeasureIn>[]) - : int64<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: sbyte<'MeasureIn>[]) - : sbyte<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: uint16<'MeasureIn>[]) - : uint16<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: uint<'MeasureIn>[]) - : uint<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: uint64<'MeasureIn>[]) - : uint64<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: decimal<'MeasureIn>[]) - : decimal<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: float32<'MeasureIn>[]) - : float32<'MeasureOut>[] = - retype input - - static member inline CastArray<[] 'MeasureIn, [] 'MeasureOut> - (input: unativeint<'MeasureIn>[]) - : unativeint<'MeasureOut>[] = - retype input - - static member inline AddResizeArray<[] 'Measure>(input: ResizeArray) : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure>(input: ResizeArray) : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure>(input: ResizeArray) : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline AddResizeArray<[] 'Measure> - (input: ResizeArray) - : ResizeArray> = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure>(input: ResizeArray>) : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline RemoveResizeArray<[] 'Measure> - (input: ResizeArray>) - : ResizeArray = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline CastResizeArray<[] 'MeasureIn, [] 'MeasureOut> - (input: ResizeArray>) - : ResizeArray> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline AddList<[] 'Measure>(input: list) : list> = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline RemoveList<[] 'Measure>(input: list>) : list = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline CastList<[] 'MeasureIn, [] 'MeasureOut> - (input: list>) - : list> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline AddSeq<[] 'Measure>(input: seq) : seq> = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline RemoveSeq<[] 'Measure>(input: seq>) : seq = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input - - static member inline CastSeq<[] 'MeasureIn, [] 'MeasureOut> - (input: seq>) - : seq> = - retype input +open System.ComponentModel + +[] +type Measure = + static member inline Tag (value : byte ) : byte<'Measure> = LanguagePrimitives.ByteWithMeasure value + static member inline Tag (value : sbyte ) : sbyte<'Measure> = LanguagePrimitives.SByteWithMeasure value + static member inline Tag (value : int16 ) : int16<'Measure> = LanguagePrimitives.Int16WithMeasure value + static member inline Tag (value : uint16 ) : uint16<'Measure> = LanguagePrimitives.UInt16WithMeasure value + static member inline Tag (value : int ) : int<'Measure> = LanguagePrimitives.Int32WithMeasure value + static member inline Tag (value : uint ) : uint<'Measure> = LanguagePrimitives.UInt32WithMeasure value + static member inline Tag (value : int64 ) : int64<'Measure> = LanguagePrimitives.Int64WithMeasure value + static member inline Tag (value : uint64 ) : uint64<'Measure> = LanguagePrimitives.UInt64WithMeasure value + static member inline Tag (value : nativeint ) : nativeint<'Measure> = LanguagePrimitives.IntPtrWithMeasure value + static member inline Tag (value : unativeint) : unativeint<'Measure> = LanguagePrimitives.UIntPtrWithMeasure value + static member inline Tag (value : float ) : float<'Measure> = LanguagePrimitives.FloatWithMeasure value + static member inline Tag (value : float32 ) : float32<'Measure> = LanguagePrimitives.Float32WithMeasure value + static member inline Tag (value : decimal ) : decimal<'Measure> = LanguagePrimitives.DecimalWithMeasure value + + static member inline InvokeTag value : '``T<'Measure>`` = + let inline call_2 (_ : ^a, b : ^b) = ((^a or ^b) : (static member Tag : _ -> _) b) + call_2 (Unchecked.defaultof, value) + + static member inline Untag (value : byte<'Measure> ) = byte value + static member inline Untag (value : sbyte<'Measure> ) = sbyte value + static member inline Untag (value : int16<'Measure> ) = int16 value + static member inline Untag (value : uint16<'Measure> ) = uint16 value + static member inline Untag (value : int<'Measure> ) = int value + static member inline Untag (value : uint<'Measure> ) = uint value + static member inline Untag (value : int64<'Measure> ) = int64 value + static member inline Untag (value : uint64<'Measure> ) = uint64 value + static member inline Untag (value : nativeint<'Measure> ) = nativeint value + static member inline Untag (value : unativeint<'Measure>) = unativeint value + static member inline Untag (value : float<'Measure> ) = float value + static member inline Untag (value : float32<'Measure> ) = float32 value + static member inline Untag (value : decimal<'Measure> ) = decimal value + + static member inline InvokeUntag value : 'T = + let inline call_2 (_ : ^a, b : ^b) = ((^a or ^b) : (static member Untag : _ -> _) b) + call_2 (Unchecked.defaultof, value) + +[] +module Measure = + /// Tags a value with a unit of measure. + let inline tag (value : 'T) : '``T<'Measure>`` = Measure.InvokeTag value + + /// Removes a unit of measure from a value. + let inline untag (value : '``T<'Measure>``) : 'T = Measure.InvokeUntag value + + /// Tags a value with a new unit of measure. + let inline retag (value : '``T<'Measure1>``) : '``T<'Measure2>`` = tag (untag value : 'T) + + /// Maps a value with a unit of measure to another value with a unit of measure. + let inline map ([] mapping : 'T -> 'U) (value : '``T<'Measure1>``) : '``U<'Measure2>`` = tag (mapping (untag value)) From b3ed399d0a6498f24ca26acbe7a7917aa53a4e6f Mon Sep 17 00:00:00 2001 From: Rob Lenders Date: Mon, 17 Feb 2025 17:08:50 -0600 Subject: [PATCH 6/8] Rename Units.fs to Measure.fs --- src/FSharp.Core/FSharp.Core.fsproj | 4 ++-- src/FSharp.Core/{Units.fs => Measure.fs} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename src/FSharp.Core/{Units.fs => Measure.fs} (100%) diff --git a/src/FSharp.Core/FSharp.Core.fsproj b/src/FSharp.Core/FSharp.Core.fsproj index bf4896f4441..bf8d21b2db6 100644 --- a/src/FSharp.Core/FSharp.Core.fsproj +++ b/src/FSharp.Core/FSharp.Core.fsproj @@ -276,8 +276,8 @@ Queries/Query.fs - - Units/Units.fs + + Units/Measure.fs Units/SI.fs diff --git a/src/FSharp.Core/Units.fs b/src/FSharp.Core/Measure.fs similarity index 100% rename from src/FSharp.Core/Units.fs rename to src/FSharp.Core/Measure.fs From 028f95591a0d7db71491f94ecc6285a056d71ec4 Mon Sep 17 00:00:00 2001 From: Rob Lenders Date: Mon, 17 Feb 2025 17:25:30 -0600 Subject: [PATCH 7/8] Formatting --- src/FSharp.Core/Measure.fs | 122 +++++++++++++++++++++++++++---------- 1 file changed, 90 insertions(+), 32 deletions(-) diff --git a/src/FSharp.Core/Measure.fs b/src/FSharp.Core/Measure.fs index 1c674cd2614..149467eb6fc 100644 --- a/src/FSharp.Core/Measure.fs +++ b/src/FSharp.Core/Measure.fs @@ -4,52 +4,110 @@ open System.ComponentModel [] type Measure = - static member inline Tag (value : byte ) : byte<'Measure> = LanguagePrimitives.ByteWithMeasure value - static member inline Tag (value : sbyte ) : sbyte<'Measure> = LanguagePrimitives.SByteWithMeasure value - static member inline Tag (value : int16 ) : int16<'Measure> = LanguagePrimitives.Int16WithMeasure value - static member inline Tag (value : uint16 ) : uint16<'Measure> = LanguagePrimitives.UInt16WithMeasure value - static member inline Tag (value : int ) : int<'Measure> = LanguagePrimitives.Int32WithMeasure value - static member inline Tag (value : uint ) : uint<'Measure> = LanguagePrimitives.UInt32WithMeasure value - static member inline Tag (value : int64 ) : int64<'Measure> = LanguagePrimitives.Int64WithMeasure value - static member inline Tag (value : uint64 ) : uint64<'Measure> = LanguagePrimitives.UInt64WithMeasure value - static member inline Tag (value : nativeint ) : nativeint<'Measure> = LanguagePrimitives.IntPtrWithMeasure value - static member inline Tag (value : unativeint) : unativeint<'Measure> = LanguagePrimitives.UIntPtrWithMeasure value - static member inline Tag (value : float ) : float<'Measure> = LanguagePrimitives.FloatWithMeasure value - static member inline Tag (value : float32 ) : float32<'Measure> = LanguagePrimitives.Float32WithMeasure value - static member inline Tag (value : decimal ) : decimal<'Measure> = LanguagePrimitives.DecimalWithMeasure value + static member inline Tag(value: byte) : byte<'Measure> = + LanguagePrimitives.ByteWithMeasure value + + static member inline Tag(value: sbyte) : sbyte<'Measure> = + LanguagePrimitives.SByteWithMeasure value + + static member inline Tag(value: int16) : int16<'Measure> = + LanguagePrimitives.Int16WithMeasure value + + static member inline Tag(value: uint16) : uint16<'Measure> = + LanguagePrimitives.UInt16WithMeasure value + + static member inline Tag(value: int) : int<'Measure> = + LanguagePrimitives.Int32WithMeasure value + + static member inline Tag(value: uint) : uint<'Measure> = + LanguagePrimitives.UInt32WithMeasure value + + static member inline Tag(value: int64) : int64<'Measure> = + LanguagePrimitives.Int64WithMeasure value + + static member inline Tag(value: uint64) : uint64<'Measure> = + LanguagePrimitives.UInt64WithMeasure value + + static member inline Tag(value: nativeint) : nativeint<'Measure> = + LanguagePrimitives.IntPtrWithMeasure value + + static member inline Tag(value: unativeint) : unativeint<'Measure> = + LanguagePrimitives.UIntPtrWithMeasure value + + static member inline Tag(value: float) : float<'Measure> = + LanguagePrimitives.FloatWithMeasure value + + static member inline Tag(value: float32) : float32<'Measure> = + LanguagePrimitives.Float32WithMeasure value + + static member inline Tag(value: decimal) : decimal<'Measure> = + LanguagePrimitives.DecimalWithMeasure value static member inline InvokeTag value : '``T<'Measure>`` = - let inline call_2 (_ : ^a, b : ^b) = ((^a or ^b) : (static member Tag : _ -> _) b) + let inline call_2 (_: ^a, b: ^b) = + ((^a or ^b): (static member Tag: _ -> _) b) + call_2 (Unchecked.defaultof, value) - static member inline Untag (value : byte<'Measure> ) = byte value - static member inline Untag (value : sbyte<'Measure> ) = sbyte value - static member inline Untag (value : int16<'Measure> ) = int16 value - static member inline Untag (value : uint16<'Measure> ) = uint16 value - static member inline Untag (value : int<'Measure> ) = int value - static member inline Untag (value : uint<'Measure> ) = uint value - static member inline Untag (value : int64<'Measure> ) = int64 value - static member inline Untag (value : uint64<'Measure> ) = uint64 value - static member inline Untag (value : nativeint<'Measure> ) = nativeint value - static member inline Untag (value : unativeint<'Measure>) = unativeint value - static member inline Untag (value : float<'Measure> ) = float value - static member inline Untag (value : float32<'Measure> ) = float32 value - static member inline Untag (value : decimal<'Measure> ) = decimal value + static member inline Untag(value: byte<'Measure>) = + byte value + + static member inline Untag(value: sbyte<'Measure>) = + sbyte value + + static member inline Untag(value: int16<'Measure>) = + int16 value + + static member inline Untag(value: uint16<'Measure>) = + uint16 value + + static member inline Untag(value: int<'Measure>) = + int value + + static member inline Untag(value: uint<'Measure>) = + uint value + + static member inline Untag(value: int64<'Measure>) = + int64 value + + static member inline Untag(value: uint64<'Measure>) = + uint64 value + + static member inline Untag(value: nativeint<'Measure>) = + nativeint value + + static member inline Untag(value: unativeint<'Measure>) = + unativeint value + + static member inline Untag(value: float<'Measure>) = + float value + + static member inline Untag(value: float32<'Measure>) = + float32 value + + static member inline Untag(value: decimal<'Measure>) = + decimal value static member inline InvokeUntag value : 'T = - let inline call_2 (_ : ^a, b : ^b) = ((^a or ^b) : (static member Untag : _ -> _) b) + let inline call_2 (_: ^a, b: ^b) = + ((^a or ^b): (static member Untag: _ -> _) b) + call_2 (Unchecked.defaultof, value) [] module Measure = /// Tags a value with a unit of measure. - let inline tag (value : 'T) : '``T<'Measure>`` = Measure.InvokeTag value + let inline tag (value: 'T) : '``T<'Measure>`` = + Measure.InvokeTag value /// Removes a unit of measure from a value. - let inline untag (value : '``T<'Measure>``) : 'T = Measure.InvokeUntag value + let inline untag (value: '``T<'Measure>``) : 'T = + Measure.InvokeUntag value /// Tags a value with a new unit of measure. - let inline retag (value : '``T<'Measure1>``) : '``T<'Measure2>`` = tag (untag value : 'T) + let inline retag (value: '``T<'Measure1>``) : '``T<'Measure2>`` = + tag (untag value: 'T) /// Maps a value with a unit of measure to another value with a unit of measure. - let inline map ([] mapping : 'T -> 'U) (value : '``T<'Measure1>``) : '``U<'Measure2>`` = tag (mapping (untag value)) + let inline map ([] mapping: 'T -> 'U) (value: '``T<'Measure1>``) : '``U<'Measure2>`` = + tag (mapping (untag value)) From 517b393c1e02e318a742eb21e5f5862ca2d6dc44 Mon Sep 17 00:00:00 2001 From: Rob Lenders Date: Mon, 17 Feb 2025 17:27:58 -0600 Subject: [PATCH 8/8] Update release notes --- docs/release-notes/.FSharp.Core/9.0.100.md | 1 - docs/release-notes/.FSharp.Core/9.0.300.md | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/.FSharp.Core/9.0.100.md b/docs/release-notes/.FSharp.Core/9.0.100.md index 0d0e82c932d..503a6c17d85 100644 --- a/docs/release-notes/.FSharp.Core/9.0.100.md +++ b/docs/release-notes/.FSharp.Core/9.0.100.md @@ -5,7 +5,6 @@ * Enable C# collection expression support for F# lists & sets. ([Language suggestion #1355](https://github.com/fsharp/fslang-suggestions/issues/1355), [RFC FS-1145 (PR#776)](https://github.com/fsharp/fslang-design/pull/776), [PR #17359](https://github.com/dotnet/fsharp/pull/17359)) * Add module functions for converting between `'T option` and `'T voption`. ([PR #17436](https://github.com/dotnet/fsharp/pull/17436)) -* Add `Units` static type which aids in the addition, removal, and conversion of units of measure for primitive types and common collections of primitive types. ([Language Suggestion #892](https://github.com/fsharp/fslang-suggestions/issues/892)) ([RFC FS-1148 #784](https://github.com/fsharp/fslang-design/pull/784)) ([PR #17581](https://github.com/dotnet/fsharp/pull/17518)) ### Changed * Change compiler default setting realsig+ when building assemblies ([Issue #17384](https://github.com/dotnet/fsharp/issues/17384), [PR #17378](https://github.com/dotnet/fsharp/pull/17385)) diff --git a/docs/release-notes/.FSharp.Core/9.0.300.md b/docs/release-notes/.FSharp.Core/9.0.300.md index 5e6903f3fa4..e9625cf8de2 100644 --- a/docs/release-notes/.FSharp.Core/9.0.300.md +++ b/docs/release-notes/.FSharp.Core/9.0.300.md @@ -2,6 +2,7 @@ ### Added * Added nullability annotations to `.Using` builder method for `async` and `task` builders ([PR #18292](https://github.com/dotnet/fsharp/pull/18292)) +* Add `Measure` static type and module which aids in the addition, removal, and conversion of units of measure for primitive types and common collections of primitive types. ([Language Suggestion #892](https://github.com/fsharp/fslang-suggestions/issues/892)) ([RFC FS-1148 #784](https://github.com/fsharp/fslang-design/pull/784)) ([PR #17581](https://github.com/dotnet/fsharp/pull/17518)) ### Changed