Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.7.2" />
<PackageVersion Include="NSubstitute" Version="5.1.0" />
<PackageVersion Include="NSubstitute.Analyzers.CSharp" Version="1.0.16" />
<PackageVersion Include="Rnd" Version="8.4.7" />
<PackageVersion Include="xunit" Version="2.5.1" />
<PackageVersion Include="xunit.assert" Version="2.5.1" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.1" />
<PackageVersion Include="Rnd" Version="8.4.8" />
<PackageVersion Include="xunit" Version="2.5.3" />
<PackageVersion Include="xunit.assert" Version="2.5.3" />
<PackageVersion Include="xunit.runner.visualstudio" Version="2.5.3" />
</ItemGroup>
</Project>
2 changes: 1 addition & 1 deletion Version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
9.3.6
9.3.7
36 changes: 36 additions & 0 deletions src/MaybeF/Functions/F.IfSomeNotNull.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// Maybe: .NET Monad.
// Copyright (c) bfren - licensed under https://mit.bfren.dev/2019

using System.Diagnostics.CodeAnalysis;

namespace MaybeF;

public static partial class F
{
/// <summary>
/// Delegate action to inform the compiler that a value is not null
/// </summary>
/// <typeparam name="T">Maybe value type</typeparam>
/// <param name="value">Value object (not null)</param>
public delegate void SomeNotNull<T>([NotNull] T value);

/// <summary>
/// Run <paramref name="ifSomeNotNull"/> if <paramref name="maybe"/> is a <see cref="MaybeF.Some{T}"/>
/// and the inner value is not null, and returns the original <paramref name="maybe"/>
/// </summary>
/// <typeparam name="T">Maybe value type</typeparam>
/// <param name="maybe">Input Maybe</param>
/// <param name="ifSomeNotNull">Will receive <see cref="Some{T}.Value"/> if this is a <see cref="MaybeF.Some{T}"/></param>
public static Maybe<T> IfSomeNotNull<T>(Maybe<T> maybe, SomeNotNull<T> ifSomeNotNull) =>
Catch(() =>
{
if (maybe is Some<T> some && some.Value is T value)
{
ifSomeNotNull(value);
}

return maybe;
},
DefaultHandler
);
}
35 changes: 35 additions & 0 deletions src/MaybeF/Functions/F.IfSomeNotNullAsync.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Maybe: .NET Monad.
// Copyright (c) bfren - licensed under https://mit.bfren.dev/2019

using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;

namespace MaybeF;

public static partial class F
{
/// <summary>
/// Delegate async function to inform the compiler that a value is not null
/// </summary>
/// <typeparam name="T">Maybe value type</typeparam>
/// <param name="value">Value object (not null)</param>
public delegate Task SomeNotNullAsync<T>([NotNull] T value);

/// <inheritdoc cref="IfSomeNotNull{T}(Maybe{T}, SomeNotNull{T})"/>
public static Task<Maybe<T>> IfSomeNotNullAsync<T>(Maybe<T> maybe, SomeNotNullAsync<T> ifSomeNotNull) =>
CatchAsync(async () =>
{
if (maybe is Some<T> some && some.Value is T value)
{
await ifSomeNotNull(value).ConfigureAwait(false);
}

return maybe;
},
DefaultHandler
);

/// <inheritdoc cref="IfSomeNotNull{T}(Maybe{T}, SomeNotNull{T})"/>
public static async Task<Maybe<T>> IfSomeNotNullAsync<T>(Task<Maybe<T>> maybe, SomeNotNullAsync<T> ifSomeNotNull) =>
await IfSomeNotNullAsync(await maybe.ConfigureAwait(false), ifSomeNotNull).ConfigureAwait(false);
}
14 changes: 14 additions & 0 deletions src/MaybeF/Functions/F.SwitchAsync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,20 @@ namespace MaybeF;

public static partial class F
{
/// <inheritdoc cref="Switch{T, TReturn}(Maybe{T}, Func{T, Maybe{TReturn}}, Func{Maybe{TReturn}})"/>
public static Task SwitchAsync<T>(Maybe<T> maybe, Func<T, Task> some, Func<IMsg, Task> none) =>
maybe switch
{
Some<T> x when some is not null =>
some(x.Value),

None<T> y when none is not null =>
none(y.Reason),

_ =>
Task.CompletedTask
};

/// <inheritdoc cref="Switch{T, TReturn}(Maybe{T}, Func{T, TReturn}, Func{IMsg, TReturn})"/>
public static Task<TReturn> SwitchAsync<T, TReturn>(Maybe<T> maybe, Func<T, Task<TReturn>> some, Func<IMsg, Task<TReturn>> none) =>
Switch(maybe, some, none);
Expand Down
4 changes: 4 additions & 0 deletions src/MaybeF/Maybe.cs
Original file line number Diff line number Diff line change
Expand Up @@ -364,6 +364,10 @@ public Maybe<TReturn> Switch<TReturn>(Func<T, Maybe<TReturn>> some, Func<Maybe<T
public Task<TReturn> SwitchAsync<TReturn>(Func<T, Task<TReturn>> some, TReturn none) =>
F.SwitchAsync(this, some, none: _ => Task.FromResult(none));

/// <inheritdoc cref="F.SwitchAsync{T}(Maybe{T}, Func{T, Task}, Func{IMsg, Task})"/>
public Task SwitchAsync(Func<T, Task> some, Func<IMsg, Task> none) =>
F.SwitchAsync(this, some, none);

/// <inheritdoc cref="F.SwitchAsync{T, TReturn}(Maybe{T}, Func{T, Task{TReturn}}, Func{IMsg, Task{TReturn}})"/>
public Task<TReturn> SwitchAsync<TReturn>(Func<T, TReturn> some, Task<TReturn> none) =>
F.SwitchAsync(this, some: (T v) => Task.FromResult(some(v)), none: _ => none);
Expand Down
2 changes: 1 addition & 1 deletion tests/Tests.MaybeF/_/Maybe/ToString_Tests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Maybe: Unit Tests
// Maybe: Unit Tests
// Copyright (c) bfren - licensed under https://mit.bfren.dev/2019

namespace MaybeF.Maybe_Tests;
Expand Down