Skip to content

Commit d0b2a41

Browse files
authored
Merge main to release/dev17.12 (#17450)
2 parents 1981d46 + 0ed1722 commit d0b2a41

File tree

7 files changed

+114
-0
lines changed

7 files changed

+114
-0
lines changed

docs/release-notes/.FSharp.Core/9.0.100.md

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
### Added
44

55
* 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))
6+
* Add module functions for converting between `'T option` and `'T voption`. ([PR #17436](https://github.com/dotnet/fsharp/pull/17436))
67

78
### Changed
89
* 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))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
### Fixed
2+
3+
### Added
4+
5+
### Changed
6+
7+
### Breaking Changes

src/FSharp.Core/option.fs

+24
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,18 @@ module Option =
178178
| Some x -> x
179179
#endif
180180

181+
[<CompiledName("OfValueOption")>]
182+
let inline ofValueOption (voption: 'T voption) =
183+
match voption with
184+
| ValueNone -> None
185+
| ValueSome x -> Some x
186+
187+
[<CompiledName("ToValueOption")>]
188+
let inline toValueOption (option: 'T option) =
189+
match option with
190+
| None -> ValueNone
191+
| Some x -> ValueSome x
192+
181193
module ValueOption =
182194

183195
[<CompiledName("GetValue")>]
@@ -355,3 +367,15 @@ module ValueOption =
355367
| ValueNone -> null
356368
| ValueSome x -> x
357369
#endif
370+
371+
[<CompiledName("OfOption")>]
372+
let inline ofOption (option: 'T option) =
373+
match option with
374+
| None -> ValueNone
375+
| Some x -> ValueSome x
376+
377+
[<CompiledName("ToOption")>]
378+
let inline toOption (voption: 'T voption) =
379+
match voption with
380+
| ValueNone -> None
381+
| ValueSome x -> Some x

src/FSharp.Core/option.fsi

+60
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,36 @@ module Option =
468468
val inline toObj: value: 'T option -> 'T | null when 'T : not struct (* and 'T : not null *)
469469
#endif
470470

471+
/// <summary>Convert a value option to an option.</summary>
472+
///
473+
/// <param name="voption">The input value option.</param>
474+
///
475+
/// <returns>The resulting option.</returns>
476+
///
477+
/// <example id="ofValueOption-1">
478+
/// <code lang="fsharp">
479+
/// ValueSome 42 |> Option.ofValueOption // evaluates to Some 42
480+
/// (ValueNone: int voption) |> Option.ofValueOption // evaluates to None
481+
/// </code>
482+
/// </example>
483+
[<CompiledName("OfValueOption")>]
484+
val inline ofValueOption: voption: 'T voption -> 'T option
485+
486+
/// <summary>Convert an option to a value option.</summary>
487+
///
488+
/// <param name="option">The input option.</param>
489+
///
490+
/// <returns>The resulting value option.</returns>
491+
///
492+
/// <example id="toValueOption-1">
493+
/// <code lang="fsharp">
494+
/// Some 42 |> Option.toValueOption // evaluates to ValueSome 42
495+
/// (None: int option) |> Option.toValueOption // evaluates to ValueNone
496+
/// </code>
497+
/// </example>
498+
[<CompiledName("ToValueOption")>]
499+
val inline toValueOption: option: 'T option -> 'T voption
500+
471501
/// <summary>Contains operations for working with value options.</summary>
472502
///
473503
/// <category>Options</category>
@@ -926,3 +956,33 @@ module ValueOption =
926956
// TODO NULLNESS: assess this change - is it a breaking change?
927957
val inline toObj: value: 'T voption -> 'T | null when 'T : not struct (* and 'T : not null *)
928958
#endif
959+
960+
/// <summary>Convert an option to a value option.</summary>
961+
///
962+
/// <param name="option">The input option.</param>
963+
///
964+
/// <returns>The resulting value option.</returns>
965+
///
966+
/// <example id="ofOption-1">
967+
/// <code lang="fsharp">
968+
/// Some 42 |> ValueOption.ofOption // evaluates to ValueSome 42
969+
/// (None: int option) |> ValueOption.ofOption // evaluates to ValueNone
970+
/// </code>
971+
/// </example>
972+
[<CompiledName("OfOption")>]
973+
val inline ofOption: option: 'T option -> 'T voption
974+
975+
/// <summary>Convert a value option to an option.</summary>
976+
///
977+
/// <param name="voption">The input value option.</param>
978+
///
979+
/// <returns>The resulting option.</returns>
980+
///
981+
/// <example id="toOption-1">
982+
/// <code lang="fsharp">
983+
/// ValueSome 42 |> ValueOption.toOption // evaluates to Some 42
984+
/// (ValueNone: int voption) |> ValueOption.toOption // evaluates to None
985+
/// </code>
986+
/// </example>
987+
[<CompiledName("ToOption")>]
988+
val inline toOption: voption: 'T voption -> 'T option

tests/FSharp.Core.UnitTests/FSharp.Core.SurfaceArea.netstandard20.release.bsl

+4
Original file line numberDiff line numberDiff line change
@@ -2016,8 +2016,10 @@ Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] Filt
20162016
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] Flatten[T](Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpOption`1[T]])
20172017
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OfNullable[T](System.Nullable`1[T])
20182018
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OfObj[T](T)
2019+
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OfValueOption[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
20192020
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OrElseWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.FSharpOption`1[T]], Microsoft.FSharp.Core.FSharpOption`1[T])
20202021
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OrElse[T](Microsoft.FSharp.Core.FSharpOption`1[T], Microsoft.FSharp.Core.FSharpOption`1[T])
2022+
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpValueOption`1[T] ToValueOption[T](Microsoft.FSharp.Core.FSharpOption`1[T])
20212023
Microsoft.FSharp.Core.OptionModule: System.Nullable`1[T] ToNullable[T](Microsoft.FSharp.Core.FSharpOption`1[T])
20222024
Microsoft.FSharp.Core.OptionModule: T DefaultValue[T](T, Microsoft.FSharp.Core.FSharpOption`1[T])
20232025
Microsoft.FSharp.Core.OptionModule: T DefaultWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,T], Microsoft.FSharp.Core.FSharpOption`1[T])
@@ -2124,6 +2126,7 @@ Microsoft.FSharp.Core.ValueOption: Boolean IsNone[T](Microsoft.FSharp.Core.FShar
21242126
Microsoft.FSharp.Core.ValueOption: Boolean IsSome[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
21252127
Microsoft.FSharp.Core.ValueOption: Int32 Count[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
21262128
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Collections.FSharpList`1[T] ToList[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
2129+
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpOption`1[T] ToOption[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
21272130
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Bind[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpValueOption`1[TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T])
21282131
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map2[T1,T2,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2])
21292132
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map3[T1,T2,T3,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,TResult]]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2], Microsoft.FSharp.Core.FSharpValueOption`1[T3])
@@ -2132,6 +2135,7 @@ Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T]
21322135
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] Flatten[T](Microsoft.FSharp.Core.FSharpValueOption`1[Microsoft.FSharp.Core.FSharpValueOption`1[T]])
21332136
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfNullable[T](System.Nullable`1[T])
21342137
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfObj[T](T)
2138+
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfOption[T](Microsoft.FSharp.Core.FSharpOption`1[T])
21352139
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElseWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.FSharpValueOption`1[T]], Microsoft.FSharp.Core.FSharpValueOption`1[T])
21362140
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElse[T](Microsoft.FSharp.Core.FSharpValueOption`1[T], Microsoft.FSharp.Core.FSharpValueOption`1[T])
21372141
Microsoft.FSharp.Core.ValueOption: System.Nullable`1[T] ToNullable[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])

tests/FSharp.Core.UnitTests/FSharp.Core.SurfaceArea.netstandard21.release.bsl

+4
Original file line numberDiff line numberDiff line change
@@ -2019,8 +2019,10 @@ Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] Filt
20192019
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] Flatten[T](Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Core.FSharpOption`1[T]])
20202020
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OfNullable[T](System.Nullable`1[T])
20212021
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OfObj[T](T)
2022+
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OfValueOption[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
20222023
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OrElseWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.FSharpOption`1[T]], Microsoft.FSharp.Core.FSharpOption`1[T])
20232024
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpOption`1[T] OrElse[T](Microsoft.FSharp.Core.FSharpOption`1[T], Microsoft.FSharp.Core.FSharpOption`1[T])
2025+
Microsoft.FSharp.Core.OptionModule: Microsoft.FSharp.Core.FSharpValueOption`1[T] ToValueOption[T](Microsoft.FSharp.Core.FSharpOption`1[T])
20242026
Microsoft.FSharp.Core.OptionModule: System.Nullable`1[T] ToNullable[T](Microsoft.FSharp.Core.FSharpOption`1[T])
20252027
Microsoft.FSharp.Core.OptionModule: T DefaultValue[T](T, Microsoft.FSharp.Core.FSharpOption`1[T])
20262028
Microsoft.FSharp.Core.OptionModule: T DefaultWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,T], Microsoft.FSharp.Core.FSharpOption`1[T])
@@ -2127,6 +2129,7 @@ Microsoft.FSharp.Core.ValueOption: Boolean IsNone[T](Microsoft.FSharp.Core.FShar
21272129
Microsoft.FSharp.Core.ValueOption: Boolean IsSome[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
21282130
Microsoft.FSharp.Core.ValueOption: Int32 Count[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
21292131
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Collections.FSharpList`1[T] ToList[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
2132+
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpOption`1[T] ToOption[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])
21302133
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Bind[T,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T,Microsoft.FSharp.Core.FSharpValueOption`1[TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T])
21312134
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map2[T1,T2,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,TResult]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2])
21322135
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[TResult] Map3[T1,T2,T3,TResult](Microsoft.FSharp.Core.FSharpFunc`2[T1,Microsoft.FSharp.Core.FSharpFunc`2[T2,Microsoft.FSharp.Core.FSharpFunc`2[T3,TResult]]], Microsoft.FSharp.Core.FSharpValueOption`1[T1], Microsoft.FSharp.Core.FSharpValueOption`1[T2], Microsoft.FSharp.Core.FSharpValueOption`1[T3])
@@ -2135,6 +2138,7 @@ Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T]
21352138
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] Flatten[T](Microsoft.FSharp.Core.FSharpValueOption`1[Microsoft.FSharp.Core.FSharpValueOption`1[T]])
21362139
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfNullable[T](System.Nullable`1[T])
21372140
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfObj[T](T)
2141+
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OfOption[T](Microsoft.FSharp.Core.FSharpOption`1[T])
21382142
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElseWith[T](Microsoft.FSharp.Core.FSharpFunc`2[Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.FSharpValueOption`1[T]], Microsoft.FSharp.Core.FSharpValueOption`1[T])
21392143
Microsoft.FSharp.Core.ValueOption: Microsoft.FSharp.Core.FSharpValueOption`1[T] OrElse[T](Microsoft.FSharp.Core.FSharpValueOption`1[T], Microsoft.FSharp.Core.FSharpValueOption`1[T])
21402144
Microsoft.FSharp.Core.ValueOption: System.Nullable`1[T] ToNullable[T](Microsoft.FSharp.Core.FSharpValueOption`1[T])

tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Core/OptionModule.fs

+14
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,13 @@ type OptionModule() =
142142
Assert.True( Option.ofObj<string[]> null = None)
143143
Assert.True( Option.ofObj<int[]> null = None)
144144

145+
[<Fact>]
146+
member this.OfToValueOption() =
147+
Assert.Equal(ValueSome 3, Option.toValueOption (Some 3))
148+
Assert.Equal(ValueNone, Option.toValueOption (None: int option))
149+
Assert.Equal(Some 3, Option.ofValueOption (ValueSome 3))
150+
Assert.Equal(None, Option.ofValueOption (ValueNone: int voption))
151+
145152
[<Fact>]
146153
member this.DefaultValue() =
147154
Assert.AreEqual( Option.defaultValue 3 None, 3)
@@ -380,6 +387,13 @@ type ValueOptionTests() =
380387
Assert.True(ValueOption.ofObj<string[]> null = ValueNone)
381388
Assert.True(ValueOption.ofObj<int[]> null = ValueNone)
382389

390+
[<Fact>]
391+
member this.OfToOption() =
392+
Assert.Equal(Some 3, ValueOption.toOption (ValueSome 3))
393+
Assert.Equal(None, ValueOption.toOption (ValueNone: int voption))
394+
Assert.Equal(ValueSome 3, ValueOption.ofOption (Some 3))
395+
Assert.Equal(ValueNone, ValueOption.ofOption (None: int option))
396+
383397
[<Fact>]
384398
member this.DefaultValue() =
385399
Assert.AreEqual(ValueOption.defaultValue 3 ValueNone, 3)

0 commit comments

Comments
 (0)