diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 6d9f8749e..7dbc33bf2 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,11 @@ +#### 1.5.0 - October 15 2023 + - Support for Fable 4 (some functions had to be removed from Fable in order to it) + - More IList and IReadOnlyList functions + - Bug fixes in parse, tryParse, seq's TryFinally and (=>>) for ValueTask + - Add Free.hoist + - Add distinct for NonEmptySeq and NonEmptyList + - Add ValueOption.ofOption and Task.result for Task and ValueTask + #### 1.4.0 - February 22 2023 - Additional Alternatives available (functions, error monads) - More IReadOnlyDictionary functions diff --git a/RELEASE_NOTES.txt b/RELEASE_NOTES.txt index f52bfae92..fe7ac53b6 100644 --- a/RELEASE_NOTES.txt +++ b/RELEASE_NOTES.txt @@ -1,8 +1,9 @@ -Release Notes for FSharpPlus 1.4.0 - February 22 2023 +Release Notes for FSharpPlus 1.5.0 - October 15 2023 ------------------------------------------------------ -Additional Alternatives available (functions, error monads) -More IReadOnlyDictionary functions -Bug fixes in Map as FoldIndexable and missing <*> for IDictionary and IReadOnlyDictionary -Deprecate IReadOnlyDictionary.map -Guid to/from bytes conversion \ No newline at end of file +Support for Fable 4 (some functions had to be removed from Fable in order to it) +More IList and IReadOnlyList functions +Bug fixes in parse, tryParse, seq's TryFinally and (=>>) for ValueTask +Add Free.hoist +Add distinct for NonEmptySeq and NonEmptyList +Add ValueOption.ofOption and Task.result for Task and ValueTask \ No newline at end of file diff --git a/src/FSharpPlus/Control/Converter.fs b/src/FSharpPlus/Control/Converter.fs index 5cf8fa41c..aff56e6f6 100644 --- a/src/FSharpPlus/Control/Converter.fs +++ b/src/FSharpPlus/Control/Converter.fs @@ -116,7 +116,7 @@ type TryParse = match DateTime.TryParseExact (x, [|"yyyy-MM-ddTHH:mm:ss.fffZ"; "yyyy-MM-ddTHH:mm:ssZ"|], null, DateTimeStyles.RoundtripKind) with | true, x -> Some x | _ -> - match DateTime.TryParse (x, CultureInfo.InvariantCulture, DateTimeStyles.None) with + match DateTime.TryParse (x, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal) with | true, x -> Some x | _ -> None @@ -164,7 +164,7 @@ type Parse = static member Parse (_: DateTime , _: Parse) = fun (x:string) -> match DateTime.TryParseExact (x, [|"yyyy-MM-ddTHH:mm:ss.fffZ"; "yyyy-MM-ddTHH:mm:ssZ"|], null, DateTimeStyles.RoundtripKind) with | true, x -> x - | _ -> DateTime.Parse (x, CultureInfo.InvariantCulture) + | _ -> DateTime.Parse (x, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal) static member Parse (_: DateTimeOffset, _: Parse) = fun (x:string) -> try DateTimeOffset.ParseExact (x, [|"yyyy-MM-ddTHH:mm:ss.fffK"; "yyyy-MM-ddTHH:mm:ssK"|], null, DateTimeStyles.AssumeUniversal) diff --git a/src/FSharpPlus/Extensions/IList.fs b/src/FSharpPlus/Extensions/IList.fs index f05ba64f5..641e1e74c 100644 --- a/src/FSharpPlus/Extensions/IList.fs +++ b/src/FSharpPlus/Extensions/IList.fs @@ -1,6 +1,5 @@ namespace FSharpPlus -#if !FABLE_COMPILER /// Additional operations IList<'T> [] @@ -9,9 +8,17 @@ module IList = open System.Collections.ObjectModel open System.Collections.Generic +#if !FABLE_COMPILER /// Converts an IList to an IReadOnlyList (from System.Collections.Generic). /// The System.Collections.Generic.IList /// The list converted to a System.Collections.Generic.IReadOnlyList let toIReadOnlyList (source: IList<_>) = ReadOnlyCollection source :> IReadOnlyList<_> #endif + + let ofArray (source: 'T[] ) = source :> IList<'T> + let ofList (source: 'T list) = source |> Array.ofList :> IList<'T> + let ofSeq (source: seq<'T>) = source |> Array.ofSeq :> IList<'T> + let map mapping (source: IList<'T>) = Seq.map mapping source |> Seq.toArray :> IList<'U> + let iter mapping (source: IList<'T>) = Seq.iter mapping source + diff --git a/src/FSharpPlus/Extensions/IReadOnlyList.fs b/src/FSharpPlus/Extensions/IReadOnlyList.fs index b0910bf58..e4ad6c2c2 100644 --- a/src/FSharpPlus/Extensions/IReadOnlyList.fs +++ b/src/FSharpPlus/Extensions/IReadOnlyList.fs @@ -8,7 +8,11 @@ module IReadOnlyList = #if !FABLE_COMPILER let ofArray (source: 'T array) = IList.toIReadOnlyList source + let ofList (source: 'T list) = source |> Array.ofList |> IList.toIReadOnlyList + let ofSeq (source: seq<'T>) = source |> Array.ofSeq |> IList.toIReadOnlyList + #endif + let toArray (source: IReadOnlyList<'T>) = Array.ofSeq source #if !FABLE_COMPILER @@ -19,8 +23,13 @@ module IReadOnlyList = if 0 <= i && i < source.Count then source |> Array.ofSeq |> setNth i value |> ofArray |> Some else None + + let map mapping (source: IReadOnlyList<'T>) : IReadOnlyList<'U> = Seq.map mapping source |> Seq.toArray |> IList.toIReadOnlyList + #endif let tryItem i (source: IReadOnlyList<_>) = if 0 <= i && i < source.Count then Some source.[i] - else None \ No newline at end of file + else None + + let iter mapping (source: IReadOnlyList<'T>) = Seq.iter mapping source \ No newline at end of file diff --git a/src/FSharpPlus/Operators.fs b/src/FSharpPlus/Operators.fs index 193ab80ef..5484d04eb 100644 --- a/src/FSharpPlus/Operators.fs +++ b/src/FSharpPlus/Operators.fs @@ -186,7 +186,6 @@ module Operators = let inline lift2 (f: 'T->'U->'V) (x: '``Applicative<'T>``) (y: '``Applicative<'U>``) : '``Applicative<'V>`` = Lift2.Invoke f x y [] - /// Applicative let inline liftA2 (f: 'T->'U->'V) (x: '``Applicative<'T>``) (y: '``Applicative<'U>``) : '``Applicative<'V>`` = lift2 f x y /// @@ -208,11 +207,9 @@ module Operators = let inline (<* ) (x: '``Applicative<'U>``) (y: '``Applicative<'T>``) : '``Applicative<'U>`` = ((fun (k: 'U) (_: 'T) -> k ) x : '``Applicative<'T->'U>``) <*> y [) instead.")>] - /// Applicative let inline (<**>) (x: '``Applicative<'T>``) : '``Applicative<'T -> 'U>``->'``Applicative<'U>`` = flip (<*>) x [] - /// Applicative let inline optional v = Some v result None ///