diff --git a/CSharpFunctionalExtensions.Tests/CSharpFunctionalExtensions.Tests.csproj b/CSharpFunctionalExtensions.Tests/CSharpFunctionalExtensions.Tests.csproj
index 8fd462a7..2728130d 100644
--- a/CSharpFunctionalExtensions.Tests/CSharpFunctionalExtensions.Tests.csproj
+++ b/CSharpFunctionalExtensions.Tests/CSharpFunctionalExtensions.Tests.csproj
@@ -34,6 +34,27 @@
MapTests.Task.cs
+
+ MapIfTests.cs
+
+
+ MapIfTests.cs
+
+
+ MapIfTests.Task.cs
+
+
+ MapIfTests.Task.cs
+
+
+ MapIfTests.cs
+
+
+ MapIfTests.ValueTask.cs
+
+
+ MapIfTests.ValueTask.cs
+
MapErrorTests.Task.cs
diff --git a/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Base.cs b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Base.cs
new file mode 100644
index 00000000..6238a701
--- /dev/null
+++ b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Base.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Threading.Tasks;
+using FluentAssertions;
+
+namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
+{
+ public abstract class MapIfTestsBase : TestBase
+ {
+ protected bool actionExecuted;
+ protected bool predicateExecuted;
+
+ protected MapIfTestsBase()
+ {
+ actionExecuted = false;
+ predicateExecuted = false;
+ }
+
+ protected Func GetAction() => value =>
+ {
+ actionExecuted.Should().BeFalse();
+ value.Should().Be(T.Value);
+
+ actionExecuted = true;
+ return T.Value2;
+ };
+
+ protected Func> GetTaskAction()
+ {
+ return t => Task.FromResult(GetAction()(t));
+ }
+
+ protected Func> GetValueTaskAction()
+ {
+ return t => ValueTask.FromResult(GetAction()(t));
+ }
+
+ protected Func GetValuePredicate(bool value)
+ {
+ return t =>
+ {
+ predicateExecuted.Should().BeFalse();
+ t.Should().Be(T.Value);
+
+ predicateExecuted = true;
+ return value;
+ };
+ }
+
+ protected static Result GetExpectedValueResult(bool isSuccess, bool condition)
+ {
+ var resultChanged = isSuccess && condition;
+
+ if (!resultChanged)
+ {
+ return Result.SuccessIf(isSuccess, T.Value, ErrorMessage);
+ }
+
+ return Result.SuccessIf(isSuccess, T.Value2, ErrorMessage2);
+ }
+
+ protected static Result GetExpectedValueErrorResult(bool isSuccess, bool condition)
+ {
+ var resultChanged = isSuccess && condition;
+
+ if (!resultChanged)
+ {
+ return Result.SuccessIf(isSuccess, T.Value, E.Value);
+ }
+
+ return Result.SuccessIf(isSuccess, T.Value2, E.Value2);
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Task.Left.cs b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Task.Left.cs
new file mode 100644
index 00000000..3d3a52ca
--- /dev/null
+++ b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Task.Left.cs
@@ -0,0 +1,71 @@
+using System.Threading.Tasks;
+using FluentAssertions;
+using Xunit;
+
+namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
+{
+ public class MapIfTests_Task_Left : MapIfTestsBase
+ {
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_Left_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, ErrorMessage);
+
+ Result returned = await result.MapIf(condition, GetTaskAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_Left_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, E.Value);
+
+ Result returned = await result.MapIf(condition, GetTaskAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_Left_computes_predicate_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, ErrorMessage);
+
+ Result returned = await result.MapIf(GetValuePredicate(condition), GetTaskAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_Left_computes_predicate_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, E.Value);
+
+ Result returned = await result.MapIf(GetValuePredicate(condition), GetTaskAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Task.Right.cs b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Task.Right.cs
new file mode 100644
index 00000000..cea435bc
--- /dev/null
+++ b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Task.Right.cs
@@ -0,0 +1,71 @@
+using System.Threading.Tasks;
+using FluentAssertions;
+using Xunit;
+
+namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
+{
+ public class MapIfTests_Task_Right : MapIfTestsBase
+ {
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_Right_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Task> resultTask = Result.SuccessIf(isSuccess, T.Value, ErrorMessage).AsTask();
+
+ Result returned = await resultTask.MapIf(condition, GetAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_Right_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Task> resultTask = Result.SuccessIf(isSuccess, T.Value, E.Value).AsTask();
+
+ Result returned = await resultTask.MapIf(condition, GetAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_Right_computes_predicate_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Task> resultTask = Result.SuccessIf(isSuccess, T.Value, ErrorMessage).AsTask();
+
+ Result returned = await resultTask.MapIf(GetValuePredicate(condition), GetAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_Right_computes_predicate_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Task> resultTask = Result.SuccessIf(isSuccess, T.Value, E.Value).AsTask();
+
+ Result returned = await resultTask.MapIf(GetValuePredicate(condition), GetAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Task.cs b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Task.cs
new file mode 100644
index 00000000..c723527f
--- /dev/null
+++ b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.Task.cs
@@ -0,0 +1,71 @@
+using System.Threading.Tasks;
+using FluentAssertions;
+using Xunit;
+
+namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
+{
+ public class MapIfTests_Task : MapIfTestsBase
+ {
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Task> resultTask = Result.SuccessIf(isSuccess, T.Value, ErrorMessage).AsTask();
+
+ Result returned = await resultTask.MapIf(condition, GetTaskAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Task> resultTask = Result.SuccessIf(isSuccess, T.Value, E.Value).AsTask();
+
+ Result returned = await resultTask.MapIf(condition, GetTaskAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_computes_predicate_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Task> resultTask = Result.SuccessIf(isSuccess, T.Value, ErrorMessage).AsTask();
+
+ Result returned = await resultTask.MapIf(GetValuePredicate(condition), GetTaskAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_Task_computes_predicate_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Task> resultTask = Result.SuccessIf(isSuccess, T.Value, E.Value).AsTask();
+
+ Result returned = await resultTask.MapIf(GetValuePredicate(condition), GetTaskAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.ValueTask.Left.cs b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.ValueTask.Left.cs
new file mode 100644
index 00000000..c465a94d
--- /dev/null
+++ b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.ValueTask.Left.cs
@@ -0,0 +1,72 @@
+using System.Threading.Tasks;
+using CSharpFunctionalExtensions.ValueTasks;
+using FluentAssertions;
+using Xunit;
+
+namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
+{
+ public class MapIfTests_ValueTask_Left : MapIfTestsBase
+ {
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_Left_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, ErrorMessage);
+
+ Result returned = await result.MapIf(condition, GetValueTaskAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_Left_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, E.Value);
+
+ Result returned = await result.MapIf(condition, GetValueTaskAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_Left_computes_predicate_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, ErrorMessage);
+
+ Result returned = await result.MapIf(GetValuePredicate(condition), GetValueTaskAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_Left_computes_predicate_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, E.Value);
+
+ Result returned = await result.MapIf(GetValuePredicate(condition), GetValueTaskAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.ValueTask.Right.cs b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.ValueTask.Right.cs
new file mode 100644
index 00000000..d36b0e7d
--- /dev/null
+++ b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.ValueTask.Right.cs
@@ -0,0 +1,72 @@
+using System.Threading.Tasks;
+using CSharpFunctionalExtensions.ValueTasks;
+using FluentAssertions;
+using Xunit;
+
+namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
+{
+ public class MapIfTests_ValueTask_Right : MapIfTestsBase
+ {
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_Right_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ ValueTask> resultTask = Result.SuccessIf(isSuccess, T.Value, ErrorMessage).AsValueTask();
+
+ Result returned = await resultTask.MapIf(condition, GetAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_Right_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ ValueTask> resultTask = Result.SuccessIf(isSuccess, T.Value, E.Value).AsValueTask();
+
+ Result returned = await resultTask.MapIf(condition, GetAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_Right_computes_predicate_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ ValueTask> resultTask = Result.SuccessIf(isSuccess, T.Value, ErrorMessage).AsValueTask();
+
+ Result returned = await resultTask.MapIf(GetValuePredicate(condition), GetAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_Right_computes_predicate_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ ValueTask> resultTask = Result.SuccessIf(isSuccess, T.Value, E.Value).AsValueTask();
+
+ Result returned = await resultTask.MapIf(GetValuePredicate(condition), GetAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.ValueTask.cs b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.ValueTask.cs
new file mode 100644
index 00000000..9a33f3dd
--- /dev/null
+++ b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.ValueTask.cs
@@ -0,0 +1,72 @@
+using System.Threading.Tasks;
+using CSharpFunctionalExtensions.ValueTasks;
+using FluentAssertions;
+using Xunit;
+
+namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
+{
+ public class MapIfTests_ValueTask : MapIfTestsBase
+ {
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ ValueTask> resultTask = Result.SuccessIf(isSuccess, T.Value, ErrorMessage).AsValueTask();
+
+ Result returned = await resultTask.MapIf(condition, GetValueTaskAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ ValueTask> resultTask = Result.SuccessIf(isSuccess, T.Value, E.Value).AsValueTask();
+
+ Result returned = await resultTask.MapIf(condition, GetValueTaskAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_computes_predicate_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ ValueTask> resultTask = Result.SuccessIf(isSuccess, T.Value, ErrorMessage).AsValueTask();
+
+ Result returned = await resultTask.MapIf(GetValuePredicate(condition), GetValueTaskAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public async Task MapIf_ValueTask_computes_predicate_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ ValueTask> resultTask = Result.SuccessIf(isSuccess, T.Value, E.Value).AsValueTask();
+
+ Result returned = await resultTask.MapIf(GetValuePredicate(condition), GetValueTaskAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.cs b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.cs
new file mode 100644
index 00000000..825654b1
--- /dev/null
+++ b/CSharpFunctionalExtensions.Tests/ResultTests/Extensions/MapIfTests.cs
@@ -0,0 +1,70 @@
+using FluentAssertions;
+using Xunit;
+
+namespace CSharpFunctionalExtensions.Tests.ResultTests.Extensions
+{
+ public class MapIfTests : MapIfTestsBase
+ {
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public void MapIf_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, ErrorMessage);
+
+ Result returned = result.MapIf(condition, GetAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public void MapIf_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, E.Value);
+
+ Result returned = result.MapIf(condition, GetAction());
+
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public void MapIf_computes_predicate_T_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, ErrorMessage);
+
+ Result returned = result.MapIf(GetValuePredicate(condition), GetAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueResult(isSuccess, condition));
+ }
+
+ [Theory]
+ [InlineData(true, true)]
+ [InlineData(true, false)]
+ [InlineData(false, true)]
+ [InlineData(false, false)]
+ public void MapIf_computes_predicate_T_E_executes_func_conditionally_and_returns_new_result(bool isSuccess, bool condition)
+ {
+ Result result = Result.SuccessIf(isSuccess, T.Value, E.Value);
+
+ Result returned = result.MapIf(GetValuePredicate(condition), GetAction());
+
+ predicateExecuted.Should().Be(isSuccess);
+ actionExecuted.Should().Be(isSuccess && condition);
+ returned.Should().Be(GetExpectedValueErrorResult(isSuccess, condition));
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions/CSharpFunctionalExtensions.csproj b/CSharpFunctionalExtensions/CSharpFunctionalExtensions.csproj
index 31b6bfea..f125cfcf 100644
--- a/CSharpFunctionalExtensions/CSharpFunctionalExtensions.csproj
+++ b/CSharpFunctionalExtensions/CSharpFunctionalExtensions.csproj
@@ -120,6 +120,24 @@
Map.cs
+
+ MapIf.cs
+
+
+ MapIf.Task.cs
+
+
+ MapIf.Task.cs
+
+
+ MapIf.ValueTask.cs
+
+
+ MapIf.ValueTask.cs
+
+
+ MapIf.cs
+
Or.cs
diff --git a/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.Task.Left.cs b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.Task.Left.cs
new file mode 100644
index 00000000..c702d000
--- /dev/null
+++ b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.Task.Left.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Threading.Tasks;
+
+namespace CSharpFunctionalExtensions
+{
+ public static partial class ResultExtensions
+ {
+ public static async Task> MapIf(this Task> resultTask, bool condition, Func func)
+ {
+ var result = await resultTask.DefaultAwait();
+ return result.MapIf(condition, func);
+ }
+
+ public static async Task> MapIf(this Task> resultTask, bool condition, Func func)
+ {
+ var result = await resultTask.DefaultAwait();
+ return result.MapIf(condition, func);
+ }
+
+ public static async Task> MapIf(this Task> resultTask, Func predicate, Func func)
+ {
+ var result = await resultTask.DefaultAwait();
+ return result.MapIf(predicate, func);
+ }
+
+ public static async Task> MapIf(this Task> resultTask, Func predicate, Func func)
+ {
+ var result = await resultTask.DefaultAwait();
+ return result.MapIf(predicate, func);
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.Task.Right.cs b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.Task.Right.cs
new file mode 100644
index 00000000..ec05c65c
--- /dev/null
+++ b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.Task.Right.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Threading.Tasks;
+
+namespace CSharpFunctionalExtensions
+{
+ public static partial class ResultExtensions
+ {
+ public static Task> MapIf(this Result result, bool condition, Func> func)
+ {
+ if (!condition)
+ {
+ return result.AsCompletedTask();
+ }
+
+ return result.Map(func);
+ }
+
+ public static Task> MapIf(this Result result, bool condition, Func> func)
+ {
+ if (!condition)
+ {
+ return result.AsCompletedTask();
+ }
+
+ return result.Map(func);
+ }
+
+ public static Task> MapIf(this Result result, Func predicate, Func> func)
+ {
+ if (!result.IsSuccess || !predicate(result.Value))
+ {
+ return result.AsCompletedTask();
+ }
+
+ return result.Map(func);
+ }
+
+ public static Task> MapIf(this Result result, Func predicate, Func> func)
+ {
+ if (!result.IsSuccess || !predicate(result.Value))
+ {
+ return result.AsCompletedTask();
+ }
+
+ return result.Map(func);
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.Task.cs b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.Task.cs
new file mode 100644
index 00000000..45eb46ac
--- /dev/null
+++ b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.Task.cs
@@ -0,0 +1,32 @@
+using System;
+using System.Threading.Tasks;
+
+namespace CSharpFunctionalExtensions
+{
+ public static partial class ResultExtensions
+ {
+ public static async Task> MapIf(this Task> resultTask, bool condition, Func> func)
+ {
+ var result = await resultTask.DefaultAwait();
+ return await result.MapIf(condition, func).DefaultAwait();
+ }
+
+ public static async Task> MapIf(this Task> resultTask, bool condition, Func> func)
+ {
+ var result = await resultTask.DefaultAwait();
+ return await result.MapIf(condition, func).DefaultAwait();
+ }
+
+ public static async Task> MapIf(this Task> resultTask, Func predicate, Func> func)
+ {
+ var result = await resultTask.DefaultAwait();
+ return await result.MapIf(predicate, func).DefaultAwait();
+ }
+
+ public static async Task> MapIf(this Task> resultTask, Func predicate, Func> func)
+ {
+ var result = await resultTask.DefaultAwait();
+ return await result.MapIf(predicate, func).DefaultAwait();
+ }
+ }
+}
diff --git a/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.ValueTask.Left.cs b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.ValueTask.Left.cs
new file mode 100644
index 00000000..e58fe375
--- /dev/null
+++ b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.ValueTask.Left.cs
@@ -0,0 +1,34 @@
+#if NET5_0_OR_GREATER
+using System;
+using System.Threading.Tasks;
+
+namespace CSharpFunctionalExtensions.ValueTasks
+{
+ public static partial class ResultExtensions
+ {
+ public static async ValueTask> MapIf(this ValueTask> resultTask, bool condition, Func valueTask)
+ {
+ var result = await resultTask;
+ return result.MapIf(condition, valueTask);
+ }
+
+ public static async ValueTask> MapIf(this ValueTask> resultTask, bool condition, Func valueTask)
+ {
+ var result = await resultTask;
+ return result.MapIf(condition, valueTask);
+ }
+
+ public static async ValueTask> MapIf(this ValueTask> resultTask, Func predicate, Func valueTask)
+ {
+ var result = await resultTask;
+ return result.MapIf(predicate, valueTask);
+ }
+
+ public static async ValueTask> MapIf(this ValueTask> resultTask, Func predicate, Func valueTask)
+ {
+ var result = await resultTask;
+ return result.MapIf(predicate, valueTask);
+ }
+ }
+}
+#endif
diff --git a/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.ValueTask.Right.cs b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.ValueTask.Right.cs
new file mode 100644
index 00000000..c8b3e30d
--- /dev/null
+++ b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.ValueTask.Right.cs
@@ -0,0 +1,50 @@
+#if NET5_0_OR_GREATER
+using System;
+using System.Threading.Tasks;
+
+namespace CSharpFunctionalExtensions.ValueTasks
+{
+ public static partial class ResultExtensions
+ {
+ public static ValueTask> MapIf(this Result result, bool condition, Func> valueTask)
+ {
+ if (!condition)
+ {
+ return result.AsCompletedValueTask();
+ }
+
+ return result.Map(valueTask);
+ }
+
+ public static ValueTask> MapIf(this Result result, bool condition, Func> valueTask)
+ {
+ if (!condition)
+ {
+ return result.AsCompletedValueTask();
+ }
+
+ return result.Map(valueTask);
+ }
+
+ public static ValueTask> MapIf(this Result result, Func predicate, Func> valueTask)
+ {
+ if (!result.IsSuccess || !predicate(result.Value))
+ {
+ return result.AsCompletedValueTask();
+ }
+
+ return result.Map(valueTask);
+ }
+
+ public static ValueTask> MapIf(this Result result, Func predicate, Func> valueTask)
+ {
+ if (!result.IsSuccess || !predicate(result.Value))
+ {
+ return result.AsCompletedValueTask();
+ }
+
+ return result.Map(valueTask);
+ }
+ }
+}
+#endif
diff --git a/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.ValueTask.cs b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.ValueTask.cs
new file mode 100644
index 00000000..758c1584
--- /dev/null
+++ b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.ValueTask.cs
@@ -0,0 +1,34 @@
+#if NET5_0_OR_GREATER
+using System;
+using System.Threading.Tasks;
+
+namespace CSharpFunctionalExtensions.ValueTasks
+{
+ public static partial class ResultExtensions
+ {
+ public static async ValueTask> MapIf(this ValueTask> resultTask, bool condition, Func> valueTask)
+ {
+ var result = await resultTask;
+ return await result.MapIf(condition, valueTask);
+ }
+
+ public static async ValueTask> MapIf(this ValueTask> resultTask, bool condition, Func> valueTask)
+ {
+ var result = await resultTask;
+ return await result.MapIf(condition, valueTask);
+ }
+
+ public static async ValueTask> MapIf(this ValueTask> resultTask, Func predicate, Func> valueTask)
+ {
+ var result = await resultTask;
+ return await result.MapIf(predicate, valueTask);
+ }
+
+ public static async ValueTask> MapIf(this ValueTask> resultTask, Func predicate, Func> valueTask)
+ {
+ var result = await resultTask;
+ return await result.MapIf(predicate, valueTask);
+ }
+ }
+}
+#endif
diff --git a/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.cs b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.cs
new file mode 100644
index 00000000..b5b64312
--- /dev/null
+++ b/CSharpFunctionalExtensions/Result/Methods/Extensions/MapIf.cs
@@ -0,0 +1,47 @@
+using System;
+
+namespace CSharpFunctionalExtensions
+{
+ public static partial class ResultExtensions
+ {
+ public static Result MapIf(this Result result, bool condition, Func func)
+ {
+ if (!condition)
+ {
+ return result;
+ }
+
+ return result.Map(func);
+ }
+
+ public static Result MapIf(this Result result, bool condition, Func func)
+ {
+ if (!condition)
+ {
+ return result;
+ }
+
+ return result.Map(func);
+ }
+
+ public static Result MapIf(this Result result, Func predicate, Func func)
+ {
+ if (!result.IsSuccess || !predicate(result.Value))
+ {
+ return result;
+ }
+
+ return result.Map(func);
+ }
+
+ public static Result MapIf(this Result result, Func predicate, Func func)
+ {
+ if (!result.IsSuccess || !predicate(result.Value))
+ {
+ return result;
+ }
+
+ return result.Map(func);
+ }
+ }
+}