RZ.Foundation 7.0.0-alpha.3

This is a prerelease version of RZ.Foundation.
There is a newer prerelease version of this package available.
See the version list below for details.
dotnet add package RZ.Foundation --version 7.0.0-alpha.3                
NuGet\Install-Package RZ.Foundation -Version 7.0.0-alpha.3                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="RZ.Foundation" Version="7.0.0-alpha.3" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add RZ.Foundation --version 7.0.0-alpha.3                
#r "nuget: RZ.Foundation, 7.0.0-alpha.3"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install RZ.Foundation as a Cake Addin
#addin nuget:?package=RZ.Foundation&version=7.0.0-alpha.3&prerelease

// Install RZ.Foundation as a Cake Tool
#tool nuget:?package=RZ.Foundation&version=7.0.0-alpha.3&prerelease                

RZ Functional library for C#

This library is an add-on to LanguageExt library. It tries to provide some syntactic sugar for more natural expression.

Option[T] Extension (RZ.Foundation)

Convert between C# nullable value and Option[T]

Prelude module provides conversion functions for C# nullable and Option[T]. Unfortunately, Value Type/Ref Type semantic differences make creating generic functions to support both meta-types tedious and, in some case, confuse the compiler and generating a warning.

using static LanguageExt.Prelude;

int? x = 123;
Option<T> y = Some(x);  // convert a nullable value to Option<T>
int? z = y.ToNullable(); // convert an Option<T> to a nullable value

// this should also work with nullable ref value
string? a = "Hello";
Option<string> b = Some(a);
string? c = b.ToNullable();

Getting a value out of Option[T]

Suppose that we have follow option values:

using static LanguageExt.Prelude;

var some = Some(123);
var none = Option<int>.None;
Get
var x = some.Get();     // 123
var y = none.Get();     // an exception is thrown!
GetOrThrow

In case you want to specific an exception.

var x = some.GetOrThrow(() => new MyException());     // 123
var y = none.GetOrThrow(() => new MyException());     // MyException is thrown!
GetOrDefault
var x = some.GetOrDefault();   // 123
var y = none.GetOrDefault();   // 0, int's default value

Replace None value

using static LanguageExt.Prelude;
var x = Option<int>.None;
var y = x.OrElse(123);  // Option<int> of 123
var z = x.OrElse(Some(456)) // Option<int> of 456
var a = x.OrElse(() => None);    // stay None
var b = await x.OrElseAsync(() => Task.FromResult(999));    // Option<int> of 999

Perform action (Side effect)

Then is the operation to perform an action. The method returns the original value.

using static LanguageExt.Prelude;
var x = None<int>();
x.Then(v => Console.WriteLine("Value = {0}", v));
x.Then(v => Console.WriteLine("Value = {0}", v), () => Console.WriteLine("No value"));

// async versions
await x.ThenAsync(v => Task.Run(() => Console.WriteLine("V = {0}", v)));
await x.ThenAsync(v => Task.Run(() => Console.WriteLine("V = {0}", v)),
                  () => Task.Run(() => Console.WriteLine("No value")));

Type casting

Option<object> x = Some((object) "I am string");
Option<string> y = x.TryCast<object,string>();
Option<int> z = x.TryCast<object,int>();   // None!

TaskOption[T]

LanguageExt's OptionAsync should be a wrapper of Task<Option<T>>, but its recent async/await handler has been implemented in way that consumes all exceptions as None value. This makes sense when we don’t want any side-effect. But in case of exception handling, I find that by allowing exceptions as the side-effect, would simplify error handling code when writing in functional paradigm.

So TaskOption<T> is made to work similar to OptionAsync but with async/await pattern that allows exceptions to be escalated normally, as well as, support None returning value.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (4)

Showing the top 4 NuGet packages that depend on RZ.Foundation:

Package Downloads
RZ.Foundation.NewtonsoftJson

RZ.Foundation extension for Newtonsoft.JSON

RZ.Linq.RelationalDatabase

Transform LINQ to SQL text

RZ.Foundation.Blazor

Package Description

RZ.AspNet.Bootstrapper

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
7.0.0-beta.26 47 10/15/2024
7.0.0-beta.12 41 9/25/2024
7.0.0-beta.11 52 9/22/2024
7.0.0-beta.3 68 6/23/2024
7.0.0-alpha.3 66 6/22/2024
6.5.0-beta.1 64 5/9/2024
6.4.0 299 4/22/2024
6.3.1 319 11/27/2023
6.3.0 177 11/15/2023
6.2.0 187 11/12/2023
6.1.2 277 8/27/2023
6.1.1 335 7/6/2023
6.1.0 224 7/6/2023
6.0.1 210 6/18/2023
6.0.0 326 3/14/2023
5.1.0-beta.4 399 9/10/2022
5.0.10 610 8/20/2022
5.0.9 457 8/18/2022
5.0.8 1,162 6/23/2022
5.0.4 174 12/26/2021
5.0.1 367 12/18/2021
5.0.0 1,243 12/4/2020
3.1.0 888 10/25/2020
3.0.2 1,603 7/11/2020
3.0.1 609 7/11/2020
3.0.0 639 6/29/2020
2.0.5 592 6/12/2020
2.0.4 5,363 5/17/2020
2.0.3 954 3/18/2020
2.0.2 504 3/17/2020
2.0.0 538 3/16/2020
1.5.0 528 3/13/2020
1.4.4 610 3/3/2020
1.4.3 666 1/19/2020
1.4.1 534 1/18/2020
1.4.0 519 1/18/2020
1.3.8 591 12/8/2019
1.3.5 580 12/4/2019
1.3.2 706 10/7/2019
1.3.1 555 9/2/2019
1.2.9 575 8/14/2019
1.2.7 588 7/27/2019
1.2.5 583 7/25/2019
1.2.2 611 7/20/2019
1.2.1 540 7/20/2019
1.2.0 575 7/19/2019
1.1.1.1 624 4/28/2019
1.0.10 883 8/20/2018
1.0.9 1,019 2/19/2018
1.0.0 980 2/8/2018

Embrace LanguageExt lib.