Skip to content

Commit 1b13ecc

Browse files
authored
Merge pull request #578 from marcinjahn/allocation-free-maybe-map
feat: add allocation-free overloads of Maybe.Map
2 parents df38cd7 + 9cfd241 commit 1b13ecc

File tree

14 files changed

+247
-20
lines changed

14 files changed

+247
-20
lines changed

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.Task.Left.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,25 @@ public async Task Map_Task_Left_returns_no_value_if_initial_maybe_is_null()
2626

2727
maybe2.HasValue.Should().BeFalse();
2828
}
29+
30+
[Fact]
31+
public async Task Map_Task_Left_provides_context_to_selector()
32+
{
33+
Maybe<T> maybe = T.Value;
34+
var context = 5;
35+
36+
var maybe2 = await maybe
37+
.AsTask()
38+
.Map(
39+
(value, ctx) =>
40+
{
41+
ctx.Should().Be(context);
42+
return value;
43+
},
44+
context
45+
);
46+
47+
maybe2.HasValue.Should().BeTrue();
48+
}
2949
}
30-
}
50+
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.Task.Right.cs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,23 @@ public async Task Map_Task_Right_returns_no_value_if_initial_maybe_is_null()
2626

2727
maybe2.HasValue.Should().BeFalse();
2828
}
29+
30+
[Fact]
31+
public async Task Map_Task_Right_provides_context_to_selector()
32+
{
33+
Maybe<T> maybe = T.Value;
34+
var context = 5;
35+
36+
var maybe2 = await maybe.Map(
37+
(value, ctx) =>
38+
{
39+
ctx.Should().Be(context);
40+
return value.AsTask();
41+
},
42+
context
43+
);
44+
45+
maybe2.HasValue.Should().BeTrue();
46+
}
2947
}
30-
}
48+
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.Task.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,25 @@ public async Task Map_Task_returns_no_value_if_initial_maybe_is_null()
2626

2727
maybe2.HasValue.Should().BeFalse();
2828
}
29+
30+
[Fact]
31+
public async Task Map_Task_provides_context_to_selector()
32+
{
33+
Maybe<T> maybe = T.Value;
34+
var context = 5;
35+
36+
var maybe2 = await maybe
37+
.AsTask()
38+
.Map(
39+
(value, ctx) =>
40+
{
41+
ctx.Should().Be(context);
42+
return value.AsTask();
43+
},
44+
context
45+
);
46+
47+
maybe2.HasValue.Should().BeTrue();
48+
}
2949
}
30-
}
50+
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.ValueTask.Left.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,5 +27,25 @@ public async Task Map_ValueTask_Left_returns_no_value_if_initial_maybe_is_null()
2727

2828
maybe2.HasValue.Should().BeFalse();
2929
}
30+
31+
[Fact]
32+
public async Task Map_ValueTask_Left_provides_context_to_selector()
33+
{
34+
Maybe<T> maybe = T.Value;
35+
var context = 5;
36+
37+
var maybe2 = await maybe
38+
.AsValueTask()
39+
.Map(
40+
(value, ctx) =>
41+
{
42+
ctx.Should().Be(context);
43+
return value;
44+
},
45+
context
46+
);
47+
48+
maybe2.HasValue.Should().BeTrue();
49+
}
3050
}
31-
}
51+
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.ValueTask.Right.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.Threading.Tasks;
2-
using FluentAssertions;
32
using CSharpFunctionalExtensions.ValueTasks;
3+
using FluentAssertions;
44
using Xunit;
55

66
namespace CSharpFunctionalExtensions.Tests.MaybeTests.Extensions
@@ -27,5 +27,23 @@ public async Task Map_ValueTask_Right_returns_no_value_if_initial_maybe_is_null(
2727

2828
maybe2.HasValue.Should().BeFalse();
2929
}
30+
31+
[Fact]
32+
public async Task Map_ValueTask_Right_provides_context_to_selector()
33+
{
34+
Maybe<T> maybe = T.Value;
35+
var context = 5;
36+
37+
var maybe2 = await maybe.Map(
38+
valueTask: (value, ctx) =>
39+
{
40+
ctx.Should().Be(context);
41+
return value.AsValueTask();
42+
},
43+
context
44+
);
45+
46+
maybe2.HasValue.Should().BeTrue();
47+
}
3048
}
31-
}
49+
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.ValueTask.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ public async Task Map_ValueTask_returns_mapped_value()
1212
{
1313
Maybe<T> maybe = T.Value;
1414

15-
var maybe2 = await maybe.AsValueTask().Map(ExpectAndReturn_ValueTask(T.Value, T.Value2));
15+
var maybe2 = await maybe
16+
.AsValueTask()
17+
.Map(ExpectAndReturn_ValueTask(T.Value, T.Value2));
1618

1719
maybe2.HasValue.Should().BeTrue();
1820
maybe2.Value.Should().Be(T.Value2);
@@ -27,5 +29,25 @@ public async Task Map_ValueTask_returns_no_value_if_initial_maybe_is_null()
2729

2830
maybe2.HasValue.Should().BeFalse();
2931
}
32+
33+
[Fact]
34+
public async Task Map_ValueTask_provides_context_to_selector()
35+
{
36+
Maybe<T> maybe = T.Value;
37+
var context = 5;
38+
39+
var maybe2 = await maybe
40+
.AsValueTask()
41+
.Map(
42+
(value, ctx) =>
43+
{
44+
ctx.Should().Be(context);
45+
return value.AsValueTask();
46+
},
47+
context
48+
);
49+
50+
maybe2.HasValue.Should().BeTrue();
51+
}
3052
}
31-
}
53+
}

