Added Map and MapError
All checks were successful
.NET / build (push) Successful in 34s

This commit is contained in:
2025-08-18 09:59:04 -04:00
parent d2fe7edbce
commit 77396d252e
16 changed files with 1590 additions and 1490 deletions

View File

@@ -8,7 +8,7 @@
<PropertyGroup> <PropertyGroup>
<PackageId>MaybeError</PackageId> <PackageId>MaybeError</PackageId>
<Version>1.1.0</Version> <Version>1.2.0</Version>
<Authors>Amatsugu</Authors> <Authors>Amatsugu</Authors>
<PackageDescription>Errors as values</PackageDescription> <PackageDescription>Errors as values</PackageDescription>
<RepositoryUrl>https://github.com/Amatsugu/MaybeError</RepositoryUrl> <RepositoryUrl>https://github.com/Amatsugu/MaybeError</RepositoryUrl>

View File

@@ -37,6 +37,20 @@ public static class MaybeExtensions
return predicate(maybe.Value); return predicate(maybe.Value);
} }
public static ValueMaybe<T2, E> Map<T, T2, E>(this IValueMaybe<T, E> maybe, Func<T, T2> map) where T : struct where T2 : struct where E : Error
{
if (maybe.HasError)
return maybe.Error;
return map(maybe.Value);
}
public static ValueMaybe<T, E2> MapError<T, E, E2>(this IValueMaybe<T, E> maybe, Func<E, E2> map) where T : struct where E : Error where E2 : Error
{
if (!maybe.HasError)
return maybe.Value;
return map(maybe.Error);
}
public static T ValueOrDefault<T, E>(this IMaybe<T, E> maybe, T defaultValue) where E : Error public static T ValueOrDefault<T, E>(this IMaybe<T, E> maybe, T defaultValue) where E : Error
{ {
@@ -71,4 +85,18 @@ public static class MaybeExtensions
return predicate(maybe.Value); return predicate(maybe.Value);
} }
public static Maybe<T2, E> Map<T, T2, E>(this IMaybe<T, E> maybe, Func<T, T2> map) where E : Error
{
if (maybe.HasError)
return maybe.Error;
return map(maybe.Value);
}
public static Maybe<T, E2> MapError<T, E, E2>(this IMaybe<T, E> maybe, Func<E, E2> map) where E : Error where E2 : Error
{
if (!maybe.HasError)
return maybe.Value;
return map(maybe.Error);
}
} }

View File

@@ -115,4 +115,40 @@ public class MaybeTests
value = new InvalidOperationException(); value = new InvalidOperationException();
Assert.That(value.AsOrDefault(v => v.Length, -4), Is.EqualTo(-4)); Assert.That(value.AsOrDefault(v => v.Length, -4), Is.EqualTo(-4));
} }
[Test]
public void MapTest()
{
Maybe<string> value = "Test";
var valueMapped = value.Map(v => $"A{v}");
Assert.That(valueMapped.HasValue, Is.True);
Assert.That(valueMapped.Value, Is.EqualTo("ATest"));
}
[Test]
public void MapTestError()
{
Maybe<string> value = new Error("Err");
var valueMapped = value.Map(v => $"A{v}");
Assert.That(valueMapped.HasError, Is.True);
}
[Test]
public void MapErrorTest()
{
Maybe<string> value = "Test";
var valueMapped = value.MapError(v => new Error($"A{v}"));
Assert.That(valueMapped.HasValue, Is.True);
Assert.That(valueMapped.Value, Is.EqualTo("Test"));
}
[Test]
public void MapErrorTestError()
{
Maybe<string> value = new Error("Err");
var valueMapped = value.MapError(v => new Error($"A{v.Message}"));
Assert.That(valueMapped.HasError, Is.True);
Assert.That(valueMapped.Error!.Message, Is.EqualTo("AErr"));
}
} }

View File

@@ -115,4 +115,40 @@ public class ValueMaybeTests
value = new InvalidOperationException(); value = new InvalidOperationException();
Assert.That(value.AsOrDefault(v => v.ToString(), "err"), Is.EqualTo("err")); Assert.That(value.AsOrDefault(v => v.ToString(), "err"), Is.EqualTo("err"));
} }
[Test]
public void MapTest()
{
ValueMaybe<int> value = 1;
var valueMapped = value.Map(v => v + 1);
Assert.That(valueMapped.HasValue, Is.True);
Assert.That(valueMapped.Value, Is.EqualTo(2));
}
[Test]
public void MapTestError()
{
ValueMaybe<int> value = new Error("Err");
var valueMapped = value.Map(v => v + 1);
Assert.That(valueMapped.HasError, Is.True);
}
[Test]
public void MapErrorTest()
{
Maybe<int> value = 1;
var valueMapped = value.MapError(v => new Error($"A{v}"));
Assert.That(valueMapped.HasValue, Is.True);
Assert.That(valueMapped.Value, Is.EqualTo(1));
}
[Test]
public void MapErrorTestError()
{
ValueMaybe<int> value = new Error("Err");
var valueMapped = value.MapError(v => new Error($"A{v.Message}"));
Assert.That(valueMapped.HasError, Is.True);
Assert.That(valueMapped.Error!.Message, Is.EqualTo("AErr"));
}
} }