diff --git a/src/FSharp.Core/option.fs b/src/FSharp.Core/option.fs index 46da0ec13a8..205eac0265a 100644 --- a/src/FSharp.Core/option.fs +++ b/src/FSharp.Core/option.fs @@ -185,55 +185,56 @@ module ValueOption = | ValueSome _ -> false [] - let defaultValue value voption = + let inline defaultValue value voption = match voption with | ValueNone -> value | ValueSome v -> v + // We're deliberately not using InlineIfLambda, because benchmarked code ends up slightly slower at the time of writing (.NET 8 Preview) [] - let defaultWith defThunk voption = + let inline defaultWith defThunk voption = match voption with | ValueNone -> defThunk () | ValueSome v -> v [] - let orElse ifNone voption = + let inline orElse ifNone voption = match voption with | ValueNone -> ifNone | ValueSome _ -> voption [] - let orElseWith ifNoneThunk voption = + let inline orElseWith ([] ifNoneThunk) voption = match voption with | ValueNone -> ifNoneThunk () | ValueSome _ -> voption [] - let count voption = + let inline count voption = match voption with | ValueNone -> 0 | ValueSome _ -> 1 [] - let fold<'T, 'State> folder (state: 'State) (voption: voption<'T>) = + let inline fold<'T, 'State> ([] folder) (state: 'State) (voption: voption<'T>) = match voption with | ValueNone -> state | ValueSome x -> folder state x [] - let foldBack<'T, 'State> folder (voption: voption<'T>) (state: 'State) = + let inline foldBack<'T, 'State> ([] folder) (voption: voption<'T>) (state: 'State) = match voption with | ValueNone -> state | ValueSome x -> folder x state [] - let exists predicate voption = + let inline exists ([] predicate) voption = match voption with | ValueNone -> false | ValueSome x -> predicate x [] - let forall predicate voption = + let inline forall ([] predicate) voption = match voption with | ValueNone -> true | ValueSome x -> predicate x @@ -245,43 +246,43 @@ module ValueOption = | ValueSome v -> v = value [] - let iter action voption = + let inline iter ([] action) voption = match voption with | ValueNone -> () | ValueSome x -> action x [] - let map mapping voption = + let inline map ([] mapping) voption = match voption with | ValueNone -> ValueNone | ValueSome x -> ValueSome(mapping x) [] - let map2 mapping voption1 voption2 = + let inline map2 ([] mapping) voption1 voption2 = match voption1, voption2 with | ValueSome x, ValueSome y -> ValueSome(mapping x y) | _ -> ValueNone [] - let map3 mapping voption1 voption2 voption3 = + let inline map3 ([] mapping) voption1 voption2 voption3 = match voption1, voption2, voption3 with | ValueSome x, ValueSome y, ValueSome z -> ValueSome(mapping x y z) | _ -> ValueNone [] - let bind binder voption = + let inline bind ([] binder) voption = match voption with | ValueNone -> ValueNone | ValueSome x -> binder x [] - let flatten voption = + let inline flatten voption = match voption with | ValueNone -> ValueNone | ValueSome x -> x [] - let filter predicate voption = + let inline filter ([] predicate) voption = match voption with | ValueNone -> ValueNone | ValueSome x -> @@ -291,38 +292,38 @@ module ValueOption = ValueNone [] - let toArray voption = + let inline toArray voption = match voption with | ValueNone -> [||] | ValueSome x -> [| x |] [] - let toList voption = + let inline toList voption = match voption with | ValueNone -> [] | ValueSome x -> [ x ] [] - let toNullable voption = + let inline toNullable voption = match voption with | ValueNone -> System.Nullable() | ValueSome v -> System.Nullable(v) [] - let ofNullable (value: System.Nullable<'T>) = + let inline ofNullable (value: System.Nullable<'T>) = if value.HasValue then ValueSome value.Value else ValueNone [] - let ofObj value = + let inline ofObj value = match value with | null -> ValueNone | _ -> ValueSome value [] - let toObj value = + let inline toObj value = match value with | ValueNone -> null | ValueSome x -> x diff --git a/src/FSharp.Core/option.fsi b/src/FSharp.Core/option.fsi index ba65f231932..d22e80be420 100644 --- a/src/FSharp.Core/option.fsi +++ b/src/FSharp.Core/option.fsi @@ -506,7 +506,7 @@ module ValueOption = /// /// [] - val defaultValue: value: 'T -> voption: 'T voption -> 'T + val inline defaultValue: value: 'T -> voption: 'T voption -> 'T /// Gets the value of the voption if the voption is ValueSome, otherwise evaluates and returns the result. /// @@ -523,7 +523,7 @@ module ValueOption = /// /// [] - val defaultWith: defThunk: (unit -> 'T) -> voption: 'T voption -> 'T + val inline defaultWith: defThunk: (unit -> 'T) -> voption: 'T voption -> 'T /// Returns if it is Some, otherwise returns . /// @@ -541,7 +541,7 @@ module ValueOption = /// /// [] - val orElse: ifNone: 'T voption -> voption: 'T voption -> 'T voption + val inline orElse: ifNone: 'T voption -> voption: 'T voption -> 'T voption /// Returns if it is Some, otherwise evaluates and returns the result. /// @@ -560,7 +560,7 @@ module ValueOption = /// /// [] - val orElseWith: ifNoneThunk: (unit -> 'T voption) -> voption: 'T voption -> 'T voption + val inline orElseWith: ifNoneThunk: (unit -> 'T voption) -> voption: 'T voption -> 'T voption /// Gets the value associated with the option. /// @@ -591,7 +591,7 @@ module ValueOption = /// /// [] - val count: voption: 'T voption -> int + val inline count: voption: 'T voption -> int /// fold f s inp evaluates to match inp with ValueNone -> s | ValueSome x -> f s x. /// @@ -610,7 +610,7 @@ module ValueOption = /// /// [] - val fold<'T, 'State> : folder: ('State -> 'T -> 'State) -> state: 'State -> voption: 'T voption -> 'State + val inline fold<'T, 'State> : folder: ('State -> 'T -> 'State) -> state: 'State -> voption: 'T voption -> 'State /// fold f inp s evaluates to match inp with ValueNone -> s | ValueSome x -> f x s. /// @@ -629,7 +629,7 @@ module ValueOption = /// /// [] - val foldBack<'T, 'State> : folder: ('T -> 'State -> 'State) -> voption: 'T voption -> state: 'State -> 'State + val inline foldBack<'T, 'State> : folder: ('T -> 'State -> 'State) -> voption: 'T voption -> state: 'State -> 'State /// exists p inp evaluates to match inp with ValueNone -> false | ValueSome x -> p x. /// @@ -647,7 +647,7 @@ module ValueOption = /// /// [] - val exists: predicate: ('T -> bool) -> voption: 'T voption -> bool + val inline exists: predicate: ('T -> bool) -> voption: 'T voption -> bool /// forall p inp evaluates to match inp with ValueNone -> true | ValueSome x -> p x. /// @@ -665,7 +665,7 @@ module ValueOption = /// /// [] - val forall: predicate: ('T -> bool) -> voption: 'T voption -> bool + val inline forall: predicate: ('T -> bool) -> voption: 'T voption -> bool /// Evaluates to true if is ValueSome and its value is equal to . /// @@ -696,7 +696,7 @@ module ValueOption = /// /// [] - val iter: action: ('T -> unit) -> voption: 'T voption -> unit + val inline iter: action: ('T -> unit) -> voption: 'T voption -> unit /// map f inp evaluates to match inp with ValueNone -> ValueNone | ValueSome x -> ValueSome (f x). /// @@ -712,7 +712,7 @@ module ValueOption = /// /// [] - val map: mapping: ('T -> 'U) -> voption: 'T voption -> 'U voption + val inline map: mapping: ('T -> 'U) -> voption: 'T voption -> 'U voption /// map f voption1 voption2 evaluates to match voption1, voption2 with ValueSome x, ValueSome y -> ValueSome (f x y) | _ -> ValueNone. /// @@ -731,7 +731,7 @@ module ValueOption = /// /// [] - val map2: mapping: ('T1 -> 'T2 -> 'U) -> voption1: 'T1 voption -> voption2: 'T2 voption -> 'U voption + val inline map2: mapping: ('T1 -> 'T2 -> 'U) -> voption1: 'T1 voption -> voption2: 'T2 voption -> 'U voption /// map f voption1 voption2 voption3 evaluates to match voption1, voption2, voption3 with ValueSome x, ValueSome y, ValueSome z -> ValueSome (f x y z) | _ -> ValueNone. /// @@ -752,7 +752,7 @@ module ValueOption = /// /// [] - val map3: + val inline map3: mapping: ('T1 -> 'T2 -> 'T3 -> 'U) -> voption1: 'T1 voption -> voption2: 'T2 voption -> @@ -779,7 +779,7 @@ module ValueOption = /// /// [] - val bind: binder: ('T -> 'U voption) -> voption: 'T voption -> 'U voption + val inline bind: binder: ('T -> 'U voption) -> voption: 'T voption -> 'U voption /// flatten inp evaluates to match inp with ValueNone -> ValueNone | ValueSome x -> x /// @@ -796,7 +796,7 @@ module ValueOption = /// /// [] - val flatten: voption: 'T voption voption -> 'T voption + val inline flatten: voption: 'T voption voption -> 'T voption /// filter f inp evaluates to match inp with ValueNone -> ValueNone | ValueSome x -> if f x then ValueSome x else ValueNone. /// @@ -813,7 +813,7 @@ module ValueOption = /// /// [] - val filter: predicate: ('T -> bool) -> voption: 'T voption -> 'T voption + val inline filter: predicate: ('T -> bool) -> voption: 'T voption -> 'T voption /// Convert the value option to an array of length 0 or 1. /// @@ -828,7 +828,7 @@ module ValueOption = /// /// [] - val toArray: voption: 'T voption -> 'T[] + val inline toArray: voption: 'T voption -> 'T[] /// Convert the value option to a list of length 0 or 1. /// @@ -843,7 +843,7 @@ module ValueOption = /// /// [] - val toList: voption: 'T voption -> 'T list + val inline toList: voption: 'T voption -> 'T list /// Convert the value option to a Nullable value. /// @@ -858,7 +858,7 @@ module ValueOption = /// /// [] - val toNullable: voption: 'T voption -> Nullable<'T> + val inline toNullable: voption: 'T voption -> Nullable<'T> /// Convert a Nullable value to a value option. /// @@ -873,7 +873,7 @@ module ValueOption = /// /// [] - val ofNullable: value: Nullable<'T> -> 'T voption + val inline ofNullable: value: Nullable<'T> -> 'T voption /// Convert a potentially null value to a value option. /// @@ -888,7 +888,7 @@ module ValueOption = /// /// [] - val ofObj: value: 'T -> 'T voption when 'T: null + val inline ofObj: value: 'T -> 'T voption when 'T: null /// Convert an option to a potentially null value. /// @@ -903,4 +903,4 @@ module ValueOption = /// /// [] - val toObj: value: 'T voption -> 'T when 'T: null + val inline toObj: value: 'T voption -> 'T when 'T: null