CSharpFunctionalExtensions.Tests/MaybeTests/Extensions/MapTests.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,23 @@ public void Map_returns_no_value_if_initial_maybe_is_null()
2525

2626
maybe2.HasValue.Should().BeFalse();
2727
}
28+
29+
[Fact]
30+
public void Map_provides_context_to_selector()
31+
{
32+
Maybe<T> maybe = T.Value;
33+
var context = 5;
34+
35+
var maybe2 = maybe.Map(
36+
(value, ctx) =>
37+
{
38+
ctx.Should().Be(context);
39+
return value;
40+
},
41+
context
42+
);
43+
44+
maybe2.HasValue.Should().BeTrue();
45+
}
2846
}
2947
}

CSharpFunctionalExtensions/Maybe/Extensions/Map.Task.Left.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,23 @@ namespace CSharpFunctionalExtensions
55
{
66
public static partial class MaybeExtensions
77
{
8-
public static async Task<Maybe<K>> Map<T, K>(this Task<Maybe<T>> maybeTask, Func<T, K> selector)
8+
public static async Task<Maybe<K>> Map<T, K>(
9+
this Task<Maybe<T>> maybeTask,
10+
Func<T, K> selector
11+
)
912
{
1013
var maybe = await maybeTask.DefaultAwait();
1114
return maybe.Map(selector);
1215
}
16+
17+
public static async Task<Maybe<K>> Map<T, K, TContext>(
18+
this Task<Maybe<T>> maybeTask,
19+
Func<T, TContext, K> selector,
20+
TContext context
21+
)
22+
{
23+
var maybe = await maybeTask.DefaultAwait();
24+
return maybe.Map(selector, context);
25+
}
1326
}
14-
}
27+
}

CSharpFunctionalExtensions/Maybe/Extensions/Map.Task.Right.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,17 @@ public static async Task<Maybe<K>> Map<T, K>(this Maybe<T> maybe, Func<T, Task<K
1212

1313
return await selector(maybe.GetValueOrThrow()).DefaultAwait();
1414
}
15+
16+
public static async Task<Maybe<K>> Map<T, K, TContext>(
17+
this Maybe<T> maybe,
18+
Func<T, TContext, Task<K>> selector,
19+
TContext context
20+
)
21+
{
22+
if (maybe.HasNoValue)
23+
return Maybe<K>.None;
24+
25+
return await selector(maybe.GetValueOrThrow(), context).DefaultAwait();
26+
}
1527
}
16-
}
28+
}

CSharpFunctionalExtensions/Maybe/Extensions/Map.Task.cs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,23 @@ namespace CSharpFunctionalExtensions
55
{
66
public static partial class MaybeExtensions
77
{
8-
public static async Task<Maybe<K>> Map<T, K>(this Task<Maybe<T>> maybeTask, Func<T, Task<K>> selector)
8+
public static async Task<Maybe<K>> Map<T, K>(
9+
this Task<Maybe<T>> maybeTask,
10+
Func<T, Task<K>> selector
11+
)
912
{
1013
var maybe = await maybeTask.DefaultAwait();
1114
return await maybe.Map(selector).DefaultAwait();
1215
}
16+
17+
public static async Task<Maybe<K>> Map<T, K, TContext>(
18+
this Task<Maybe<T>> maybeTask,
19+
Func<T, TContext, Task<K>> selector,
20+
TContext context
21+
)
22+
{
23+
var maybe = await maybeTask.DefaultAwait();
24+
return await maybe.Map(selector, context).DefaultAwait();
25+
}
1326
}
14-
}
27+
}

0 commit comments

Comments
 (0)