Skip to content

Commit df38cd7

Browse files
authored
Merge pull request #577 from marcinjahn/allocation-free-maybe-bind-async
feat: add allocation-free overloads to async Maybe.Bind
2 parents b0b37fe + dfb74d2 commit df38cd7

File tree

13 files changed

+414
-14
lines changed

13 files changed

+414
-14
lines changed

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,63 @@ public async Task Bind_Task_Left_returns_value_if_selector_returns_value()
3636
maybe2.HasValue.Should().BeTrue();
3737
maybe2.Value.Should().Be(T.Value2);
3838
}
39+
40+
[Fact]
41+
public async Task Bind_Task_Left_provides_context_to_selector()
42+
{
43+
Maybe<T> maybe = T.Value;
44+
var context = 5;
45+
46+
var maybe2 = await maybe.AsTask().Bind(
47+
(value, ctx) =>
48+
{
49+
ctx.Should().Be(context);
50+
return Maybe.From(value);
51+
},
52+
context
53+
);
54+
55+
maybe2.HasValue.Should().BeTrue();
56+
}
57+
58+
[Fact]
59+
public async Task Bind_Task_Left_with_context_returns_no_value_if_initial_maybe_is_null()
60+
{
61+
Maybe<T> maybe = null;
62+
63+
var maybe2 = await maybe.AsTask().Bind(
64+
(value, _) => ExpectAndReturnMaybe(null, T.Value)(value),
65+
context: 5
66+
);
67+
68+
maybe2.HasValue.Should().BeFalse();
69+
}
70+
71+
[Fact]
72+
public async Task Bind_Task_Left_with_context_returns_no_value_if_selector_returns_null()
73+
{
74+
Maybe<T> maybe = T.Value;
75+
76+
var maybe2 = await maybe.AsTask().Bind(
77+
(value, _) => ExpectAndReturn(T.Value, Maybe<T>.None)(value),
78+
context: 5
79+
);
80+
81+
maybe2.HasValue.Should().BeFalse();
82+
}
83+
84+
[Fact]
85+
public async Task Bind_Task_Left_with_context_returns_value_if_selector_returns_value()
86+
{
87+
Maybe<T> maybe = T.Value;
88+
89+
var maybe2 = await maybe.AsTask().Bind(
90+
(value, _) => ExpectAndReturnMaybe<T>(T.Value, T.Value)(value),
91+
5
92+
);
93+
94+
maybe2.HasValue.Should().BeTrue();
95+
maybe2.Value.Should().Be(T.Value);
96+
}
3997
}
40-
}
98+
}

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,63 @@ public async Task Bind_Task_Right_returns_value_if_selector_returns_value()
3636
maybe2.HasValue.Should().BeTrue();
3737
maybe2.Value.Should().Be(T.Value2);
3838
}
39+
40+
[Fact]
41+
public async Task Bind_Task_Right_provides_context_to_selector()
42+
{
43+
Maybe<T> maybe = T.Value;
44+
var context = 5;
45+
46+
var maybe2 = await maybe.Bind(
47+
(value, ctx) =>
48+
{
49+
ctx.Should().Be(context);
50+
return Maybe.From(value).AsTask();
51+
},
52+
context
53+
);
54+
55+
maybe2.HasValue.Should().BeTrue();
56+
}
57+
58+
[Fact]
59+
public async Task Bind_Task_Right_with_context_returns_no_value_if_initial_maybe_is_null()
60+
{
61+
Maybe<T> maybe = null;
62+
63+
var maybe2 = await maybe.Bind(
64+
(value, _) => ExpectAndReturnMaybe_Task(null, T.Value)(value),
65+
context: 5
66+
);
67+
68+
maybe2.HasValue.Should().BeFalse();
69+
}
70+
71+
[Fact]
72+
public async Task Bind_Task_Right_with_context_returns_no_value_if_selector_returns_null()
73+
{
74+
Maybe<T> maybe = T.Value;
75+
76+
var maybe2 = await maybe.Bind(
77+
(value, _) => ExpectAndReturn_Task(T.Value, Maybe<T>.None)(value),
78+
context: 5
79+
);
80+
81+
maybe2.HasValue.Should().BeFalse();
82+
}
83+
84+
[Fact]
85+
public async Task Bind_Task_Right_with_context_returns_value_if_selector_returns_value()
86+
{
87+
Maybe<T> maybe = T.Value;
88+
89+
var maybe2 = await maybe.Bind(
90+
(value, _) => ExpectAndReturnMaybe_Task<T>(T.Value, T.Value)(value),
91+
5
92+
);
93+
94+
maybe2.HasValue.Should().BeTrue();
95+
maybe2.Value.Should().Be(T.Value);
96+
}
3997
}
40-
}
98+
}

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,63 @@ public async Task Bind_Task_returns_value_if_selector_returns_value()
3636
maybe2.HasValue.Should().BeTrue();
3737
maybe2.Value.Should().Be(T.Value);
3838
}
39+
40+
[Fact]
41+
public async Task Bind_Task_provides_context_to_selector()
42+
{
43+
Maybe<T> maybe = T.Value;
44+
var context = 5;
45+
46+
var maybe2 = await maybe.AsTask().Bind(
47+
(value, ctx) =>
48+
{
49+
ctx.Should().Be(context);
50+
return Maybe.From(value).AsTask();
51+
},
52+
context
53+
);
54+
55+
maybe2.HasValue.Should().BeTrue();
56+
}
57+
58+
[Fact]
59+
public async Task Bind_Task_with_context_returns_no_value_if_initial_maybe_is_null()
60+
{
61+
Maybe<T> maybe = null;
62+
63+
var maybe2 = await maybe.AsTask().Bind(
64+
(value, _) => ExpectAndReturnMaybe_Task(null, T.Value)(value),
65+
context: 5
66+
);
67+
68+
maybe2.HasValue.Should().BeFalse();
69+
}
70+
71+
[Fact]
72+
public async Task Bind_Task_with_context_returns_no_value_if_selector_returns_null()
73+
{
74+
Maybe<T> maybe = T.Value;
75+
76+
var maybe2 = await maybe.AsTask().Bind(
77+
(value, _) => ExpectAndReturn_Task(T.Value, Maybe<T>.None)(value),
78+
context: 5
79+
);
80+
81+
maybe2.HasValue.Should().BeFalse();
82+
}
83+
84+
[Fact]
85+
public async Task Bind_Task_with_context_returns_value_if_selector_returns_value()
86+
{
87+
Maybe<T> maybe = T.Value;
88+
89+
var maybe2 = await maybe.AsTask().Bind(
90+
(value, _) => ExpectAndReturnMaybe_Task<T>(T.Value, T.Value)(value),
91+
5
92+
);
93+
94+
maybe2.HasValue.Should().BeTrue();
95+
maybe2.Value.Should().Be(T.Value);
96+
}
3997
}
40-
}
98+
}

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,63 @@ public async Task Bind_ValueTask_Left_returns_value_if_selector_returns_value()
3737
maybe2.HasValue.Should().BeTrue();
3838
maybe2.Value.Should().Be(T.Value2);
3939
}
40+
41+
[Fact]
42+
public async Task Bind_ValueTask_Left_provides_context_to_selector()
43+
{
44+
Maybe<T> maybe = T.Value;
45+
var context = 5;
46+
47+
var maybe2 = await maybe.AsValueTask().Bind(
48+
(value, ctx) =>
49+
{
50+
ctx.Should().Be(context);
51+
return Maybe.From(value);
52+
},
53+
context
54+
);
55+
56+
maybe2.HasValue.Should().BeTrue();
57+
}
58+
59+
[Fact]
60+
public async Task Bind_ValueTask_Left_with_context_returns_no_value_if_initial_maybe_is_null()
61+
{
62+
Maybe<T> maybe = null;
63+
64+
var maybe2 = await maybe.AsValueTask().Bind(
65+
(value, _) => ExpectAndReturnMaybe(null, T.Value)(value),
66+
context: 5
67+
);
68+
69+
maybe2.HasValue.Should().BeFalse();
70+
}
71+
72+
[Fact]
73+
public async Task Bind_ValueTask_Left_with_context_returns_no_value_if_selector_returns_null()
74+
{
75+
Maybe<T> maybe = T.Value;
76+
77+
var maybe2 = await maybe.AsValueTask().Bind(
78+
(value, _) => ExpectAndReturn(T.Value, Maybe<T>.None)(value),
79+
context: 5
80+
);
81+
82+
maybe2.HasValue.Should().BeFalse();
83+
}
84+
85+
[Fact]
86+
public async Task Bind_ValueTask_Left_with_context_returns_value_if_selector_returns_value()
87+
{
88+
Maybe<T> maybe = T.Value;
89+
90+
var maybe2 = await maybe.AsValueTask().Bind(
91+
(value, _) => ExpectAndReturnMaybe<T>(T.Value, T.Value)(value),
92+
5
93+
);
94+
95+
maybe2.HasValue.Should().BeTrue();
96+
maybe2.Value.Should().Be(T.Value);
97+
}
4098
}
41-
}
99+
}

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,63 @@ public async Task Bind_ValueTask_Right_returns_value_if_selector_returns_value()
3737
maybe2.HasValue.Should().BeTrue();
3838
maybe2.Value.Should().Be(T.Value2);
3939
}
40+
41+
[Fact]
42+
public async Task Bind_ValueTask_Right_provides_context_to_selector()
43+
{
44+
Maybe<T> maybe = T.Value;
45+
var context = 5;
46+
47+
var maybe2 = await maybe.Bind(
48+
(value, ctx) =>
49+
{
50+
ctx.Should().Be(context);
51+
return Maybe.From(value).AsTask();
52+
},
53+
context
54+
);
55+
56+
maybe2.HasValue.Should().BeTrue();
57+
}
58+
59+
[Fact]
60+
public async Task Bind_ValueTask_Right_with_context_returns_no_value_if_initial_maybe_is_null()
61+
{
62+
Maybe<T> maybe = null;
63+
64+
var maybe2 = await maybe.Bind(
65+
(value, _) => ExpectAndReturnMaybe_ValueTask(null, T.Value)(value),
66+
context: 5
67+
);
68+
69+
maybe2.HasValue.Should().BeFalse();
70+
}
71+
72+
[Fact]
73+
public async Task Bind_ValueTask_Right_with_context_returns_no_value_if_selector_returns_null()
74+
{
75+
Maybe<T> maybe = T.Value;
76+
77+
var maybe2 = await maybe.Bind(
78+
(value, _) => ExpectAndReturn_ValueTask(T.Value, Maybe<T>.None)(value),
79+
context: 5
80+
);
81+
82+
maybe2.HasValue.Should().BeFalse();
83+
}
84+
85+
[Fact]
86+
public async Task Bind_ValueTask_Right_with_context_returns_value_if_selector_returns_value()
87+
{
88+
Maybe<T> maybe = T.Value;
89+
90+
var maybe2 = await maybe.Bind(
91+
(value, _) => ExpectAndReturnMaybe_ValueTask<T>(T.Value, T.Value)(value),
92+
5
93+
);
94+
95+
maybe2.HasValue.Should().BeTrue();
96+
maybe2.Value.Should().Be(T.Value);
97+
}
4098
}
41-
}
99+
}

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

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,63 @@ public async Task Bind_ValueTask_returns_value_if_selector_returns_value()
3737
maybe2.HasValue.Should().BeTrue();
3838
maybe2.Value.Should().Be(T.Value);
3939
}
40+
41+
[Fact]
42+
public async Task Bind_ValueTask_provides_context_to_selector()
43+
{
44+
Maybe<T> maybe = T.Value;
45+
var context = 5;
46+
47+
var maybe2 = await maybe.AsValueTask().Bind(
48+
(value, ctx) =>
49+
{
50+
ctx.Should().Be(context);
51+
return Maybe.From(value).AsValueTask();
52+
},
53+
context
54+
);
55+
56+
maybe2.HasValue.Should().BeTrue();
57+
}
58+
59+
[Fact]
60+
public async Task Bind_ValueTask_with_context_returns_no_value_if_initial_maybe_is_null()
61+
{
62+
Maybe<T> maybe = null;
63+
64+
var maybe2 = await maybe.AsValueTask().Bind(
65+
(value, _) => ExpectAndReturnMaybe_ValueTask(null, T.Value)(value),
66+
context: 5
67+
);
68+
69+
maybe2.HasValue.Should().BeFalse();
70+
}
71+
72+
[Fact]
73+
public async Task Bind_ValueTask_with_context_returns_no_value_if_selector_returns_null()
74+
{
75+
Maybe<T> maybe = T.Value;
76+
77+
var maybe2 = await maybe.AsValueTask().Bind(
78+
(value, _) => ExpectAndReturn_ValueTask(T.Value, Maybe<T>.None)(value),
79+
context: 5
80+
);
81+
82+
maybe2.HasValue.Should().BeFalse();
83+
}
84+
85+
[Fact]
86+
public async Task Bind_ValueTask_with_context_returns_value_if_selector_returns_value()
87+
{
88+
Maybe<T> maybe = T.Value;
89+
90+
var maybe2 = await maybe.AsValueTask().Bind(
91+
(value, _) => ExpectAndReturnMaybe_ValueTask<T>(T.Value, T.Value)(value),
92+
5
93+
);
94+
95+
maybe2.HasValue.Should().BeTrue();
96+
maybe2.Value.Should().Be(T.Value);
97+
}
4098
}
41-
}
99+
}

0 commit comments

Comments
 (0)