SCurry 1.0.0
See the version list below for details.
dotnet add package SCurry --version 1.0.0
NuGet\Install-Package SCurry -Version 1.0.0
<PackageReference Include="SCurry" Version="1.0.0" />
paket add SCurry --version 1.0.0
#r "nuget: SCurry, 1.0.0"
// Install SCurry as a Cake Addin #addin nuget:?package=SCurry&version=1.0.0 // Install SCurry as a Cake Tool #tool nuget:?package=SCurry&version=1.0.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.
- Curry and Partial Application with special spacer.
- Uncurrying.
- 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;
Curry
Now you can curry it:
Func<int, Func<int, Func<int, int>>> multiplyCurried = Multiply.Curry();
int result = multiplyCurried(2)(3)(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> multiply6 = Multiply.Curry(3, _, 2); // or Multiply.Curry(_, _, 6) or or Multiply.Curry(_, 6)
int result = multiply6(5); // 30
At the moment you can use the spacer for delegates with up to 6 parameters. Also, as crazy as it sounds, the library supports "partial application" for curry. You can define first arguments for delegates with up to 8 parameters:
Func<int, int, int, int, int, int, int, int, int> Multiply8 = (a, b, c, d, e, f, g, h) => a * b * c * d * e * f * g * h;
...
Func<int, int> curried = Multiply8.Curry(1, 2, 3, 4, 5, 6);
int result = curried(7)(8); // 40320
Uncurry
After curry you may want to get normal function back:
Func<int, Func<int, int>> multiply2curryed = Multiply.Curry(_, 2);
Func<int, int, int> multiply2 = multiply2curryed.Uncurry();
int result = multiply2(3, 4); // 24
Partial Application
The library has Partial Application extensions for all standard delegates:
Func<int, int, int> multiply2Partial = Multiply.Partial(2);
int result = multiply2Partial(3, 4); // 24
Also at the moment you can use the spacer for delegates with up to 6 parameters:
Func<int, int, int> multiply2Partial = Multiply.Partial(_, _, 2);
int result = multiply2Partial(3, 4); // 24
Pipe and Compose
You can chain functions with Pipe:
using static SCurry.Piper;
...
Func<int, int, int, int> Multiply = (a, b, c) => a * b * c;
Func<int, int> CurryedAdd2WithGap = TestFunctions.Add2.Curry(_, 2);
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:
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
Links
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.