SCurry 1.1.0
See the version list below for details.
dotnet add package SCurry --version 1.1.0
NuGet\Install-Package SCurry -Version 1.1.0
<PackageReference Include="SCurry" Version="1.1.0" />
paket add SCurry --version 1.1.0
#r "nuget: SCurry, 1.1.0"
// Install SCurry as a Cake Addin #addin nuget:?package=SCurry&version=1.1.0 // Install SCurry as a Cake Tool #tool nuget:?package=SCurry&version=1.1.0
Currying C# functions and actions
If you are here, you probably know what Curry and Partial Application are. This library contains extensions for all standard Func<> and Action<> delegates.
Features
- Supports all standard Func<> and Action<> delegates.
- Currying and uncurrying.
- Partial Application with special spacer.
- Pipe and Compose helper functions.
- All code is auto generated and covered by unit tests.
- Based on .NET Standard 2.0
- No external dependencies.
Examples
Lets say you have the next function:
Func<int, int, int, int> Multiply = (a, b, c) => a * b * c;
Partial Application
The library contains Partial Application extensions for all standard delegates:
Func<int, int, int> multiply2Partial = Multiply.Partial(2, 3);
int result = multiply2Partial(4); // 24
In case if you know the values for some arguments in advance you can use the spacer:
using static SCurry.Spacer;
...
Func<int, int, int> multiply2Partial = Multiply.Partial(_, _, 2); // or Multiply.Partial(1, _, 2) or Multiply.Partial(_, 2)
int result = multiply2Partial(3, 4); // 24
At the moment you can use the spacer for delegates with up to 7 parameters. Making it more makes the library ridiculous big.
Curry
To curry use Curry extension:
Func<int, Func<int, Func<int, int>>> multiplyCurried = Multiply.Curry();
int result = multiplyCurried(2)(3)(4); // 24
You can combine it with gapped version of Partial extension to get more flexibility:
using static SCurry.Spacer;
...
Func<int, int> multiply2 = Multiply.Partial(_, _, 2).Curry();
int result = multiply6(5)(6); // 30
Uncurry
After curry you may want to get normal function back:
Func<int, int> multiply2curryed = Multiply.Partial(_, _, 2).Curry();
Func<int, int, int> multiply2 = multiply2curryed.Uncurry();
int result = multiply2(3, 4); // 24
Pipe and Compose
You can chain functions with Pipe helper:
using static SCurry.Piper;
...
Func<int, int, int, int> Multiply = (a, b, c) => a * b * c;
Func<int, int> CurryedAdd2WithGap = TestFunctions.Add2.Partial(_, 2).Curry();
Func<int, Func<int, int>> CurryedPartialMultiplyBy3 = Multiply.Partial(_, _, 3).Curry();
Func<int, Func<int, Func<int, int>>> CurryedAdd3 = TestFunctions.Add3.Curry();
var piped = Pipe(
CurryedAdd2WithGap,
CurryedPartialMultiplyBy3(1),
CurryedAdd3(3)(1)
);
var result = piped(0); // 10
Or Compose them to evaluate functions in reverse order:
using static SCurry.Composer;
...
var piped = Compose(
CurryedAdd2WithGap,
CurryedPartialMultiplyBy3(1),
CurryedAdd3(3)(1)
);
var result = piped(0); // 14
Installation
PM> Install-Package SCurry
dotnet add package SCurry
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 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. |
.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 was computed. 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. |
-
.NETStandard 2.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.