tools/code/common/Option.cs (31 lines of code) (raw):
using LanguageExt;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace common;
public static class OptionExtensions
{
/// <summary>
/// If <paramref name="option"/> is Some, execute <paramref name="action"/> on its value.
/// </summary>
public static async ValueTask IterTask<T>(this Option<T> option, Func<T, ValueTask> action) =>
await option.IterTask((t, _) => action(t), CancellationToken.None);
/// <summary>
/// If <paramref name="option"/> is Some, execute <paramref name="action"/> on its value.
/// </summary>
public static async ValueTask IterTask<T>(this Option<T> option, Func<T, CancellationToken, ValueTask> action, CancellationToken cancellationToken) =>
await option.Match(t => action(t, cancellationToken), () => ValueTask.CompletedTask);
/// <summary>
/// If <paramref name="option"/> is Some, apply <paramref name="map"/> to its value and return
/// the <typeparamref name="T2"/> result wrapped in Some. Otherwise, return None of type <typeparamref name="T2"/>.
/// </summary>
public static async ValueTask<Option<T2>> MapTask<T, T2>(this Option<T> option, Func<T, ValueTask<T2>> map) =>
await option.BindTask(async t =>
{
var t2 = await map(t);
return Option<T2>.Some(t2);
});
/// <summary>
/// If <paramref name="option"/> is Some, apply <paramref name="bind"/> to its value and return
/// the result. Otherwise, return None of type <typeparamref name="T2"/>.
/// </summary>
public static async ValueTask<Option<T2>> BindTask<T, T2>(this Option<T> option, Func<T, ValueTask<Option<T2>>> bind) =>
await option.BindTask((t, _) => bind(t), CancellationToken.None);
/// <summary>
/// If <paramref name="option"/> is Some, apply <paramref name="bind"/> to its value and return
/// the result. Otherwise, return None of type <typeparamref name="T2"/>.
/// </summary>
public static async ValueTask<Option<T2>> BindTask<T, T2>(this Option<T> option, Func<T, CancellationToken, ValueTask<Option<T2>>> bind, CancellationToken cancellationToken) =>
await option.Match(t => bind(t, cancellationToken), () => ValueTask.FromResult(Option<T2>.None));
public static async ValueTask<Option<T>> Or<T>(this Option<T> option, Func<ValueTask<Option<T>>> alternative) =>
await option.Match(t => ValueTask.FromResult(Option<T>.Some(t)), alternative);
public static async ValueTask<Option<T>> Or<T>(this ValueTask<Option<T>> optionTask, Func<ValueTask<Option<T>>> alternative)
{
var option = await optionTask;
return await option.Or(alternative);
}
}