RZ.Foundation 6.0.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package RZ.Foundation --version 6.0.0
NuGet\Install-Package RZ.Foundation -Version 6.0.0
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="6.0.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add RZ.Foundation --version 6.0.0
#r "nuget: RZ.Foundation, 6.0.0"
#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=6.0.0

// Install RZ.Foundation as a Cake Tool
#tool nuget:?package=RZ.Foundation&version=6.0.0

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 net7.0 is compatible.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  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 (2)

Showing the top 2 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

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
6.5.0-beta.1 45 5/9/2024
6.4.0 93 4/22/2024
6.3.1 264 11/27/2023
6.3.0 123 11/15/2023
6.2.0 118 11/12/2023
6.1.2 210 8/27/2023
6.1.1 265 7/6/2023
6.1.0 152 7/6/2023
6.0.1 147 6/18/2023
6.0.0 258 3/14/2023
5.1.0-beta.4 364 9/10/2022
5.0.10 542 8/20/2022
5.0.9 391 8/18/2022
5.0.8 1,094 6/23/2022
5.0.4 121 12/26/2021
5.0.1 304 12/18/2021
5.0.0 1,164 12/4/2020
3.1.0 818 10/25/2020
3.0.2 1,568 7/11/2020
3.0.1 580 7/11/2020
3.0.0 597 6/29/2020
2.0.5 576 6/12/2020
2.0.4 4,558 5/17/2020
2.0.3 917 3/18/2020
2.0.2 472 3/17/2020
2.0.0 507 3/16/2020
1.5.0 498 3/13/2020
1.4.4 583 3/3/2020
1.4.3 638 1/19/2020
1.4.1 507 1/18/2020
1.4.0 490 1/18/2020
1.3.8 562 12/8/2019
1.3.5 566 12/4/2019
1.3.2 679 10/7/2019
1.3.1 525 9/2/2019
1.2.9 546 8/14/2019
1.2.7 558 7/27/2019
1.2.5 565 7/25/2019
1.2.2 580 7/20/2019
1.2.1 524 7/20/2019
1.2.0 559 7/19/2019
1.1.1.1 594 4/28/2019
1.0.10 851 8/20/2018
1.0.9 987 2/19/2018
1.0.0 964 2/8/2018

Embrace LanguageExt lib.