csulpizi.ChainSharp
1.0.1
dotnet add package csulpizi.ChainSharp --version 1.0.1
NuGet\Install-Package csulpizi.ChainSharp -Version 1.0.1
<PackageReference Include="csulpizi.ChainSharp" Version="1.0.1" />
<PackageVersion Include="csulpizi.ChainSharp" Version="1.0.1" />
<PackageReference Include="csulpizi.ChainSharp" />
paket add csulpizi.ChainSharp --version 1.0.1
#r "nuget: csulpizi.ChainSharp, 1.0.1"
#:package csulpizi.ChainSharp@1.0.1
#addin nuget:?package=csulpizi.ChainSharp&version=1.0.1
#tool nuget:?package=csulpizi.ChainSharp&version=1.0.1
C#ainSharp
A functional chaining library allowing you to chain both synchronous and asynchronous functions together. Enables writing idiomatic lambdas and closures without deeply nested functions or unnecessary bindings.
Usage
Func<HttpListenerContext, User?> GetUserFromRequest = Chain.Init<HttpListenerContext>()
.Then(x => x.Request)
.Then(ValidateRequest) // throws if failed auth, otherwise returns value
.Then(x => x.QueryString)
.Then(x => x["userId"])
.Then(ValidateNotNull) // throws if null, otherwise returns value
.Then(int.Parse)
.Then(GetUser); // null if no user found
Asynchronous functions / tasks can be chained together similarly, using .WaitThen(), which will evaluate the return value of the task once completed. e.g.
Func<int, Task<string>> GetEmployeeName = Chain.Init<int>
.Then(DB.GetEmployeeById)
.WaitThen(employee => employee.Name);
await GetEmployeeName(2310); => David
Null Handling
Chaining can be combined with monads or wrappers for graceful handling of errors or null values mid-chain. C#hainSharp provides out of the box Nullable<T> monad support through .ThenOrNull(), which provides graceful null coalescence. e.g.
int? GetUserIdForEmail(Email email) { ... }
string GetNameForUser(int userId) { ... }
Func<Email, string?> GetUserNameForEmail = Chain<Email>()
.Then(GetUserIdForEmail)
// no need to write a custom version of GetNameForUser to handle null values
.ThenOrNull(GetNameForUser);
Error Handling
Similarly, using a custom monad can be useful for handling errors mid-chain. For example, in middleware or API routing, you could define a monad e.g. ValueOrHttpError<T> that can be used to catch specific exceptions and pass them through to the end of the chain for handling by the server loop.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. 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 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
| .NET Framework | net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.6.1
- No dependencies.
-
.NETStandard 2.0
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.